michael
michael

Reputation: 3945

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

Upvotes: 0

Views: 1355

Answers (1)

mjp66
mjp66

Reputation: 4213

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();
}

Upvotes: 1

Related Questions