0

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...

michael
  • 3,835
  • 14
  • 53
  • 90

1 Answers1

1

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();
}
mjp66
  • 4,214
  • 6
  • 26
  • 31
  • It's still not working. I suspect that the use of `FragmentManager` add and remove methods is incorrect and should be other method? – michael Nov 03 '15 at 15:06
  • Hmmm. I once did something similar to what you're trying to do and didn't have problems. It's possible I'm not seeing something obvious. How about posting the xml just for kicks? – mjp66 Nov 03 '15 at 15:39