隐藏的片段仍然接收用户输入

时间:2016-04-20 09:26:13

标签: android android-fragments

我正在开发的应用中的一个屏幕有多个子屏幕,实现为由底部导航栏控制的片段。

这是我的用户希望切换片段的代码:

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(),但在我的测试中变得非常慢。

1 个答案:

答案 0 :(得分:0)

只需将android:clickable="true"放入片段布局文件中的根视图。