114

2 つのフラグメントを含むアプリケーションを開発しており、必要に応じて非表示にしたいと考えています。次のコードには、私の問題の簡単な例があります。この単純な Fragmentactivity には、1 つのボタンと 1 つのリストフラグメントが含まれています。

この単純な例は問題なく動作します。しかし、私は show hide fragment に満足していません。layout.setVisibility(View.GONE); を削除すると、コードから ft.hide(f); フラグメントを非表示にしません。実際、フラグメントを隠しているのではなく、コンテナーを隠しています。

私の質問は、これは非表示のフラグメントを表示する方法ですか? そうでない場合は、多くの人がこの問題に直面しているため、フラグメントを非表示および表示する方法をテスト済みの例で説明してください。

 public class MainActivity extends FragmentActivity implements OnClickListener {

        Fragment1 f;
        Button b;
        LinearLayout layout;
        Fragment myf;
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b = (Button) findViewById(R.id.button1);
            layout = (LinearLayout) findViewById(R.id.ll);
            f = new Fragment1();
        }

        @Override
        public void onClick(View v) {

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

            if (f.isHidden()) {
                ft.show(f);
                layout.setVisibility(View.VISIBLE);
                b.setText("Hide");
            } else {
                ft.hide(f);
                b.setText("Show");
                layout.setVisibility(View.GONE);
            }
            ft.commit();
            // TODO Auto-generated method stub
        }
4

10 に答える 10

171

コンテナの可視性フラグをいじらないでください - FragmentTransaction.hide/show が内部的にそれを行います。

したがって、これを行う正しい方法は次のとおりです。

FragmentManager fm = getFragmentManager();
fm.beginTransaction()
          .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
          .show(somefrag)
          .commit();

または、android.support.v4.app.Fragment を使用している場合

 FragmentManager fm = getSupportFragmentManager();
 fm.beginTransaction()
          .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
          .show(somefrag)
          .commit();
于 2013-05-10T20:29:38.353 に答える
58

さらに、フラグメントで行うことができます (たとえば、サーバー データの取得に失敗した場合)。

 getView().setVisibility(View.GONE);
于 2014-01-28T10:43:53.810 に答える
24

こんにちは、このアプローチを使用してそれを行います。最初に追加されたすべてのフラグメントはコンテナーに残り、その後、目的のフラグメントを明らかにし、コンテナー内の他のフラグメントを非表示にします。

// Within an activity
private FragmentA fragmentA;
private FragmentB fragmentB;
private FragmentC fragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        fragmentA = FragmentA.newInstance("foo");
        fragmentB = FragmentB.newInstance("bar");
        fragmentC = FragmentC.newInstance("baz");
    }
}


// Replace the switch method
protected void displayFragmentA() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (fragmentA.isAdded()) { // if the fragment is already in container
        ft.show(fragmentA);
    } else { // fragment needs to be added to frame container
        ft.add(R.id.flContainer, fragmentA, "A");
    }
    // Hide fragment B
    if (fragmentB.isAdded()) { ft.hide(fragmentB); }
    // Hide fragment C
    if (fragmentC.isAdded()) { ft.hide(fragmentC); }
    // Commit changes
    ft.commit();
}

詳細については、 https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragmentsを参照してください。誰かの役に立てば幸いです。たとえそれが古い質問であっても。

于 2015-07-03T03:22:09.237 に答える
10
public void showHideFragment(final Fragment fragment){

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.setCustomAnimations(android.R.animator.fade_in,
                    android.R.animator.fade_out);

    if (fragment.isHidden()) {
        ft.show(fragment);
        Log.d("hidden","Show");
    } else {
        ft.hide(fragment);
        Log.d("Shown","Hide");                        
    }

    ft.commit();
}
于 2015-03-24T10:33:17.113 に答える
0

ここでの答えは正しいです。私は@Jyoの表示と非表示のフラグメント実装のWhiffアイデアが好きでしたが、彼が現在持っている方法を除いて、最初の実行でフラグメントを非表示にするので、isAddedチェックと表示を追加したという点でわずかな変更を加えましたフラグメントがまだない場合

public void showHideCardPreview(int id) {
    FragmentManager fm = getSupportFragmentManager();
    Bundle b = new Bundle();
    b.putInt(Constants.CARD, id);
    cardPreviewFragment.setArguments(b);
    FragmentTransaction ft = fm.beginTransaction()
        .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (!cardPreviewFragment.isAdded()){
        ft.add(R.id.full_screen_container, cardPreviewFragment);
        ft.show(cardPreviewFragment);
    } else {
        if (cardPreviewFragment.isHidden()) {
            Log.d(TAG,"++++++++++++++++++++ show");
            ft.show(cardPreviewFragment);
        } else {
            Log.d(TAG,"++++++++++++++++++++ hide");
            ft.hide(cardPreviewFragment);
        }
    }

    ft.commit();
} 
于 2019-05-09T23:49:04.127 に答える