Navigationsleiste: Wie stelle ich das ausgewählte Element beim Start ein?
Lesezeit: 6 Minuten
sineverba
Mein Code funktioniert perfekt: 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 der Navigationsleiste ist das Element nicht ausgewählt. Wie kann ich dieses Element 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 hinein onCreate beim App-Start mit FragmentTransaction.
Danke für Ihre Unterstützung.
Löst eine der Antworten aus onNavigationItemSelected Aktion für die ausgewählte ID?
Rufen Sie diese Methode nach dem Aufruf auf setNavDrawer();
Der getItem(int index) Methode bekommt die MenuItem dann kannst du die anrufen setChecked(true); auf diesem MenuItemmüssen Sie nur noch herausfinden, welchen Elementindex der Standardwert hat, und die 0 durch diesen Index ersetzen.
Sie können das Element auswählen (markieren), indem Sie anrufen
@MarkusRubey selbst nach dem Setzen von setCheckedItem kann ich das ausgewählte Element nicht hervorheben. Können Sie den möglichen Grund nennen?
– Dexto
30. September 15 um 21:18 Uhr
Hat bei mir nicht funktioniert! Wenn Methode onNavigationItemSelected für andere Optionen in der Navigationsmenüleiste aufgerufen wird, behält das anfängliche Element, das als “markiert” bezeichnet wird, immer seinen Zustand bei. Wenn ich ‘navigationView.setCheckedItem(id);’ 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
4. November 15 um 11:34 Uhr
Keine der genannten Methoden hat bei mir aus irgendeinem Grund funktioniert. Aber tun navigationView.post(new Runnable() { navigationView.setCheckedItem(...) }) – hat funktioniert.
– dimsuz
28. April 16 um 11:27 Uhr
Sie versuchen wahrscheinlich, das markierte Element aus einem anderen Thread als dem Hauptthread zu ändern 🙂
Auch nach dem Setzen von setCheckedItem kann ich das ausgewählte Element nicht hervorheben. Können Sie den möglichen Grund nennen?
– Dexto
30. September 15 um 21:19 Uhr
@DeepeshDoshi Bitte stellen Sie sicher, dass Sie ein überprüfbares Verhalten haben.
– Jared Burrows
20. März 16 um 4:10 Uhr
es sollte navigationView.setCheckedItem(R.id.menu_nav_home) sein, um das Home-Menü auszuwählen
– Jaga
30. März 16 um 5:31 Uhr
für einzelne Artikel einfach hinzufügen android:checkable="true" sonst wird es nicht von selbst überprüft.
– sud007
12. Juni 17 um 9:52 Uhr
Stellen Sie außerdem sicher, dass Sie diese Methode nicht mit aufrufen navItemSelecteListener als Element ausgewählt wird, nachdem diese Methode zurückkehrt.
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, nur der Menüpunkt wird überprüft. Also müssen wir beide Methoden aufrufen.
– Benutzer1209216
30. Oktober 15 um 20:59 Uhr
onNavigationItemSelected(navView.getMenu().getItem(0)); oder onNavigationItemSelected(navView.getMenu().getItem(R.id.nav_profile)); beide haben bei mir funktioniert, getitem statt finditem.
– Rauer Dalwadi
23. Februar 17 um 8:55 Uhr
Aber warum prüft diese Methode auch nicht das Item if onNavigationItemSelected kehrt zurück true?
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 wieder Probleme mit Googles “oh so great” Support Libs. 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.
Aus irgendeinem Grund führte diese Funktion jedoch nicht dazu, dass der Code hinter dem Navigationselement ausgeführt wurde. Die Methode hebt das Element sicherlich in der Navigationsleiste hervor oder „überprüft“ es, aber es scheint nicht aufgerufen zu werden OnNavigationItemSelectedListener Dies führt zu einem leeren Bildschirm beim Start, 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 geht davon aus:
Sie haben umgesetzt NavigationView.OnNavigationItemSelectedListener bei Ihrer Tätigkeit
Sie haben bereits angerufen: navigationView.setNavigationItemSelectedListener(this);
Das Element, das Sie auswählen möchten, befindet sich an Position 0
.
7588900cookie-checkNavigationsleiste: Wie stelle ich das ausgewählte Element beim Start ein?yes
Löst eine der Antworten aus
onNavigationItemSelected
Aktion für die ausgewählte ID?– Prabs
3. Februar 17 um 11:14 Uhr
@Prabs ja, stackoverflow.com/questions/31233279/…
– B-Gangster
16. Juli 18 um 0:30 Uhr