2016-12-05 18 views
1

MainActivityには2つのフラグメントがあります。最初のフラグメントにはナビゲーションドロワがあり、2番目のフラグメントはナビゲーションドロワではありません。 MainActivityでは、onBackPressed()メソッドをオーバーライドして、ナビゲーションドロワーを開いたときにフラグメントを閉じる必要があります。しかし、私は、フラグメントのナビゲーションドロワの状態をアクティビティから取得する方法を知らない。ここでは、コードがあります:もちろんフラグメントのナビゲーション・ドロワーをアクティビティーから取得する

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とは何ですか?drawerLayout = fragment.drawerLayout; –

0
  • を使用してのアクセスは、あなたのMainActivityであなたのFragmentListProductオブジェクトを持ちます。
  • FragmentListProductフラグメントにisDrawerOpen()というメソッドを1つ作成します。
  • isDrawerOpen()MainActivityからFragmentListProductクラスオブジェクトを使用して呼び出すことができます。

お試しください!

+0

'isDrawerOpen()'のコードを教えてもらえますか?私が作成した場合、drawerLayoutを静的フィールドにする必要があります。これは、 'leak memory'警告を与えます。 – zihadrizkyef

0

解決方法1:

  1. あなたの主な活動であなたのナビゲーションの引き出しを入れてください。
  2. ナビゲーション・ドロワが不要な場合は、新しいアクティビティで2番目のフラグメントを開きます。

解決方法2:

  1. あなたのフラグメントのメソッドを作成します)(checkNavigationDrawerを言います。
  2. は())yourFragment.checkNavigationDrawer(コールごonBackPressedでこの

    Fragment yourFragment = (YourFragment)getSupportFragmentManager().findFragmentById(R.id.containerId); 
    
  3. のようなあなたの活動のフラグメント参照を取得します。それがオープンに近いがそれであるならば、あなたのcheckNavigationDrawerメソッドチェックでこの

    @Override 
    public void onBackPressed() { 
        yourFragment.checkNavigationDrawer(); 
        super.onBackPressed(); 
    } 
    
  4. のようなナビゲーションドロワーが開いているかではない場合。

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

isDrawerOpen()のコードを教えてもらえますか?私はそれを作成するため、私は私に警告リークメモリを与える静的フィールドとしてdrawerLayoutを作る必要がある – zihadrizkyef

+0

静的なレイアウトを作る必要はありません。答えを更新する –

関連する問題