Android 如何在ListView单击时动态替换片段?

Android 如何在ListView单击时动态替换片段?,android,listview,android-fragments,Android,Listview,Android Fragments,我的应用程序在左侧有一个列表视图,充当菜单。通过单击列表项,我可以动态地替换片段。目前,这只适用于特定的情况 看看我的回调方法,它负责替换: public void onNavigationDrawerFragmentItemSelected(int position) { switch(position) { case 0: if(!mTwoPanelsUsed) { getFragmentManager().b

我的应用程序在左侧有一个列表视图,充当菜单。通过单击列表项,我可以动态地替换片段。目前,这只适用于特定的情况

看看我的回调方法,它负责替换:

public void onNavigationDrawerFragmentItemSelected(int position) {

    switch(position) {
        case 0:
            if(!mTwoPanelsUsed) {
                getFragmentManager().beginTransaction().replace(R.id.content_frame, mListFragment).addToBackStack(null).commit();
            } else {
                findViewById(R.id.container_2).setVisibility(View.VISIBLE);
                getFragmentManager().beginTransaction()
                        .replace(R.id.container_1, mListFragment)
                        .replace(R.id.container_2, mDetailsFragment)
                        .addToBackStack(null).commit();
            }
            break;
        case 1:
            if(!mTwoPanelsUsed) {
                getFragmentManager().beginTransaction().replace(R.id.content_frame, mRecordFragment).addToBackStack(null).commit();
            } else {
                getFragmentManager().beginTransaction().replace(R.id.container_1, mRecordFragment).addToBackStack(null).commit();
                findViewById(R.id.container_2).setVisibility(View.INVISIBLE);
            }
            break;
        case 2:
            if(!mTwoPanelsUsed) {
                getFragmentManager().beginTransaction().replace(R.id.content_frame, mSettingsFragment).addToBackStack(null).commit();
            } else {
                getFragmentManager().beginTransaction().replace(R.id.container_1, mSettingsFragment).addToBackStack(null).commit();
                findViewById(R.id.container_2).setVisibility(View.GONE);
            }
            break;
        case 3:
            if(!mTwoPanelsUsed) {
                getFragmentManager().beginTransaction().replace(R.id.content_frame, mAboutFragment).addToBackStack(null).commit();
            } else {
                getFragmentManager().beginTransaction().replace(R.id.container_1, mAboutFragment).addToBackStack(null).commit();
                findViewById(R.id.container_2).setVisibility(View.GONE);
            }
            break;
        default:
            break;
    }

}
除了第0种情况外,一切正常。这一次只起作用。在我更改为另一个片段后,容器_1的mListFragment不会显示。屏幕上只有一个白色区域

这是我的布局xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:divider="?android:attr/dividerHorizontal"
    android:orientation="horizontal"
    android:showDividers="middle"
    android:id="@+id/recording_view"
    tools:context=".RecordingListActivity">

    <!-- static drawer navigation -->
    <fragment
        android:id="@+id/navigation_drawer"
        android:layout_width="180dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.iav.viraprecorder.NavigationDrawerFragment"
        tools:layout="@layout/fragment_navigation_drawer"/>

    <!-- dynamic content -->
    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:id="@+id/container_1"></FrameLayout>

    <!-- dynamic content -->
    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:id="@+id/container_2"></FrameLayout>

</LinearLayout>

我不确定这是否有帮助,但我怀疑您是否会监督container1的可见性设置

  case 0:
        if(!mTwoPanelsUsed) {
            getFragmentManager().beginTransaction().replace(R.id.content_frame, mListFragment).addToBackStack(null).commit();
        } else {
            findViewById(R.id.container_2).setVisibility(View.VISIBLE);
            findViewById(R.id.container_1).setVisibility(View.VISIBLE);
            getFragmentManager().beginTransaction()
                    .replace(R.id.container_1, mListFragment)
                    .replace(R.id.container_2, mDetailsFragment)
                    .addToBackStack(null).commit();
        }
        break;

如果这不起作用,请告诉我。

您想要右侧导航抽屉吗?我在左侧有导航抽屉作为菜单。在此旁边有一个“录制”列表,在此列表旁边是所选录制的详细信息视图(案例0)。我想恢复录音列表,它放在容器_1(中间)中。如果你放了截图,那么理解这个问题将非常有用,所以我添加了一些截图!执行什么?在平板电脑上,案例0?的if循环或else循环执行else部分。这就是我目前正在研究的问题。看看我提交的屏幕截图。你能发布mListFragment的代码吗?为什么每次选择第一项时,你都没有用mListFragment的新实例替换容器_1?你是否每次都尝试用RecordingListFragment的新实例替换容器_1项目是否已选定?
  case 0:
        if(!mTwoPanelsUsed) {
            getFragmentManager().beginTransaction().replace(R.id.content_frame, mListFragment).addToBackStack(null).commit();
        } else {
            findViewById(R.id.container_2).setVisibility(View.VISIBLE);
            findViewById(R.id.container_1).setVisibility(View.VISIBLE);
            getFragmentManager().beginTransaction()
                    .replace(R.id.container_1, mListFragment)
                    .replace(R.id.container_2, mDetailsFragment)
                    .addToBackStack(null).commit();
        }
        break;