从活动中获取片段的导航抽屉
我有拥有2个片段的MainActivity。第一个片段有导航抽屉,第二个片段没有。在MainActivity中,我想重写onBackPressed()方法,因此当导航抽屉被打开时,它必须关闭片段。但我不知道如何从Activity获取片段的导航抽屉的状态。下面的代码:从活动中获取片段的导航抽屉
MainActivity.java
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
FragmentListProduct.java
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.fragment_list_product_layout, container, false);
Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.toolbar);
fragmentActivity.setSupportActionBar(toolbar);
drawerLayout = (DrawerLayout) mainView.findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(fragmentActivity, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.addDrawerListener(drawerToggle);
drawerToggle.syncState();
navigationView = (NavigationView) mainView.findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.setCheckedItem(R.id.nav_cat_all);
}
当然,它给了我错误Cannot resolve symbol darwerlayout
。 之前,我做了drawerLayout
作为静态字段,但我得到了警告Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)
。那么如何解决这个问题,或者你有另一种解决方案:d
您可以使用标签,你就必须调用片段时,分配访问片段,像这样:
getFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, "the_tag_here")
.commit();
使用getFragmentManager().findFragmentByTag("the_tag")
@Override
public void onBackPressed() {
FragmentListProduct fragment = (FragmentListProduct) getFragmentManager().findFragmentByTag("the_tag_here");
if (fragment != null) {
DrawerLayout drawerLayout = fragment.drawerLayout;
//make drawerLayout public in the fragment
if (drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
} else {
super.onBackPressed();
}
}
感谢您的编辑@ ravi-teja –
什么是drawerLayout drawerLayout lineer drawerLayout = fragment.drawerLayout; –
- 握住你
FragmentListProduct
对象在MainActivity
访问它。 - 在
FragmentListProduct
片段中创建一个名为isDrawerOpen()
的方法。 - 现在,您可以使用
FragmentListProduct
类对象从MainActivity
调用isDrawerOpen()
。
去吧!
你可以给我'isDrawerOpen()'的代码吗?因为如果我创建它,我需要使drawerLayout作为静态字段,它会给我警告'泄漏内存' – zihadrizkyef
解决方案1:
- 把你的抽屉式导航栏在您的主要活动。
- 如果您不想要导航抽屉,请在新活动中打开第二个片段。
解决方案2:
- 创建您的片段的方法说checkNavigationDrawer()。
-
得到这样
Fragment yourFragment = (YourFragment)getSupportFragmentManager().findFragmentById(R.id.containerId);
-
在你onBackPressed在你的活性的片段引用()调用yourFragment.checkNavigationDrawer();这样
@Override public void onBackPressed() { yourFragment.checkNavigationDrawer(); super.onBackPressed(); }
-
在你checkNavigationDrawer方法检查,如果导航抽屉是打开与否,如果它是打开关闭它。
public void checkNavigationDrawer(){ if(drawerLayout.isOpen()){ drawerLayout.closeDrawers(); } }
你可以给我isDrawerOpen()的代码吗?因为如果我创建它,我需要将drawerLayout作为静态字段,这会给我警告泄漏内存 – zihadrizkyef
没有必要使抽屉布局静态.i'll更新答案 –
我觉得你有这个完全错误的。为什么你想要在抽屉里放一个抽屉?如果你想让你的抽屉有一个片段,你应该把片段放在抽屉里面,然后将抽屉布局逻辑移动到MainActivity。但在你的情况下,你可以使用'findFragmentById'来查找片段并在片段中使用公共方法来执行此操作。 –
@NaveenDissanayake我不认为这会出错。其基于他的要求。和他展现自己的方式。对我来说,它的新的发酵曲线 –
你是什么意思,“抽屉有一个片段?”,“抽屉里面的片段”.. 我知道,抽屉包含菜单,而不是片段..对不起英语 – zihadrizkyef