Ich benutze 3 Fragment (HomeFragment, RegisterFragment und NewsFragment) .Wie von NewsFragment zu Direct HomeFragment zu bewegen, wenn ich auf Zurück klicken. Ich möchte nicht zu einem anderen Fragment wechseln, wenn ich auf "Zurück" klicke.Wie man onBackPressed in Fragment implementiert und HomeFragment erreicht?
Antwort
ich eine Utility-Klasse gemacht, die mein Fragment Navigation steuern. Hier
ist, was diese Klasse wie folgt aussieht:
public class FragmentController {
private static final String TAG = FragmentController.class.getCanonicalName();
private static FragmentController mInstance;
private ArrayList<BaseFragment> mFragmentsList;
private BaseActivity mActivity;
private FrameLayout mFragmentContainer;
public FragmentController(BaseActivity activity) {
set(activity);
}
public static FragmentController getInstance(BaseActivity activity) {
if (mInstance == null)
mInstance = new FragmentController(activity);
return mInstance;
}
public static void setInstance(FragmentController mInstance) {
FragmentController.mInstance = mInstance;
}
public void set(BaseActivity activity) {
mActivity = activity;
if (mActivity instanceof MainActivity) {
mFragmentContainer = ((MainActivity) mActivity).getFragmentContainer();
}
mFragmentsList = new ArrayList<>();
}
public void addFirstFragment(BaseFragment fragment) {
mFragmentsList.add(fragment);
}
public void presentFragment(BaseFragment fragment, boolean removeAllFromBackstack) {
try {
Log.d(TAG, "presentFragment: " + fragment.getTagFm());
if (mActivity.getCurrentFocus() != null) {
ViewUtils.hideKeyboard(mActivity.getCurrentFocus());
}
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft.replace(mFragmentContainer.getId(), fragment, fragment.getTagFm());
ft.addToBackStack(fragment.getTagFm());
ft.commitAllowingStateLoss();
if (mFragmentsList.size() != 0)
if (removeAllFromBackstack) {
if (mFragmentsList.size() == 2) {
mFragmentsList.remove(1);
} else if (mFragmentsList.size() > 2) {
mFragmentsList.subList(1, mFragmentsList.size()).clear();
}
}
if (!isFragmentPresent(fragment))
mFragmentsList.add(fragment);
} catch (Exception e) {
e.printStackTrace();
}
}
public void removeSecondFragment() {
mFragmentsList.remove(1);
}
private boolean isFragmentPresent(BaseFragment fragment) {
for (BaseFragment baseFragment : mFragmentsList) {
if (baseFragment.getTagFm().equals(fragment.getTagFm()))
return true;
}
return false;
}
public BaseFragment getCurrentFragment() {
return mFragmentsList.get(mFragmentsList.size() - 1);
}
public ArrayList<BaseFragment> getFragmentsList() {
return mFragmentsList;
}
}
Nun, ich instanziiert diese Klasse in einer Aktivität
mFragmentController = FragmentController.getInstance(this);
und jetzt mache ich das onBackPressed()
von meinem Activity
@Override
public void onBackPressed() {
if (mFragmentController.getFragmentsList().size() == 1) {
finish();
}
else {
mFragmentController.getFragmentsList().remove(mFragmentController.getFragmentsList().size() - 1);
mFragmentController.presentFragment(mFragmentController.getFragmentsList().get(mFragmentController.getFragmentsList().size() - 1), false);
}
}
In FragmentController
Klasse, werden Sie sehen, dass ich mit der Methode getTagFm()
auf BaseFragment
Klasse. Dies dient im Wesentlichen dazu, zu erkennen, welches Fragment in que vorhanden ist und welches nicht. BaseFragment
Klasse wird so etwas wie dieses:
public class BaseFragment extends Fragment {
public String getTagFm() {
if (this.getClass().getSimpleName().equals(LoginFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_LOGIN;
} else if (this.getClass().getSimpleName().equals(OrderFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_ORDER;
} else if (this.getClass().getSimpleName().equals(ProgramFragment.class.getSimpleName())) {
return Constants.TAG_FRAGMENT_PROGRAM;
}
return Constants.TAG_FRAGMENT_ORDER;
}
}
wo alle diese Fragmente (LoginFragment
, OrderFragment
, ProgramFragment
) BaseFragment
verlängern.
Hoffe, das hilft jemandem.
In NewsFragment:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
onBackPressed();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
HomeFragment f = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_home);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.show(f);
}
Wird es null Zeiger Ausnahme geben? –
Sie können eine Aktivität haben diese alle Fragmente Ersatz Handhabung. Wenn Sie in dieser Aktivität eine Variable mit dem eigentlichen Ergebnisfragment definieren, können Sie onBackPressed überschreiben und prüfen, ob NewsFragment angezeigt wird und diese durch HomeFragment ersetzt wird.
@Override
public void onBackPressed() {
if(actualFragment instanceof NewsFragment) {
HomeFragment homeFragment = new HomeFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, homeFragment);
transaction.commit();
}
}
Dies funktioniert mir, wenn ich den Zurück-Knopf drücke!
Ich weiß nicht, Ihre fragment
Struktur, aber ich verwende eine einzige layout
und ersetzen Sie sie durch die entsprechende fragment
.
Hier ist mein Code:
@Override
//Pressed return button - returns to the results menu
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
frag_name frag_name = new frag_name();
FragmentManager manager = getActivity().getSupportFragmentManager();
manager.beginTransaction().replace(R.id.yourlayout, frag_name, frag_name.getTag()).commit();
return true;
}
return false;
}
});
}
Anstatt jedes Fragment beim Zurückdrücken zu prüfen, wird ein Stapel verwaltet, der die Verfolgung jedes Fragments in der Ansichtshierarchie behält.
Stack<Fragment> fragmentStack= new Stack<Fragment>();
// add first fragment
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.container, "your fragment object");
//push it in stack
fragmentStack.push(homeListFragment);
ft.commit();
// add second fragment
ResultListFragment resultListFragment = new ResultListFragment();
ft.add(R.id.container, resultListFragment);
fragmentStack.lastElement().onPause();
ft.hide(fragmentStack.lastElement());
fragmentStack.push(resultListFragment);
ft.commit();
//now back button press logic
@Override
public void onBackPressed() {
if (fragmentStack.size() == 2) {
FragmentTransaction ft = fragmentManager.beginTransaction();
fragmentStack.lastElement().onPause();
ft.remove(fragmentStack.pop());
fragmentStack.lastElement().onResume();
ft.show(fragmentStack.lastElement());
ft.commit();
} else {
super.onBackPressed();
}
}
- 1. Onbackpressed Umleitung zu bestimmten Fragment
- 2. Wie behandelt onBackPressed() in Fragment?
- 3. Add onBackpressed in Fragment
- 4. Android Fragment onBackPressed
- 5. onBackPressed mit verlängern Fragment
- 6. Vorheriges Fragment bei Onbackpressed
- 7. Android onBackPressed() in einem Fragment
- 8. Wie implementiert man onTouchEvent() in einem Fragment?
- 9. Wie implementiert man Listener von Fragment A zu Fragment B?
- 10. onBackPressed() und Fragmente
- 11. Wie implementiert man relationale Ansichten in demselben Fragment in Android?
- 12. Wie implementiert man eine ListView in einem Fragment in Android
- 13. Verwenden von onBackPressed mit sichtbarem Fragment
- 14. Wie implementiert Tabview in einem der Fragment der unteren Leiste?
- 15. Navigieren von Fragment zu Aktivität onBackPressed
- 16. Wie Fragment zu überprüfen, ist in Aktivität sichtbar OnBackpressed
- 17. Aufruf der Fragment-Schnittstellenmethode in der übergeordneten Aktivität onBackPressed-Methode
- 18. Umgang mit der Zurück-Taste, um zu HomeFragment zu gehen?
- 19. Wie man onBackPressed in KeyguardManager behandelt
- 20. Fragment implementiert OnClickListener
- 21. Wie implementiert man Google DFP-Anzeigen (NativeContentAdView) auf Fragment ViewPager?
- 22. Wie implementiert man Textauswahl?
- 23. Wie man OnBackPressed Xamarin Test Cloud imitiert?
- 24. Android-Aktivität onBackPressed nicht aufgerufen
- 25. ActivityNotFoundException onBackPressed und onSaveInstanceState
- 26. Überspringe einige Fragmente onBackPressed
- 27. Null Objektreferenz in. OnBackPressed()
- 28. Exit von App nur aus dem 1. Fragment mit onBackPressed
- 29. OnBackPressed() beendet die Anwendung
- 30. wie man Fragment von der Hauptklasse (appCompatActivity)
ADD addbackstackto (null), wenn Sie Fragment –
speichern Fragment-Objekt in der Aktivität verwenden Sie es als fragment.isVisible() beginnen; und verwalten Fragment in Aktivität. –
bitte, wie SieFragment Anruf für weitere Details setzen. –