2016-04-26 9 views
0

私はNavigationViewerの3つの断片を持つアクティビティを持っています。私は、ユーザーがNavigationViewerのメニューアイテムを選択するたびに、アプリは選択された種類の新しいフラグメントオブジェクトを処理することを望んでいます。例のためNavigationViewerメニュー項目の操作

私はだから私は、その項目にこのコードをしようとしています「MyFragment」 呼び出さNavigationViewerメニュー項目があります。

MyFragment myFragment = new MyFragment(); 
fragmentTransaction.replace(R.id.RR, myFragment , "nav_MyFragment ").commit(); 

をしかし、これはもしユーザーがいる間、メニューから「MyFragment」を選択してしまうという問題が発生しますアクティブな[ユーザーに見える]新しいオブジェクトを作成します。 と私はいくつかのフラグメントから別のトランザクションを行う場合にのみ、その新しいオブジェクトを作成したい。

何か提案がありますか?

編集:タグにより断片を取得した後、チェックヌル例外を

答えて

1

フラグメント変数を保持し、そこにアクティブなフラグメントを割り当ててから、getClassName()をチェックし、クリックされたものが現在表示しているものと同じであれば、新しいものをロードしません。

私はthisのコードを使用しています。これはgithubにあります。

は、その後、あなたの活動では、このようにフラグメント変数を宣言:

Fragment active; 

をあなたのonOptionsItemSelected()メソッドでは、あなたが押された項目のチェックを行う必要があります。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    //noinspection SimplifiableIfStatement 
    if (id == R.id.nav_item1) { 
     if (active.getClass().getSimpleName().equals("FragmentA")) { 
      // then this fragment is already being shown, therefore do nothing 
     } else { 
      FragmentA fragtoadd = new FragmentA(); 
      getFragmentManager().beginTransaction() 
           .remove(fragtoadd) 
           .commit(); 
      active = fragtoadd; // the magic is here, everytime you add a new fragment, keep the reference to it to know what fragment is being shown 
     } 
     return true; 
    } else if (id == R.id.nav_item2) { 
     // do the same as above but for FragmentB, and so on 
     return true; 
    } 
    // ... check all your items 
    return super.onOptionsItemSelected(item); 
} 

Githubにコードを用意していれば、見栄えが良くなります。 お手伝い願います!申し訳ありません

+0

コードで詳しく説明できますか?私は何とかAndroidに新しいです –

+1

素晴らしい、これは本当に魔法の解決策です、ありがとう –

0

を与えるisVisble()場合又はisAdded()場合Uはbackstackに断片インスタンスを追加する必要が

getSupportedFragmentManager.addToBackStack(fragment.gettag)

+0

は、uはメソッド 'のnewInstanceを解決できません見 –

+0

よりプラザを説明してもらえ()' 注MyFragmentがandroid.app.Fragment –

0

実際のアイテムのクリックを検出できると仮定しているので、これは私が行うことです:

private static final String TAG_FRAGMENT_SOME_NAME = "something"; 

mFragmentManager = getSupportFragmentManager(); // or getFragmentManager() if not using support library 
mFragmentTransaction = mFragmentManager.beginTransaction(); 
Fragment myFragment = mFragmentManager.findFragmentByTag(TAG_FRAGMENT_SOME_NAME); 
if (myFragment == null) { 
    myFragment = MyFragment.newInstance(); 
} 
mFragmentTransaction.replace(R.id.RR, myFragment, TAG_FRAGMENT_SOME_NAME).commit(); 
+0

を持って、私は私の答えを編集した –

+0

のnewInstance()を自分で書く方法がある拡張し、デフォルトの空のコンストラクタを使用しないようにします。 [それを確認する](http://stackoverflow.com/a/9245510/3764592)、それを行う方法の利点/利点 – CounterFlame

+0

はい、私はそれを書いただけですが、これは問題を解決しませんでした。なぜなら、私の望むように[MyFragment]の再作成を妨げましたが、別のフラグメントから「MyFragment」へのトランザクション時に、これが発生したときに再作成する必要があります –

関連する問題