wake-up-neo.com

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

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 bei 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 editieren muss:

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

Oder in onCreate beim Start der App mit FragmentTransaction.

Danke für Ihre Unterstützung.

195
sineverba

Verwenden Sie den folgenden Code:

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

Rufen Sie diese Methode auf, nachdem Sie setNavDrawer(); aufgerufen haben.

Die Methode getItem(int index) ruft das MenuItem ab, dann können Sie das setChecked(true); für dieses MenuItem aufrufen. Sie müssen nur herausfinden, welches Element Sie verwenden Index hat die Standardeinstellung, und ersetzen Sie die 0 mit diesem Index.

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

[~ # ~] edit [~ # ~] Funktionierte nicht unter Nexus 4 und unterstützte die Bibliotheksrevision 24.0.0. Ich empfehle die Verwendung

navigationView.setCheckedItem(R.id.nav_item);

beantwortet von @Kingston unten.

449
Arlind

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

95
kingston

Bei mir haben beide Methoden nicht funktioniert:

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

Probieren Sie es aus, es funktioniert bei mir.

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

47
Raja Jawahar

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

28
GFPF

Es gibt immer Probleme mit Googles "ach so toll" Support-Bibliotheken. Wenn Sie ein Element überprüfen möchten, ohne die Support-Libs-Version herunterzurüsten, setzen Sie einfach die Option checkable, bevor Sie den geprüften Status festlegen. 

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

Es kann auch funktionieren, wenn Sie in den Menü-XML-Dateien die Option zum Aktivieren auswählen

24
Daniel B

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

11
Hugh Jeffner

API 23 bietet die folgende Methode:

navigationView.setCheckedItem(R.id.nav_item_id);

Aus irgendeinem Grund hat diese Funktion jedoch nicht zur Ausführung des Codes hinter dem Navigationselement geführt. Die Methode hebt das Element in der Navigationsschublade sicher hervor oder überprüft es, aber es scheint nicht das OnNavigationItemSelectedListener aufzurufen, was beim Start zu einem leeren Bildschirm führt, wenn Ihr Startbildschirm von der Navigationsschublade abhängt Auswahl. Es ist möglich, den Listener manuell aufzurufen, aber es scheint schwierig zu sein:

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

Der obige Code setzt voraus:

  1. Sie haben NavigationView.OnNavigationItemSelectedListener In Ihre Aktivität implementiert
  2. Sie haben bereits angerufen:
    navigationView.setNavigationItemSelectedListener(this);
  3. Der Artikel, den Sie auswählen möchten, befindet sich an Position 0
8
John P.

Sie müssen dazu 2 Funktionen aufrufen:

Zuerst: um die Befehle auszuführen, die Sie in onNavigationItemSelected listener implementiert haben:

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

Zweitens: zum Ändern des Status des Menüelements der Navigationsleiste in ausgewählt (oder markiert):

navigationView.setCheckedItem(R.id.nav_camera);

Ich rief beide Funktionen an und es funktionierte für mich.

6
MBH

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

navigationView.setCheckedItem(id);

Fügen Sie nach der obigen Zeile den folgenden Code ein, um das Menüelement auszuwählen und zu öffnen.

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

5
Nikhil Misal

Dies ist meine Lösung, sehr einfach.

Hier ist meine menu.xml-Datei:

<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>

Im oberen Menü wird der erste Menüpunkt hervorgehoben. Unterhalb der Zeile wird etwas ausgeführt (zB: das erste Fragment anzeigen usw.). HINWEIS: Schreiben Sie nach "Konfigurieren Sie Ihren Schubladencode".

onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
3
Na Pro

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 Werte\style.xml-Datei ein 

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

Wo 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 diese mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true) verwendet; , um das ausgewählte Element festzulegen . Hier die 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"/>
2
Waran-

Am einfachsten ist es, es 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"

1

über deine 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 deinem 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>

das erste Menü ist Markieren und Anzeigen als Standardmenü.

0
M.Namjo

Wählen Sie eine Option für den Einzelposten der Nav-Schublade

<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"
        />
0
Ritesh

Unter dem folgenden Code wird das erste Element ausgewählt und das ausgewählte erste Element im Menü hervorgehoben.

onNavigationItemSelected (mNavigationView.getMenu (). getItem (0) .setChecked (true));

0
Bhavana hegde

Wenn Sie BottomNavigationView verwenden, funktionieren die anderen Antworten wie navigationView.getMenu().getItem(0).setChecked(true); und navigationView.setCheckedItem(id); nicht. Der Aufruf von setSelectedItemId funktioniert:

    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);
0
Roshna Omer