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.

  • Wie man Findbugs-Berichte mit Grade-Skript generiert?
  • In welchem ​​Format werden die Kontakte in android gespeichert?
  • Android facebook-android-sdk: 4.0.0, wie kann ich die Login-Fortschrittsleiste entfernen?
  • Falsche Elemente, die in der Ebenenliste auf dem Vor-Lutscher liegen
  • Android weird lib.c Absturz
  • Erstellen eines Chronometers in Android
  • 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.

  • Deaktivieren und Aktivieren von Orientierungsänderungen in einer Aktivität in Android programmgesteuert
  • Kann kein Handler im Thread erstellen, das nicht Looper.prepare ()
  • Laden Sie apk Datei von S3 mit DownloadManager herunter
  • Wie man einen "multipart / form-data" POST in Android mit Volley sendet
  • Animation der Höhe des LinearLayout-Containers mit ValueAnimator
  • Verknüpfen von STL in eine eigenständige Android NDK ausführbare Datei
  • 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.