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;