Show Hide Fragment in Android

Show hide fragment in android

Don't mess with the visibility flags of the container - FragmentTransaction.hide/show does that internally for you.

So the correct way to do this is:

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

OR if you are using android.support.v4.app.Fragment

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

Fragment Hide and show on click

Follow this function in an onClick function to do show hide of fragment on clicking a button:

// Call this function inside onClick of button

public void showHideFragment(final Fragment fragment){

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

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

fragTransaction.commit();
}

How can I hide a fragment on start of my MainActivity( or the application)?

On start hide fragment like this:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Fragment bottomFragment = manager.findFragmentById(R.id.bottomFragment);
ft.hide(bottomFragment);
ft.commit();

Then you can again show it:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Fragment bottomFragment = manager.findFragmentById(R.id.bottomFragment);
ft.show(bottom);
ft.commit();

Show/hide fragment on button click in Android

I tried this and it worked for me. First I added the fragment when button is clicked for first time and then on subsequent clicks I attached and detached it. So it created the fragment and then without destroying it only showed and hid it.

this is the code.... Initially count is 0 when the MainActivity is first created

       public void Settings(View view){

if(count==0){
count++;
// add a fragment for the first time
MyFragment frag=new MyFragment();
FragmentTransaction ft=manager.beginTransaction();
ft.add(R.id.group,frag,"A");
ft.commit();
}else{

//check if fragment is visible, if no, then attach a fragment
//else if its already visible,detach it
Fragment frag=manager.findFragmentByTag("A");
if(frag.isVisible() && frag!=null){
FragmentTransaction ft=manager.beginTransaction();
ft.detach(frag);
ft.commit();
}else{
FragmentTransaction ft=manager.beginTransaction();
ft.attach(frag);
ft.commit();
}

}

Show/Hide Fragment instead of replace

FragmentTransaction has the following methods you can use.

show(Fragment fragment)
hide(Fragment fragment)
add(int containerViewId, Fragment fragment, String tag)

And I think you don't need to call transaction.addToBackStack(s) in your case.

How to Show/Hide an Android Fragment correctly?

Heres how I fixed this issue:-

First remove my overriden onBackPressed()

Change display ListFragment to this:-

final FragmentManager fragmentManager = getFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(containerId, mListFragment, LIST_FRAGMENT_TAG);

fragmentTransaction.commit();

Change display detailFragment to this:-

mDetailFragment = new DetailFragment();

final Bundle fragmentArguments = new Bundle();
fragmentArguments.putString(ITEM_KEY, item.getKey());
mDetailFragment.setArguments(fragmentArguments);

final FragmentManager fragmentManager = getFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

if (mLandscape) {
fragmentTransaction.replace(containerId, mDetailFragment, DETAIL_FRAGMENT_TAG);
} else {
fragmentTransaction.hide(mListFragment);
fragmentTransaction.add(containerId, mDetailFragment, DETAIL_FRAGMENT_TAG);
fragmentTransaction.addToBackStack(DETAIL_FRAGMENT_TAG);
}

fragmentTransaction.commit();

How to hide android fragment in activity to only have one fragment active at the time?

Instead of

getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileEditFragment).commit();

It must be

getSupportFragmentManager().beginTransaction().replace(R.id.profile_fragment, profileEditFragment).commit();

This will replace your fragment, instead of adding it.

Please, also note that you must call "add" for the first time and use "replace" afterwards.

You may find more about fragments here: https://developer.android.com/training/basics/fragments/fragment-ui

EDIT

For the new issue you have outlined, the solution is to "report" you activity that an event had happened, so it can take action. Here is how to do that.

First, we need an interface (you can add it inside you Profile fragment) and to link the activity to our fragment, if it implements that interface.

public class ProfileViewFragment extends Fragment {
...
...

private ProfileViewListener listener;

...
...

@OnClick(R.id.btn_change_settings)
public onEdit(View view) {
// If there is anyone listening, report that we need to open editor
if (listener != null) {
listener .onOpenProfileEditor();
}
}

public void setListener(ProfileViewListener listener) {
this.listener = listener;
}

// The interface
public interface ProfileViewListener {
void onOpenProfileEditor();
}
}

And in the class, we need to implement the interface and subscribe as a listener.

public class ProfileActivity extends AppCompatActivity implements ProfileViewFragment.ProfileViewListener {

...
...

@Override
public void onOpenProfileEditor() {
ProfileEditFragment profileEditFragment=new ProfileEditFragment();
profileEditFragment.setArguments(getIntent().getExtras());

getSupportFragmentManager()
.beginTransaction
.replace(R.id.profile_fragment, profileEditFragment)
.commit();
}

@Override
public void onAttachFragment(Fragment fragment) {
if (fragment instanceof ProfileViewFragment) {
ProfileViewFragment profileFragment = (ProfileViewFragment) fragment;
profileFragment.setListener(this);
}
}
}

You may find more detail on Activity-Fragment communication here - https://developer.android.com/training/basics/fragments/communicating

Android Fragments: When to use hide/show or add/remove/replace?

You should consider what you plan to do with the fragment to decide which path to follow. If you use a FragmentTransaction to hide the fragment, then it can still be in the running state of its lifecycle, but its UI has been detached from the window so it's no longer visible. So you could technically still interact with the fragment and reattach its UI later you need to. If you replace the fragment, the you are actually pulling it out of the container and it will go through all of the teardown events in the lifecycle (onPause, onStop, etc) and if for some reason you need that fragment again you would have to insert it back into the container and let it run through all of its initialization again.


If there is a high probability that you will need that fragment again, then just hide it because it's a less expensive operation to redraw it's layout than to completely reinitialize it.



Related Topics



Leave a reply



Submit