Navigationsleiste: Wie stelle ich das ausgewählte Element beim Start ein?

229

Mein Code funktioniert einwandfrei: Jedes Mal, wenn auf ein Element in der Navigationsleiste geklickt wird, wird das Element ausgewählt.

Natürlich möchte ich die App mit einem Standardfragment (Home) starten, aber in Navigation Drawer ist das Element nicht ausgewählt. Wie kann ich diesen Artikel programmgesteuert auswählen?

public class BaseApp extends AppCompatActivity {

    //Defining Variables
    protected String LOGTAG = "LOGDEBUG";
    protected Toolbar toolbar;
    protected NavigationView navigationView;
    protected DrawerLayout drawerLayout;

    private DateManager db = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_layout);

        navigationView = (NavigationView) findViewById(R.id.navigation_view);


        // set the home/dashboard at startup

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame, new DashboardFragment());
        fragmentTransaction.commit();

        setNavDrawer();
    }

    private void setNavDrawer(){

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Initializing NavigationView

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state

                // I THINK THAT I NEED EDIT HERE...

                if (menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();


                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()) {    

                    //Replacing the main content with ContentFragment 

                    case R.id.home:

                        DashboardFragment dashboardFragment = new DashboardFragment();
                        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT");
                        fragmentTransaction.commit();
                        return true;
[...]

Ich denke, dass ich hier bearbeiten muss:

if (menuItem.isChecked()) menuItem.setChecked(false);
                    else menuItem.setChecked(true);

Oder onCreatebeim App-Start mit FragmentTransaction.

Danke für Ihre Unterstützung.

Sinusba
quelle
Löst eine der Antworten eine onNavigationItemSelectedAktion für die ausgewählte ID aus?
Prabs

Antworten:

478

Verwenden Sie den folgenden Code:

navigationView.getMenu().getItem(0).setChecked(true);

Rufen Sie diese Methode nach dem Aufruf auf setNavDrawer();

Die getItem(int index)Methode ruft die MenuItemdann können Sie den Anruf setChecked(true);an , dass MenuItemalles, was Sie zu tun , sind von links nach ist, um herauszufinden , welchen Element - Index hat den Standard hat, und die 0 mit diesem Index ersetzen.

Sie können das Element durch Aufrufen auswählen (hervorheben)

onNavigationItemSelected(navigationView.getMenu().getItem(0));

Hier ist ein Referenzlink: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

BEARBEITEN Funktionierte nicht unter Nexus 4, Support Library Revision 24.0.0. Ich empfehle die Verwendung

navigationView.setCheckedItem(R.id.nav_item);

beantwortet von @kingston unten.

Arlind
quelle
65
Android Support Libraries v23 hinzugefügt setCheckedItem (int id).
Markus Rubey
1
@MarkusRubey Auch nach dem Setzen von setCheckedItem kann ich das ausgewählte Element nicht markieren. Können Sie den möglichen Grund nennen?
Dexto
3
Hat bei mir nicht funktioniert! Wenn die Methode onNavigationItemSelected für andere Optionen in der Navigationsmenü-Schublade aufgerufen wird, behält das ursprüngliche Element, das als "aktiviert" bezeichnet wird, immer seinen Status bei. Wenn ich 'navigationView.setCheckedItem (id);' verwende hat perfekt funktioniert! Danach muss die Methode 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0) aufgerufen werden.' um die Auswahl des gewünschten Elements durchzuführen.
GFPF
3
Keine der genannten Methoden hat aus irgendeinem Grund für mich funktioniert. Aber es hat navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })funktioniert.
Dimsuz
1
Sie versuchen wahrscheinlich, das markierte Element von einem anderen Thread als dem Haupt-Thread zu ändern :)
Arlind
105

Sie können auch anrufen:

navigationView.setCheckedItem(id);

Diese Methode wurde in API 23.0.0 eingeführt

Beispiel

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      tools:ignore="UnusedIds">

    <group
        android:id="@+id/group"
        android:checkableBehavior="single">
        <item
            android:id="@+id/menu_nav_home"
            android:icon="@drawable/ic_home_black_24dp"
            android:title="@string/menu_nav_home" />
    </group>
</menu>

Hinweis: android:checkableBehavior="single"

Siehe auch dies

Kingston
quelle
1
Selbst nach dem Setzen von setCheckedItem kann ich das ausgewählte Element nicht markieren. Können Sie den möglichen Grund nennen?
Dexto
3
@DeepeshDoshi Bitte stellen Sie sicher, dass Sie ein überprüfbares Verhalten haben.
Jared Burrows
1
es sollte er navigationView.setCheckedItem (R.id.menu_nav_home) sein, um das Home-Menü auszuwählen
jaga
für einzelne Artikel einfach hinzufügen, android:checkable="true"sonst wird es nicht von selbst überprüft.
Sud007
Stellen Sie außerdem sicher, dass Sie diese Methode nicht mit aufrufen, navItemSelecteListenerda das Element ausgewählt ist, nachdem diese Methode zurückgegeben wurde.
Mallaudin
47

Bei mir haben beide Methoden nicht funktioniert:

  • navigationView.getMenu().getItem(0).setChecked(true);
  • navigationView.setCheckedItem(id);

Versuchen Sie dieses, es funktioniert für mich.

onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));

Raja Jawahar
quelle
2
Danke für diesen Tipp. Die oben genannten Methoden sind eigentlich in Ordnung, aber das Problem ist anders: Wenn Sie sie verwenden, wird onNavigationItemSelected nicht aufgerufen, sondern nur der Menüpunkt wird aktiviert. Wir müssen also beide Methoden aufrufen.
user1209216
2
onNavigationItemSelected (navView.getMenu (). getItem (0)); oder onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); beide arbeiteten für mich, getitem statt finditem.
Harsh Dalwadi
30

Beispiel ( NavigationView.OnNavigationItemSelectedListener ):

private void setFirstItemNavigationView() {
        navigationView.setCheckedItem(R.id.custom_id);
        navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setFirstItemNavigationView();
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    FragmentManager fragmentManager = getFragmentManager();

    switch (item.getItemId()) {
        case R.id.custom_id:
            Fragment frag = new CustomFragment();

            // update the main content by replacing fragments
            fragmentManager.beginTransaction()
                    .replace(R.id.viewholder_container, frag)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(null)
                    .commit();
            break;
    }

Tks

GFPF
quelle
2
Dies ist eine Möglichkeit, ich mag es. Von Nur-Code-Antworten wird jedoch häufig abgeraten. Ich würde Ihre Antwort bearbeiten, um den Code ein wenig zu erklären, z. B. warum Sie ihn verwenden performIdentifierActionund was in ihm passiert onNavigationItemSelected. Für Sie mag es einfach erscheinen, aber ein neuerer Entwickler hat möglicherweise Probleme, Ihren Code zu verstehen.
AdamMc331
@ McAdam331 Natürlich zögern Sie nicht, es ist heute hier zur Hälfte vorbei und hatte keine Zeit, genauer zu schreiben.
GFPF
25

Es gibt immer Probleme mit Googles "oh so great" Support-Bibliotheken. Wenn Sie ein Element überprüfen möchten, ohne die Version Ihrer Support-Bibliotheken herunterzustufen, setzen Sie einfach checkable, bevor Sie den Status checked festlegen.

MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);

Dies kann auch funktionieren, wenn Sie im Menü XML-Dateien als überprüfbar festlegen

Daniel B.
quelle
12

Sie können den Artikel mit dem folgenden 1-Liner markieren und auswählen:

navigationView.getMenu().performIdentifierAction(R.id.posts, 0);

Quelle: https://stackoverflow.com/a/31044917/383761

Hugh Jeffner
quelle
9

API 23 bietet die folgende Methode:

navigationView.setCheckedItem(R.id.nav_item_id);

Aus irgendeinem Grund führte diese Funktion jedoch nicht dazu, dass der Code hinter dem Navigationselement ausgeführt wurde. Die Methode hebt das Element in der Navigationsleiste zwar hervor oder "überprüft" es, scheint jedoch OnNavigationItemSelectedListenerbeim Start nicht zu einem leeren Bildschirm zu führen, wenn Ihr Startbildschirm von der Auswahl der Navigationsleiste abhängt. Es ist möglich, den Listener manuell anzurufen, aber es scheint hacky:

if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));

Der obige Code setzt voraus:

  1. Sie haben NavigationView.OnNavigationItemSelectedListenerin Ihrer Aktivität implementiert
  2. Sie haben bereits angerufen:
    navigationView.setNavigationItemSelectedListener(this);
  3. Das Element, das Sie auswählen möchten, befindet sich an Position 0
John P.
quelle
6

Dazu müssen Sie 2 Funktionen aufrufen:

Erstens: zum Ausführen der Befehle, die Sie im onNavigationItemSelectedListener implementiert haben :

onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));

Zweitens: Zum Ändern des Status des Navigationsschubladen-Menüelements in ausgewählt (oder aktiviert):

navigationView.setCheckedItem(R.id.nav_camera);

Ich habe beide Funktionen aufgerufen und es hat bei mir funktioniert.

MBH
quelle
5

Mit dem folgenden Code wird nur der Menüpunkt ausgewählt:

navigationView.setCheckedItem(id);

Fügen Sie zum Auswählen und Öffnen des Menüelements nach der obigen Zeile den folgenden Code hinzu.

onNavigationItemSelected(navigationView.getMenu().getItem(0));

Nikhil Misal
quelle
4

Das ist meine Lösung, sehr einfach.

Hier ist meine Datei menu.xml:

<group
    android:id="@+id/grp1"
    android:checkableBehavior="single">
    <item
        android:id="@+id/nav_all_deals"
        android:checked="true"
        android:icon="@drawable/ic_all_deals"
        android:title="@string/all_deals" />
    <item
        android:id="@+id/nav_news_and_events"
        android:icon="@drawable/ic_news"
        android:title="@string/news_and_events" />
    <item
        android:id="@+id/nav_histories"
        android:icon="@drawable/ic_histories"
        android:title="@string/histories" />
</group>

Über dem Menü wird der erste Menüpunkt hervorgehoben. Die folgende Zeile bewirkt etwas (z. B. das erste Fragment anzeigen usw.). HINWEIS: Schreiben Sie nach "Konfigurieren Sie Ihren Schubladencode".

onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
Na Pro
quelle
4

Am einfachsten ist es, es wie folgt aus XML auszuwählen:

<menu>
   <group android:checkableBehavior="single">
         <item
              android:checked="true"
              android:id="@+id/nav_home"
              android:icon="@drawable/nav_home"
              android:title="@string/main_screen_title_home" />

Beachten Sie die Zeile android:checked="true"

Parinda Rajapaksha
quelle
1
Meiner Meinung nach verwendet die beste Antwort die von Android bereitgestellte Standardlogik. Nur als am besten gewählt ist besser, wenn das Menü das Layout verwendet und vom Adapter generiert wird, nicht von der Menü-XML-Datei.
Andris
1
Dies ist die beste Antwort
Ganesh Chowdhary Sadanala
2

Erstellen Sie zunächst Farben für das ausgewählte Element. Hier https://stackoverflow.com/a/30594875/1462969 gutes Beispiel. Es hilft Ihnen, die Farbe des Symbols zu ändern. Um den Hintergrund aller ausgewählten Elemente zu ändern, fügen Sie dies in Ihre Datei values ​​\ style.xml ein

  <item name="selectableItemBackground">@drawable/selectable_item_background</item>

Wobei selectable_item_background in drawable / selectable_item_background.xml deklariert werden soll

  <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/accent_translucent"
      android:state_pressed="true" />
    <item android:drawable="@android:color/transparent" />
   </selector>

Wo Farbe in style.xml deklariert werden kann

 <color name="accent_translucent">#80FFEB3B</color>

Und danach

   // The main navigation menu with user-specific actions
        mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer);
        mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true);
                return true;
            }
        });

Wie Sie sehen, habe ich dieses mainNavigationMenu_.getMenu () verwendet. FindItem (itemId) .setChecked (true); um das ausgewählte Element einzustellen. Hier Navigationsansicht

 <android.support.design.widget.NavigationView
        android:id="@+id/main_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header_main_navigation_menu"
        app:itemIconTint="@color/state_list"
        app:itemTextColor="@color/primary"
        app:menu="@menu/main_menu_drawer"/>
Waran-
quelle
Ich mag diese Methode, ich benutze sie derzeit in meinem eigenen Projekt. Es kann hilfreich sein, den @color/state_listCode in Ihre Antwort aufzunehmen. Woher haben Sie aus Neugier die Namenskonvention, um am Ende des Variablennamens einen Unterstrich zu setzen? Ich habe diesen Ansatz noch nie gesehen.
AdamMc331
Ich denke, vielleicht wollen Sie menuItem.getItemId()stattitemId
Craig Russell
2

Wenn Sie BottomNavigationViewdie anderen Antworten verwenden, wie z. B. navigationView.getMenu().getItem(0).setChecked(true);und navigationView.setCheckedItem(id);nicht funktioniert, setSelectedItemIdfunktioniert das Anrufen :

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            // TODO: 10-Aug-19 your code here 
        }
    });

    bottomNavigationView.setSelectedItemId(R.id.myitem);
Roshna Omer
quelle
0

Treffen Sie eine Auswahl für einzelne Elemente der Navigationsschublade

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/darkBlue" android:state_pressed="true"/>
    <item android:drawable="@color/darkBlue" android:state_checked="true"/>
    <item android:drawable="@color/textBlue" />
</selector>

Nehmen Sie einige Änderungen in Ihrer Navigationsansicht vor

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:itemBackground="@drawable/drawer_item"
        android:background="@color/textBlue"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/activity_main_drawer"
        />
Ritesh
quelle
0

zu Ihrer Aktivität (hinter der Schublade):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar,
               R.string.navigation_drawer_open,
               R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_portfolio);
    onNavigationItemSelected(navigationView.getMenu().getItem(0));
}

und

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;

    if (id == R.id.nav_test1) {
        fragment = new Test1Fragment();
        displaySelectedFragment(fragment);
    } else if (id == R.id.nav_test2) {
        fragment = new Test2Fragment();
        displaySelectedFragment(fragment);
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

und in Ihrem Menü:

<group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_test1"
        android:title="@string/test1" />

    <item
        android:id="@+id/nav_test2"
        android:title="@string/test2" />

  </group>

so erstes Menü ist Höhepunkt und zeigt als Standardmenü.

M. Namjo
quelle
0

Der folgende Code wird verwendet, um das erste Element auszuwählen und das ausgewählte erste Element im Menü hervorzuheben .

onNavigationItemSelected(mNavigationView.getMenu().getItem(0).setChecked(true));
Bhavana hegde
quelle
Können Sie mir bitte sagen, wie und wo auf dieses onNavigationItemSelected zugegriffen werden kann? Bitte geben Sie ein vollständigeres Codebeispiel an.
Kilokahn
0

du kannst das, nav_view.getMenu().findItem(R.id.menutem).setChecked(true)

Zakir Hussain
quelle
-1

Aus irgendeinem Grund ist es vorzuziehen, das MenuItem anhand der IDs zu finden.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Enzokie
quelle