0

我正在使用 ActionBarSherlock 编写一个 android 应用程序

我的布局文件是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <FrameLayout 
        android:id="@+id/fragment_menu"
        android:layout_width="@dimen/menu_size"
        android:layout_height="wrap_content"/>

    <FrameLayout 
        android:id="@+id/dummy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

根据在菜单片段中选择的类别,我替换了虚拟 FrameLayout.Eg 中的片段:

 Bundle extras = new Bundle();
    extras.putInt(ProgramDetailFrament.EXTRA_PROGRAM_ID, programId);
    final ProgramDetailFrament fragment = ProgramDetailFrament.newInstance(extras);

    getSupportFragmentManager().beginTransaction()
        .replace(R.id.dummy, fragment)
        .addToBackStack(null)
        .commit();
    getSupportFragmentManager().executePendingTransactions();   

但是当我与可见片段交互时,被替换的片段仍然会收到触摸/点击事件。不知道SherlockFragment是否和这个问题有关?

我通过在可见片段的根布局上设置点击事件解决了这个问题,并且在这个事件中什么都不做。但这似乎是一个丑陋的解决方案。

任何人都知道如何解决它。提前致谢。

4

2 回答 2

0

您实际上需要使用replace函数而不是add。您正在做的是在另一个片段之上添加一个片段,因此您正在创建一堆仍然可见的片段,只是您看不到它们,因为顶部片段覆盖了所有其他片段。

使用替换而不是添加:

getSupportFragmentManager().beginTransaction()
    .replace(R.id.dummy, fragment)
    .addToBackStack(null)
    .commit();
getSupportFragmentManager().executePendingTransactions(); 

这将删除虚拟容器中的所有其他片段并添加您选择的片段。

于 2013-10-25T08:54:46.390 回答
0

正如您在问题中所述,您正在尝试将Fragment替换为另一个,因此您应该使用FragmentTransaction 的 replace 方法

大致方法如下:

Bundle extras = new Bundle();
extras.putInt(ProgramDetailFrament.EXTRA_PROGRAM_ID, programId);
ProgramDetailFrament fragment = ProgramDetailFrament.newInstance(extras);

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.id_of_fragment_container, fragment, DETAIL_FRAGMENT_TAG);
ft.commit();

我希望这有帮助 ;-)

于 2013-10-25T08:32:51.673 回答