Search code examples
androidandroid-fragmentsandroid-fragmentactivityfragmentmanagerandroid-framelayout

Android: Display and Hide Fragment


I have inside some Activity single full screen Fragment. Inside that Fragment I have another Fragment overlaying bottom part of the screen. So in the top part of the screen I have Button controlling Visible/Hide of the inner Fragment:

  1. Layout of the containing Fragment:

    ...
    <FrameLayout
        android:id="@+id/inner_fragment"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_below="@+id/top_part"
        android:name="com.package.InnerFragment" />
    
  2. The controlling Button:

    controlButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isInnerVisible) showHideInnerFragment("show");
            else showHideInnerFragment("hide");
        }
    });
    
  3. The helper method showHideInnerFragment:

    private void showHideInnerFragment(String param) {
        //variables are class members...
        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        innerFragment = new InnerFragment();
        if (param.equals("show")) {
            fragmentTransaction.add(R.id.inner_fragment, innerFragment);
            isInnerVisible = true;
        } else {
            fragmentTransaction.remove(innerFragment);
            isInnerVisible = false;
        }
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
    

Well - This totally not working...


Solution

  • It appears that your isInnerVisible is always false (I'm assuming it starts off as false), which removes the fragment but keeps isInnerVisible false. You probably just need to switch that around:

    private void showHideInnerFragment(String param) {
        //variables are class members...
        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        innerFragment = new InnerFragment();
        if (param.equals("show")) {
            fragmentTransaction.add(R.id.inner_fragment, innerFragment);
            isInnerVisible = false;
        } else {
            fragmentTransaction.remove(innerFragment);
            isInnerVisible = true;
        }
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
    

    I would also pass a true/false value to the parameter rather than a string value, it makes it much easier to understand what the code is doing, as it is now it sort of doesn't make sense. I'll update with an example in a bit ;)

    edit: here's a nicer way to do what you want:

    controlButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            showHideInnerFragment(isInnerVisible);
        }
    });
    

    private void showHideInnerFragment(boolean isVisible) {
        //variables are class members...
        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        innerFragment = new InnerFragment();
        if (isVisible == false) {
            fragmentTransaction.add(R.id.inner_fragment, innerFragment);
            isInnerVisible = true;
        } else {
            fragmentTransaction.remove(innerFragment);
            isInnerVisible = false;
        }
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }