从活动中获取片段的导航抽屉

问题描述:

我有拥有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

+0

我觉得你有这个完全错误的。为什么你想要在抽屉里放一个抽屉?如果你想让你的抽屉有一个片段,你应该把片段放在抽屉里面,然后将抽屉布局逻辑移动到MainActivity。但在你的情况下,你可以使用'findFragmentById'来查找片段并在片段中使用公共方法来执行此操作。 –

+0

@NaveenDissanayake我不认为这会出错。其基于他的要求。和他展现自己的方式。对我来说,它的新的发酵曲线 –

+0

你是什么意思,“抽屉有一个片段?”,“抽屉里面的片段”.. 我知道,抽屉包含菜单,而不是片段..对不起英语 – zihadrizkyef

您可以使用标签,你就必须调用片段时,分配访问片段,像这样:

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(); 
    } 

} 
+0

感谢您的编辑@ ravi-teja –

+0

什么是drawerLayout drawerLayout lineer drawerLayout = fragment.drawerLayout; –

  • 握住你FragmentListProduct对象在MainActivity访问它。
  • FragmentListProduct片段中创建一个名为isDrawerOpen()的方法。
  • 现在,您可以使用FragmentListProduct类对象从MainActivity调用isDrawerOpen()

去吧!

+0

你可以给我'isDrawerOpen()'的代码吗?因为如果我创建它,我需要使drawerLayout作为静态字段,它会给我警告'泄漏内存' – zihadrizkyef

解决方案1:

  1. 把你的抽屉式导航栏在您的主要活动。
  2. 如果您不想要导航抽屉,请在新活动中打开第二个片段。

解决方案2:

  1. 创建您的片段的方法说checkNavigationDrawer()。
  2. 得到这样

    Fragment yourFragment = (YourFragment)getSupportFragmentManager().findFragmentById(R.id.containerId); 
    
  3. 在你onBackPressed在你的活性的片段引用()调用yourFragment.checkNavigationDrawer();这样

    @Override 
    public void onBackPressed() { 
        yourFragment.checkNavigationDrawer(); 
        super.onBackPressed(); 
    } 
    
  4. 在你checkNavigationDrawer方法检查,如果导航抽屉是打开与否,如果它是打开关闭它。

    public void checkNavigationDrawer(){ 
         if(drawerLayout.isOpen()){ 
          drawerLayout.closeDrawers(); 
         } 
    
    } 
    
+0

你可以给我isDrawerOpen()的代码吗?因为如果我创建它,我需要将drawerLayout作为静态字段,这会给我警告泄漏内存 – zihadrizkyef

+0

没有必要使抽屉布局静态.i'll更新答案 –