我尝试使用具有NavigationDrawer
的平板电脑和智能手机的不同布局的主/详细视图。
我使用AndroidStudio中的NavigationDrawer模板:从侧面菜单打开的每个页面都作为Frament。它在MainActivity中被替换为一个Frame Layout(称为window_container
)。
因此,来自侧边菜单的每个页面都是MainActivity中的片段,而不是独立的Activity 。这让我很头疼。
谷歌推荐做类似的事情: 我们有两个包含片段的活动。 但我对所有窗口只有一个活动,每个窗口只有一个片段!
我也是这样的: 只有一个活动和详细信息视图与主视图重新复制。这离我更近了。
我使用导航抽屉中的碎片作为主要和细节碎片的base
碎片。它就像他们的活动一样:
它有一个接口,所以子framgnets可以与它交互,例如 - 调用方法来显示详细视图。
我在Master和Detail视图中引用了我的基本片段:
public void onCreate()
{
...
my_base_fragment = (IMyBaseFragment)getParentFragment.
}
还有一个问题。当我在基础片段中使用getFragmentManager
时,getParentFragment
会返回null
。所以我使用getChildFragmentManager
并且没关系。
所以,我对片段的工作看起来像这样:
window_container
。 (重要 - 这让我很麻烦)。此方法称为AddFramgnet
。为什么我需要这个?例如,我有主\详细视图,并希望显示一些新窗口。
我使用嵌套片段和getChildFragmentManager
。所以,它有独立的backstack 。
场合
onBackPressed
我做popBackStack
和... 弹出我的片段与主\详情视图! 所以,我这样做:
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
//Скрываем меню, если она открыта
drawer.closeDrawer(GravityCompat.START);
}
else
{
//Проход по стеку открытх фрагментов
//super.onBackPressed();
FragmentManager fm = getSupportFragmentManager();
//if(fm.getBackStackEntryCount()>0) {
if (current_fragment != null && current_fragment.getChildFragmentManager().getBackStackEntryCount() > 0)
{
current_fragment.getChildFragmentManager().popBackStack();
//Log.d("Navigation", "Back: fragment popped from backstack. Backstack size: "+String.valueOf(fm.getBackStackEntryCount()));
}
else
finish();
//super.onBackPressed();
}
}
您可以看到current_fragment
变量。我在更换" windows"在NavigationDrawer侧边菜单事件中或当我调用AddFragment
时。它有效,但不是所有时间。
场合 我的应用中需要一些图库,智能手机上有3个窗口:
AlbumsFragment
)GalleryFragment
)PreviewFragment
) ...当然是BaseFragment
。
这是一个高手的详细视图,但对于平板电脑专辑视图(主人)看起来很奇怪,但它并不是完美的。还有第三个片段 - 预览,在平板电脑和智能手机上完成全部活动。
我做了什么?
AddFragment
以显示预览。当我在backstack中显示预览情况时是这样的:
主要背叛:
BaseFragment
替换为PreviewFragment
BaseFragment子后台堆:
AlbmumsFragment
替换为GalleryFragment
。当我向后按current_fragment
为PreviewFragment
时,我从主后台做popFromBackstack
并将其替换为BaseFragments。它被称为OnCreate
,它检查了布局,没有看到详细视图并显示...相册列表 - 主视图!
当我在add
情况下使用replace
插入AddFragment
方法时,情况有所不同,但也很糟糕:
PreviewFragment
已移除,我们会看到BaseFragment
详细视图。好?否 current_fragment
仍然是PreviewFragment
,它的子堆栈是空的,所以称为主Backstack的popFromBackstack
并弹出所有主\详细视图。
那么,我需要做什么?我认为最好的解决方案是"不要使用嵌套片段和getChildFragmentManager
"但是我不知道#39;要知道,如何使用NavigationDrawer实现master \ detail而不使用基本片段。