我正在开发的应用中的一个屏幕有多个子屏幕,实现为由底部导航栏控制的片段。
这是我的用户希望切换片段的代码:
protected final void switchTab(int index) {
if (curTabIndex == index) {
return;
}
if (bottomNavigationBar.getCurrentTabPosition() != index) {
bottomNavigationBar.selectTabAtPosition(index, true);
}
curTabIndex = index;
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.alpha_in, R.anim.alpha_out);
detachCurrentFragment(ft);
// Attempt to reattach previous fragment.
BottomTabbedActivityFragment fragment = reattachExistingFragment(ft);
if (fragment != null) {
ft.commit();
} else {
fragment = fragments.get(curTabIndex);
ft.add(contentContainer.getId(), fragment, (fragment.getClass().getName()));
ft.commit();
}
fragmentManager.executePendingTransactions();
curFragment = fragment;
}
/**
* Attemps to detach any current fragment if it exists, and if none is found, returns;
*
* @param ft the current transaction being performed
*/
private void detachCurrentFragment(FragmentTransaction ft) {
// Attempt to detach current fragment.
if (curFragment != null) {
ft.hide(curFragment);
}
}
/**
* Will attempt to reattach a previous fragment in the FragmentManager, or return null if not able to,
*
* @param ft current fragment transaction
* @return Fragment if we were able to find and reattach it
*/
@Nullable
private BottomTabbedActivityFragment reattachExistingFragment(FragmentTransaction ft) {
Fragment fragment = fragmentManager.findFragmentByTag(fragments.get(curTabIndex).getTag());
if (fragment != null) {
ft.show(fragment);
}
return (BottomTabbedActivityFragment) fragment;
}
使用上面的代码段,我可以顺畅地切换片段。但是,这种方法存在一个很大的问题:添加的las片段尽管被隐藏但仍保留用户输入。
换句话说,我的用户说这个改变顺序:
Subscreen A
- >Subscreen B
- >Subscreen C
- >Subscreen A
逻辑上,输入现在由Subscreen A
处理,因为Subscreen C
现在已隐藏。但事实却说不然:Subscreen C
仍然是接收用户输入的人。
尝试在Subscreen C
中滚动时,我甚至可以看到显示Subsreen A
的一些小故障。
无论如何我可以解决这个问题吗?
p.s。 ,我现在拥有的那些子屏幕重新初始化非常昂贵。它们都具有复杂的视图层次结构,用户需要在它们之间切换很多。我尝试了attach()
/ detach()
,但在我的测试中变得非常慢。
答案 0 :(得分:0)
只需将android:clickable="true"
放入片段布局文件中的根视图。