Ausgewählten Zustand der Navigationsschublade nach der Rückwärtspresse aktualisieren

Was ist der richtige Weg, um den ausgewählten Zustand der Navigationsschublade nach der Rücksendung zu behandeln?

Ich habe eine Navigationsschublade mit n Einträgen (in einer Listenansicht) wie das SDK-Beispiel in Android Studio. Wenn ich auf die Navigation Schublade Einträge Ich möchte, dass sie in den hinteren Stapel hinzugefügt werden, so kann ich zurück zu ihnen.

  • Der Prozess des Dienstes wird getötet, nachdem die Anwendung aus dem Anwendungsfach entfernt wurde
  • Kann der Android-Layout-Ordner Unterordner enthalten?
  • Unterstützt Google Play In-App Billing Version 3 Rückerstattungen?
  • Android AlertDialog setOnDismissListener für API niedriger als 17
  • RecyclerView Scrolling Leistung
  • Wie baue ich eine native (Befehlszeile) ausführbare Datei auf Android laufen?
  • In onNavigationDrawerItemSelected (int pos) habe ich

    FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (position == 0) { transaction.replace(R.id.container, new FragmentA()); } else if (position == 1) { transaction.replace(R.id.container, new FragmentB()); } else { transaction.replace(R.id.container, new FragmentC()); } transaction.addToBackStack(null); transaction.commit(); 

    Wenn ich auf den zweiten Eintrag in der Schublade klicke, wird B ausgewählt und ersetzt A. Wenn ich danach auf die Rücktaste klicke, wird Fragment A wieder wie es angezeigt wird, aber B ist noch in der Navigationsschublade ausgewählt.

    Wie kann ich den Auswahlstatus der Schublade nach dem Drücken der Schublade aktualisieren?

    Irgendwie brauche ich einen Anruf an mDrawerListView.setItemChecked (Position, true); Oder NavigationDrawerFragment.selectItem (int position). Aber zu welcher position Wie gehe ich es an?

    Intercept mit onBackPressed?

     @Override public void onBackPressed() {} 

    Aber wie weiß ich, welches Fragment wieder aktiv ist? Und zu welcher Position entspricht es.

    Gibt es eine einfache Lösung bin ich blind zu sehen? Es scheint, dass die Verwendung in Kombination mit der Navigation Schublade und Aktualisierung der Auswahl Status ist ein Standard-Muster.

  • Android-ADT-Plugin wird in Eclipse nicht angezeigt
  • Phonegap Cross-domain AJAX POST Anforderung nicht auf Android arbeiten
  • Android-Studio läuft nicht
  • Was ist OBB (Opaque Binary Blob) in Android Website entwickeln?
  • Wie kann ich den Hintergrund meiner Form in xml setzen?
  • Android erkennt Bluetooth sofort trennen sofort 2 Sekunden
  • 4 Solutions collect form web for “Ausgewählten Zustand der Navigationsschublade nach der Rückwärtspresse aktualisieren”

    Dieses Muster wird im Abschnitt " Back Navigation for Fragments " der Dokumentation "Proper Back Navigation" beschrieben.

    Wenn Ihre Anwendung andere Benutzeroberflächenelemente aktualisiert, um den aktuellen Status Ihrer Fragmente zu reflektieren, z. B. die Aktionsleiste, denken Sie daran, die Benutzeroberfläche zu aktualisieren, wenn Sie die Transaktion begehen. Sie sollten Ihre Benutzeroberfläche nach dem Back-Stack-Änderungen zusätzlich zu aktualisieren, wenn Sie die Transaktion begehen. Sie können hören, wann eine FragmentTransaction durch die Einrichtung eines FragmentManager.OnBackStackChangedListener umgekehrt wird :

     getSupportFragmentManager().addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { public void onBackStackChanged() { // Update your UI here. } }); 

    Das wäre der richtige Ort, um die aktuelle Option in der Navigationsschublade zu aktualisieren.

    Ich habe eine Menge Ärger versucht, herauszufinden, eine Lösung für dieses Problem und die Lösung, die ich am Ende mit ist nicht "nett" meiner Meinung nach, aber es funktioniert.

    In meiner Bewerbung fing ich an, eine Fragmentposition in der Navigationsschublade hinzuzufügen, als ich das Fragment zum Backstack hinzufügte. Auf diese Weise könnte ich setItemChecked mit der Position in meinem onBackStackChanged () aufrufen. Also grundsätzlich was ich tat, war das:

     @Override public void onBackStackChanged() { FragmentManager fm = getFragmentManager(); String name = fm.getBackStackEntryAt(fm.getBackStackEntryCount()-1).getName(); mDrawerList.setItemChecked(Integer.parseInt(name),true); } public class DrawerItemClickListener implements android.widget.AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } } private void selectItem(int position) { Fragment fragment; switch (position) { case 0: // Home fragment = new ContentFragment(); break; case 1: // Another fragment = new AnotherFragment(); break; default: // Logout { finish(); Intent intent = new Intent(this, StartupActivity.class); startActivity(intent); return; } } FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .addToBackStack(Integer.toString(position)) .commit(); mDrawerList.setItemChecked(position, true); setTitle(mNavigationItems[position]); mDrawerLayout.closeDrawer(mDrawerList); } 

    Aufbau auf @matiash 's ausgezeichnete Antwort (achten Sie auf +1 seine / ihr, wenn Sie +1 meine Antwort)

    Um zu beginnen, gehen wir davon aus, dass wir in der Activity

     getFragmentManager().addOnBackStackChangedListener( new FragmentManager.OnBackStackChangedListener() { public void onBackStackChanged() { // Update your UI here. } }); 

    Sie finden das aktuelle Fragment mit folgendem:

    (Von https://stackoverflow.com/a/24589081/878159 )

     Fragment f = getFragmentManager().findFragmentById(R.id.frag_container); if (f instanceof CustomFragmentClass) { // do something with f f.doSomething(); } 

    Das sollte dir einen Schritt näher kommen. Dann wird dir so ein Verweis auf deine Navigationsschublade kommen:

     nav = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.nav); 

    Dann hängt davon ab, wie du deine Schublade Fragment Code:

     nav.updateSelected(position); 

    Die updateSelected(int) -Methode wäre in deiner NavigationDrawerFragment Klasse und könnte so aussehen:

     public void updateSelected(int position) { mCurrentSelectedPosition = position; if (mDrawerListView != null) { mDrawerListView.setItemChecked(position, true); } } 

    HINWEIS: Es gibt viele Möglichkeiten, dies zu tun, aber das solltest du loslegen.

    Heute hatte ich den gleichen krieg Ich habe es gelöst, indem ich eine Schnittstelle FragmentToActivity in jedem Fragment und in meiner und nur MainActivity implementiere.

    Schnittstelle:

     public interface FragmentToActivity { public void SetNavState(int id); } 

    Fragmente:

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ((FragmentToActivity) getActivity()).SetNavState(R.id.nav_myitemid); //just add this line } 

    Hauptaktivität:

     @Override public void SetNavState(int id) { NavigationView nav = (NavigationView) findViewById(R.id.nav_view); nav.setCheckedItem(id); } 

    Und wenn du keine Ahnung hast, woher R.id.nav_myitemid kommt, hier ist meine activity_main_drawer.xml :

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_myitemid" android:title="@string/home" /> </group> </menu> 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.