2017-08-18 15 views
2

ナビゲーション引き出しアイテムをクリックするとすぐにマイフラグメントが開きます。ナビゲーション引き出しが閉じられた後に開くようにします。ナビゲーションドロワーを閉じた後にフラグメントを開く方法

ナビゲーション・ドロワー・サポート・ライブラリーでドロワーが閉じられた後で、どのようにフラグメントを開くことができますか?

private void initNavigationView() 
{ 
    navigationView = (NavigationView) findViewById(R.id.navigation_view); 
    drawerLayout = (DrawerLayout) findViewById(R.id.navigation_drawer); 

    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.nav_open, R.string.nav_close) { 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) {super.onDrawerClosed(drawerView) 
     } 

    }; 
    drawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       drawerToggle.syncState(); 
      } 
     }); 
    drawerToggle.setDrawerIndicatorEnabled(true); 
    drawerLayout.setDrawerListener(drawerToggle); 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 

       switch (menuItem.getItemId()) { 
        case R.id.tentang: 
         break; 
        case R.id.keluar: 
         finish(); 
         break; 
       } 
       selectDrawerItem(menuItem); 
       return true; 
      } 

      private void selectDrawerItem(MenuItem menuItem) 
      { 
       Fragment fragment = null; 
       Class fragmentClass = null; 

       switch (menuItem.getItemId()) 
       { 
        case R.id.fragment_home: 
         fragmentClass = com.wahyuapps.benux.fragment.fragmentHome.class; 
         break; 
        case R.id.fragment_distro_linux: 
         fragmentClass = com.wahyuapps.benux.fragment.fragmentDistroLinux.class; 
         break; 
       } 
       try { 
        fragment = (Fragment)fragmentClass.newInstance(); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit(); 
       menuItem.setChecked(true); 
       setTitle(menuItem.getTitle()); 
       drawerLayout.closeDrawers(); 
      } 
     }); 
} 

このコードはどのようなものですか? 引き出しを閉じたときに断片を開くにはどうすればいいですか?私の場合は 、アイテムをクリックするとフラグメントが開きました。私は引き出しが閉じた後にいくらか遅延して断片を開きたい。

+0

「コールフラグメント」とはどういう意味ですか?それを開く方法? – DEADMC

答えて

0
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
     TestingFragment hello = new TestingFragment(); 
     fragmentTransaction.add(R.id.mainlayout, hello, "HELLO"); 
     fragmentTransaction.commit(); 

これで、フラグメントを呼び出すことができます...そして、R.id.mainlayoutはあなたのアクティビティのルートレイアウトです。

編集2

多少の遅延

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit(); 
        menuItem.setChecked(true); 
        setTitle(menuItem.getTitle()); 

       } 
      }, 1000); 

後の断片を開くには、ハンドラのため、このインポートを選択 - import android.os.Handler;

+0

私は専用ハンドラハンドラを作成します。修正ハンドラを取得しましたが、フラグメントにエラーが発生しました。 "この変数は最終変数でなければなりません。"そして最終変数にすると、他のフラグメントにエラーが発生しました。 "この変数は最終的には変更できません" –

+0

しかし、私は断片的にfcを得た。変数 "private Fragment fragment;"と "Fragment mFragment = null;"の問題を考える –

+0

これで、変数をonCreateに変更してもアプリケーションにエラーは発生しません。この遅延は効果を発揮しません。あなたは私に最初のコードを与えることができますか?私は最初のコードは私のコードで動作すると思います。 –

0

を私はあなたがフラグメントを開くために遅延を作りたいと思います。引き出しを閉じた後にフラグメントトランジションを作成する必要がある場合。その後、あなたの移行を遅らせることによって達成することができます。

コードは次のようになります。

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 
      switch (menuItem.getItemId()) { 
       case R.id.tentang: 
        break; 
       case R.id.keluar: 
        finish(); 
        break; 
      } 
      selectDrawerItem(menuItem); 
      return true; 
     } 

     private void selectDrawerItem(MenuItem menuItem) 
     { 
      Fragment fragment = null; 
      Class fragmentClass = null; 

      switch (menuItem.getItemId()) 
      { 
       case R.id.fragment_home: 
        fragmentClass = com.wahyuapps.benux.fragment.fragmentHome.class; 
        break; 
       case R.id.fragment_distro_linux: 
        fragmentClass = com.wahyuapps.benux.fragment.fragmentDistroLinux.class; 
        break; 
      } 
      try { 
       fragment = (Fragment)fragmentClass.newInstance(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
       changeFragment(fragment); 
       menuItem.setChecked(true); 
       setTitle(menuItem.getTitle()); 
       drawerLayout.closeDrawers(); 
      } 
     }); 

フラグメントを変更するメソッドを作成します。

public void changeFragment(final Fragment fragment){ 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit(); 
      } 
     }, 400); 
    } 

私はちょうど移行の400ミリ秒の遅延を入力しました。あなたの希望によってそれを変更してください。

希望します。

+0

今は本当に修正されています。そのコードは間違っていません。私は以下のフラグメントメソッドを削除することを忘れています。ナビゲーションドロワーで最高のパフォーマンスを得るために350ミリ秒使用 –

関連する問題