android - tesis - Cajón de navegación: ¿cómo configuro el elemento seleccionado al inicio?
tesis sobre youtube pdf (17)
Mi código funciona perfectamente: cada vez que se hace clic en un elemento en el cajón de navegación, se selecciona el elemento.
Por supuesto, quiero iniciar la aplicación con un fragmento predeterminado (inicio), pero Navigation Drawer no tiene el elemento seleccionado. ¿Cómo puedo seleccionar ese elemento mediante programación?
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;
[...]
Creo que necesito editar aquí:
if (menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
O en
onCreate
al iniciar la aplicación con FragmentTransaction.
Gracias por tu apoyo.
También puedes llamar a:
navigationView.setCheckedItem(id);
Este método fue introducido en API 23.0.0
Ejemplo
<?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>
Nota:
android:checkableBehavior="single"
Ver también this
API 23 proporciona el siguiente método:
navigationView.setCheckedItem(R.id.nav_item_id);
Sin embargo, por alguna razón, esta función no provocó la ejecución del código detrás del elemento de navegación.
El método ciertamente resalta el elemento en el cajón de navegación, o lo ''revisa'', pero no parece llamar al
OnNavigationItemSelectedListener
lo que
OnNavigationItemSelectedListener
resultado una pantalla en blanco al inicio si su pantalla de inicio depende de las selecciones del cajón de navegación.
Es posible llamar manualmente al oyente, pero parece hacky:
if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));
El código anterior supone:
-
Has implementado
NavigationView.OnNavigationItemSelectedListener
en tu actividad -
Ya has llamado:
navigationView.setNavigationItemSelectedListener(this);
- El elemento que desea seleccionar se encuentra en la posición 0
Al usar
BottomNavigationView
las otras respuestas, como
navigationView.getMenu().getItem(0).setChecked(true);
y
navigationView.setCheckedItem(id);
no funcionará llamando a
setSelectedItemId
funciona:
<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>
Ejemplo ( 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
El siguiente código se utiliza para seleccionar el primer elemento y resaltar el primer elemento seleccionado en el menú.
drawer.getMenu().findItem(R.id.action_something).setChecked(true);
El siguiente código solo seleccionará el elemento del menú:
navigationView.setCheckedItem(id);
Para seleccionar y abrir el elemento del menú, agregue el siguiente código después de la línea anterior.
onNavigationItemSelected(navigationView.getMenu().getItem(0));
En primer lugar, crea colores para el elemento seleccionado. Aquí https://.com/a/30594875/1462969 buen ejemplo. Le ayuda a cambiar el color del icono. Para cambiar el fondo de todos los elementos seleccionados, agregue en su archivo de valores / style.xml esto
<?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>
Donde selectable_item_background debe declararse en drawable / selectable_item_background.xml
<color name="accent_translucent">#80FFEB3B</color>
Donde el color se puede declarar en style.xml
// 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;
}
});
Y despues de esto
<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"/>
Como puede ver, usé este mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); para configurar el elemento seleccionado. Aquí navegaciónVer
<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" />
Esta es mi solución, muy simple.
Aquí está mi archivo 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>
El menú anterior resaltará el primer elemento del menú. La siguiente línea hará algo (por ejemplo: mostrar el primer fragmento, etc.). NOTA: escriba después de ''configurar su código de cajón''
onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
Haga un selector para el elemento individual del cajón de navegación
<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"
/>
Haga algunos cambios en su NavigationView
@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));
}
La forma más fácil es seleccionarlo de xml de la siguiente manera,
<item name="selectableItemBackground">@drawable/selectable_item_background</item>
Tenga en cuenta la línea de
android:checked="true"
Por alguna razón, es preferible encontrar el MenuItem utilizando los ID.
drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Puede resaltar y seleccionar el elemento con el siguiente 1-liner:
navigationView.getMenu().performIdentifierAction(R.id.posts, 0);
Fuente: https://.com/a/31044917/383761
Siempre hay problemas con las bibliotecas de soporte de Google "oh, qué bien". Si desea verificar un elemento sin degradar su versión de libs de soporte, simplemente configure checkable antes de configurar el estado verificado.
MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);
También podría funcionar si establece checkable en el menú xml files
Tienes que llamar a 2 funciones para esto:
Primero:
para excitar los comandos que ha implementado en el oyente
onNavigationItemSelected
:
onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));
Segundo: para cambiar el estado del elemento del menú del cajón de navegación a seleccionado (o marcado):
navigationView.setCheckedItem(R.id.nav_camera);
Llamé a ambas funciones y funcionó para mí.
Usa el siguiente código:
navigationView.getMenu().getItem(0).setChecked(true);
Llame a este método después de llamar a
setNavDrawer();
El
getItem(int index)
obtiene el
MenuItem
luego puede llamar a
setChecked(true);
en ese
MenuItem
, todo lo que tiene que hacer es averiguar qué índice de elemento tiene el valor predeterminado y reemplazar el 0 con ese índice.
Puede seleccionar (resaltar) el elemento llamando
onNavigationItemSelected(navigationView.getMenu().getItem(0));
Aquí hay un enlace de referencia: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html
EDITAR No funcionó en nexus 4, admite la revisión de la biblioteca 24.0.0. Recomiendo usar
navigationView.setCheckedItem(R.id.nav_item);
respondido por @kingston a continuación.
en su actividad (detrás del cajón):
@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;
}
y
<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>
y en tu menú:
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);
así que el primer menú está resaltado y se muestra como menú predeterminado.
Para mí, estos dos métodos no funcionaron:
-
navigationView.getMenu().getItem(0).setChecked(true);
-
navigationView.setCheckedItem(id);
Prueba este, me funciona.
onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));