Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Sunday, January 31, 2016

How to get a Fragment to remove itself, i.e. its equivalent of finish()?

How to get a Fragment to remove itself, i.e. its equivalent of finish()?


I'm converting an app to use fragments using the compatibility library. Now currently I have a number of activities (A B C D) which chain onto one another, D has a button 'OK' which when pressed calls finish which then bubbles up through onActivityResult to additionally destroy C and B.

For my pre Honycomb fragment version each activity is effectively a wrapper on fragments Af Bf Cf Df. All activities are launched via startActivityForResult and onActivityResult within each of the fragments can happily call getActivity().finish

The problem that I am having though is in my Honeycomb version I only have one activity, A, and fragments Bf, Cf, Df are loaded using the FragmentManager.

What I don't understand is what to do in Df when 'OK' is pressed in order to remove fragments Df, Cf, and Bf?

I tried having the fragment popping itself off the stack but this resulted in an exception. onActivityResult is useless because I have not loaded up the fragment using startActivityForResult.

Am I thinking about this completely the wrong way? Should I be implementing some sort of listener that communicates with either the parent fragment or activity in order to do the pop using the transaction manager?

Answer by CommonsWare for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


What I don't understand is what to do in Df when 'OK' is pressed in order to remove fragments Df, Cf, and Bf?

Step #1: Have Df tell D "yo! we got the OK click!" via calling a method, either on the activity itself, or on an interface instance supplied by the activity.

Step #2: Have D remove the fragments via FragmentManager.

The hosting activity (D) is the one that knows what other fragments are in the activity (vs. being in other activities). Hence, in-fragment events that might affect the fragment mix should be propagated to the activity, which will make the appropriate orchestration moves.

Answer by Manfred Moser for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


While it might not be the best approach the closest equivalent I can think of that works is this with the support/compatibility library

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();  

or

getActivity().getFragmentManager().beginTransaction().remove(this).commit();  

otherwise.

In addition you can use the backstack and pop it. However keep in mind that the fragment might not be on the backstack (depending on the fragmenttransaction that got it there..) or it might not be the last one that got onto the stack so popping the stack could remove the wrong one...

Answer by Eric Yuan for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


You can use the approach below, it works fine:

getActivity().getSupportFragmentManager().popBackStack();  

Answer by Blundell for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


You should let the Activity deal with adding and removing Fragments, as CommonsWare says, use a listener. Here is an example:

public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {        // onCreate etc        @Override      public void onFragmentSuicide(String tag) {          // Check tag if you do this with more than one fragmen, then:          getSupportFragmentManager().popBackStack();      }  }    public interface SuicidalFragmentListener {      void onFragmentSuicide(String tag);  }    public class MyFragment extends Fragment {        // onCreateView etc        @Override      public void onAttach(Activity activity) {          super.onAttach(activity);          try {             suicideListener = (SuicidalFragmentListener) activity;          } catch (ClassCastException e) {             throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);          }      }        @Override      public void onActivityCreated(Bundle savedInstanceState) {          super.onActivityCreated(savedInstanceState);          // Attach the close listener to whatever action on the fragment you want          addSuicideTouchListener();      }        private void addSuicideTouchListener() {          getView().setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                suicideListener.onFragmentSuicide(getTag());              }          });      }  }  

Answer by JayR for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


I think if you want to dismiss/finish your current fragment the best way to do this is as simple as by doing getFragmentManager().popBackStack();

Answer by Diego Ramrez for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


If you need to popback from the fourth fragment in the backstack history to the first, use tags!!!

When you add the first fragment you should use something like this:

getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit()

or

getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()

And when you want to show Fragments B,C and D you use this:

getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()

and other letters....

To return to Fragment A, just call popBackStack(0, "A"), yes, use the flag that you specified when you add it, and note that it must be the same flag in the command addToBackStack, not the one used in command replace or add.

You're welcome ;)

Answer by Vasudev for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


See if your needs are met by a DialogFragment. DialogFragment has a dismiss() method. Much cleaner in my opinion.

Answer by Codeversed for How to get a Fragment to remove itself, i.e. its equivalent of finish()?


In the Activity/AppCompatActivity:

@Override  public void onBackPressed() {      if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {          // if you want to handle DrawerLayout          mDrawerLayout.closeDrawer(GravityCompat.START);      } else {          if (getFragmentManager().getBackStackEntryCount() == 0) {              super.onBackPressed();          } else {              getFragmentManager().popBackStack();          }      }  }  

and then call in the fragment:

getActivity().onBackPressed();  

or like stated in other answers, call this in the fragment:

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.