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.
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.
navigationView.setCheckedItem(id);
Diese Methode wurde in API 23.0.0 eingeführt
<?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
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));
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
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
Sie können den Artikel mit dem folgenden 1-Liner markieren und auswählen:
navigationView.getMenu().performIdentifierAction(R.id.posts, 0);
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:
NavigationView.OnNavigationItemSelectedListener
In Ihre Aktivität implementiertnavigationView.setNavigationItemSelectedListener(this);
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.
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));
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));
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"/>
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"
ü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ü.
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"
/>
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));
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);