Show/Hide Fragments and change the visibility attribute programmatically

后端 未结 2 1041
谎友^
谎友^ 2021-01-02 19:37

This is a 2 part problem. What I\'m having is a 3 Fragment layout where the 3\'rd Fragment(FragmentC) is added dynamically when the user taps a button found in another fragm

相关标签:
2条回答
  • 2021-01-02 20:20

    In FragmentB you're trying get a view which is not on your contentView

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.fragment_b, container, false);
    
        // this is in fragment_b layout
        ListView listView = (ListView) view.findViewById(R.id.listView1);
        Button button = (Button) view.findViewById(R.id.button);
    
        /* ... */
        // ****************************************
        // this is NOT in fragment_b layout, which causes null
        // ****************************************
        final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.fragment_C);
    
        /* ... */
    }
    

    Try:

        final FrameLayout frameLayout = (FrameLayout) getActivity().getWindow().findViewById(R.id.fragment_C);
    

    Whereas R.id.fragment_C is inflated and setted on MainActivity.

    Moreover, I had the same problem until use an extra flag

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        final Fragment fragmentC = new FragmentC();
        fragmentTransaction.add(R.id.fragment_C, fragmentC);
        fragmentTransaction.commit();
        menuIsOn = false;
    
        final View fragmentCView = findViewById(R.id.fragment_C);
    
        final Button btn = (Button) findViewById(R.id.btn);
        btnPowers.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                if (!menuIsOn) {
                    fragmentCView.setVisibility(View.VISIBLE);
                } else {
                    fragmentCView.setVisibility(View.INVISIBLE);
                }
                menuIsOn = !menuIsOn;
            }
        });
    
    0 讨论(0)
  • 2021-01-02 20:28

    Create the Instances of fragments and add instead of replace

            FragA  fa= new FragA();
            FragB  fb= new FragB();
            FragC  fc= new FragB();
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.fragmnt_container, fa);
            fragmentTransaction.add(R.id.fragmnt_container, fb);
            fragmentTransaction.add(R.id.fragmnt_container, fc);
            fragmentTransaction.show(fa);
            fragmentTransaction.hide(fb);
            fragmentTransaction.hide(fc);
            fragmentTransaction.commit();
    

    suppose we want to to hide and show different fragments based on our action

        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.hide(fa);
        fragmentTransaction.show(fb);
        fragmentTransaction.hide(fc);
        fragmentTransaction.commit();
    
    0 讨论(0)
提交回复
热议问题