3

サポート ライブラリの Android DrawerLayout を使用してスライド メニューを表示しています。単一のアクティビティと 5 ~ 6 個のフラグメントを使用して、DrawerLayout メニューでの選択時にそれらを表示しています。しかし、小さな問題があります。ユーザーがすでに開いているフラグメントに対応するメニュー項目を選択した場合に表示されます.現在、フラグメントを再度作成して表示するのは適切ではありません.メニュー項目をクリックしたときにトリガーされる関数は次のとおりです:

private void selectItem(int position) {

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Locate Position
        switch (position) {
        case 0:
            ft.replace(R.id.content_frame, fragment1);
            break;
        case 1:
            ft.replace(R.id.content_frame, fragment2);
            break;
        case 2:
            ft.replace(R.id.content_frame, fragment3);
            break;
        }
        ft.commit();
        mDrawerList.setItemChecked(position, true);
        // Close drawer
        mDrawerLayout.closeDrawer(mDrawerList);
    }

要求されたフラグメントが既に開かれているかどうかを確認して、再度作成しないようにするにはどうすればよいですか? FragmentManager を介してこれを確認する方法はありますか?

4

4 に答える 4

7

@Platoの回答に追加します。まだ表示されていない場合は、現在表示されているフラグメントの質問を確認してください。

答えは、トランザクションにフラグメントを追加するときに、タグを使用して特定のフラグメントを表すことができるということです。何かのようなもの:

ft.replace(android.R.id.content, fragment, "MY_FRAGMENT");

後でそのフラグメントが表示されているかどうかを確認したい場合は、次のようにすることができます。

RequestedFragment fragment = (RequestedFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT"); //"My_FRAGMENT" is its tag
if (fragment.isVisible()) {
   // add your code here 
}

お役に立てれば。

于 2013-06-22T17:53:53.480 に答える
3

最も簡単な方法は、最後に使用したものを保存positionして、次回比較することです。selectItemメソッドを次のようにするだけです。

int lastPosition = -1;
private void selectItem(int position) {

    if( position != lastPosition ) {

       [ old method body here ]

       lastPostion = position;
    }
}
于 2013-06-22T17:49:17.280 に答える
3

フラグメントのそれぞれに異なるタグを割り当て、のfindFragmentByTag()を呼び出してFragmentManager、それぞれが既に存在するかどうかを確認します。

同じ目的で の を使用して、フラグメントの ID を使用findFragmentById()することもできます。FragmentManager

于 2013-06-22T17:49:27.457 に答える
0

fragment1fragment2、のそれぞれを同時に表示できないことが確実でありfragment3、同じフラグメントを再利用する (つまり、位置を変更するたびに新しいフラグメントを作成しない) 場合isVisible()、クラスのメソッドは、Fragmentそのフラグメントが現在表示されています。

スイッチは次のようになります。

switch (position) {
        case 0:
            if(!fragment1.isVisible()) {
              ft.replace(R.id.content_frame, fragment1);
            }
            break;
        case 1:
            if(!fragment2.isVisible()) {
              ft.replace(R.id.content_frame, fragment2);
            }
            break;
        case 2:
            if(!fragment3.isVisible()) {
              ft.replace(R.id.content_frame, fragment3);
            }
            break;
        }
于 2013-06-22T18:14:41.443 に答える