2016-12-05 114 views
1

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

回答

1

您可以使用標籤,你就必須調用片段時,分配訪問片段,像這樣:

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; –

0
  • 握住你FragmentListProduct對象在MainActivity訪問它。
  • FragmentListProduct片段中創建一個名爲isDrawerOpen()的方法。
  • 現在,您可以使用FragmentListProduct類對象從MainActivity調用isDrawerOpen()

去吧!

+0

你可以給我'isDrawerOpen()'的代碼嗎?因爲如果我創建它,我需要使drawerLayout作爲靜態字段,它會給我警告'泄漏內存' – zihadrizkyef

0

解決方案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更新答案 –