android - studio - navigation drawer personalizado
Color de fondo del elemento de cajón de navegación para el elemento seleccionado (12)
Además de proporcionar un selector personalizado dibujable para listSelector, también debe establecer el recurso de fondo del elemento de la lista en un selector seleccionable similar que tenga diferentes estilos para los diferentes estados.
Utilicé Android Studio para implementar el Cajón de navegación y no puedo obtener el color azul que se usa para mostrar en qué sección estamos actualmente para cambiar.
Probé varias cosas, actualmente estoy usando listSelector que se ve así:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@color/selected" />
<item android:state_pressed="true" android:drawable="@color/highlight" />
</selector>
También probé state_checked
. state_pressed
funciona en esta situación, pero el elemento seleccionado actualmente sigue siendo azul.
EDITAR: He estado examinando esto más y cuando se crea el adaptador, el contexto que se pasa es getActionBar().getThemedContext()
así que estoy pensando si puedo encontrar el atributo correcto para asignar a mi estilo de barra de acciones, puedo cambiarlo desde allí. He intentado algunos atributos diferentes sin suerte. ¿Alguien sabe el atributo exacto?
También me he dado cuenta si pongo
<item name="android:activatedBackgroundIndicator">@drawable/nav_listview_selector</item>
en la parte principal de mi tema y cambie getActionBar().getThemedContext()
para getActivity.getBaseContext
entonces puedo cambiar el color, pero no creo que sea el correcto. Creo que se debe usar el contexto temático. Entonces, si alguien sabe dónde podría colocar el getActionBar.getThemedContext()
para que se use en getActionBar.getThemedContext()
EDIT2:
Entonces, la vista de texto utilizada para la vista de lista es una dentro del SDK, se ve así:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
Así que traté de modificar el "?android:attr/activatedBackgroundIndicator"
en el nivel del tema, pero no tiene efecto para checked / selected / activated pero sí para presionar. ¿Alguien sabe a que se debe esto? ¿Y cómo puedo cambiarlo?
En Futuro si alguien viene aquí usando la Actividad del Cajón de navegación (proporcionada por Studio en la ventana Prompt de actividad)
La respuesta es -
Use esto antes de OnCreate () en MainActivity
int[][] state = new int[][] {
new int[] {android.R.attr.state_checked}, // checked
new int[] {-android.R.attr.state_checked}
};
int[] color = new int[] {
Color.rgb(255,46,84),
(Color.BLACK)
};
ColorStateList csl = new ColorStateList(state, color);
int[][] state2 = new int[][] {
new int[] {android.R.attr.state_checked}, // checked
new int[] {-android.R.attr.state_checked}
};
int[] color2 = new int[] {
Color.rgb(255,46,84),
(Color.GRAY)
};
ColorStateList csl2 = new ColorStateList(state2, color2);
y use esto en onNavigationItemSelected () en MainActivity (no necesita escribir esta función si usa la actividad de Cajón de navegación, se agregará en MainActivity).
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
Sugerencia: agregue este código antes If else Condición en onNavigationItemSelected ()
Esto es trabajo para mí:
Primero defina un
item_bg.xml
como:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/nav_menu_bg" /> </selector>
Luego usa este dibujable en
navigation_main_layout.xml
como:<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:itemBackground="@drawable/item_bg" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_navigation" app:menu="@menu/navigation_main_layout_drawer" />
Esto funcionó para mí: implementé el menú desplegable no llenando la vista de navegación con la lista, sino con los elementos del menú.
creó un dibujante como este:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/drawer_menu_selector_color" android:state_checked="true"></item>
<item android:drawable="@color/drawer_menu_selector_color" android:state_activated="true"></item>
y en el método onCreate, configure el id del elemento del menú que corresponde a la actividad seleccionada como marcada. e implemente el archivo del selector dibujable en su cajón de navegación como este
app:itemBackground="@drawable/drawer_menu_selector"
fyi: necesita definir su espacio de nombres ''app''.
Para cambiar el " Color de fondo del elemento del Cajón de navegación para el elemento seleccionado ", puede hacerlo con el atributo:
colorControlHighlight
En su " styles.xml " podría verse así:
<style name="YourStyleNameFor.NavigationDrawer" parent="ThemeOverlay.AppCompat.Light">
<item name="colorControlHighlight">@color/your_highlight_color</item>
</style>
No olvides aplicar tu estilo en la etiqueta :
android.support.design.widget.NavigationView
Por ejemplo, en tu activity_main.xml podría verse así:
<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:headerLayout="@layout/navigationdrawer_header"
<!-- the following line referes to your style -->
app:theme="@style/YourThemeNameFor.NavigationDrawer"
<!-- the following two lines are maybe also interesting for you -->
app:itemIconTint="@color/gray3"
app:itemTextColor="@color/gray3"
app:menu="@menu/navigationdrawer_main" />
Para resolver este problema:
1- No necesitas android: listSelector en tu ListView.
2- Abre (o crea ) styles.xml debajo (res / values).
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:activatedBackgroundIndicator">@drawable/drawer_list_selector</item>
</style>
3- Debajo de la carpeta res / drawable crea el archivo drawer_list_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/light_gray_color" />
<item android:state_activated="true" android:drawable="@drawable/red_color" />
<item android:drawable="@android:color/transparent" />
</selector>
4- En res / drawable crea red_color.xml / light_gray_color.xml (o cualquier otro nombre) y agrega tu color Hex deseado:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#C8FF0000"/>
</shape>
5- Abra su proyecto AndroidManifest.xml y agregue la etiqueta android: theme (si no existe)
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Referencia / Crédito: Cambio del cajón de navegación Color del elemento seleccionado de azul predeterminado
Sé que es demasiado tarde, pero he resuelto este problema en mi aplicación.
No creo que sea una tontería, simplemente cambie la posición de "state_pressed" a la parte superior.
<item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
<item android:drawable="@drawable/list_item_bg_selected" android:state_activated="true"/>
Tengo implementar el menú del cajón con la clase de adaptador personalizado. Puede ser que ayude a alguien Drawer List
<ListView
android:id="@+id/listview_drawer"
android:layout_width="260dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/menu_item_color"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:fadingEdge="none"
/>
drawer_list_item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/menu_selector"
>
<ImageView
android:id="@+id/imgIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:src="@drawable/ic_menu_home" />
<TextView
android:id="@+id/lblName"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:layout_toRightOf="@+id/imgIcon"
android:minHeight="48dp"
android:textColor="@color/menu_txt_color" />
menu_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<!-- selected -->
<item android:drawable="@color/menu_item_active_color" android:state_focused="true" android:state_pressed="false"/>
<item android:drawable="@color/menu_item_active_color" android:state_pressed="true"/>
<item android:drawable="@color/menu_item_active_color" android:state_activated="true"/>
<item android:drawable="@color/menu_item_active_color" android:state_checked="true"/>
<item android:drawable="@color/menu_item_active_color" android:state_selected="true"/>
<item android:drawable="@color/menu_item_color" android:state_activated="false"/>
Agregue esto al elemento haga clic en listner de listview yourlistview.setItemChecked (position, true);
Todavía no estoy seguro de por qué es que no funciona. Pero la forma en que lo encontré a su alrededor es usar mi propio layout simple_list_item_activated
para pasarlo a ArrayAdapter, que era básicamente el mismo excepto para establecer el color del texto en blanco. Luego reemplacé getActionBar().getThemedContext()
con getActivity().getBaseContext()
y ahora tiene un efecto.
Esta puede no ser la forma correcta y puede tener repercusiones en el futuro, pero por ahora lo tengo funcionando como quiero.
Usualmente uso mi adaptador personalizado que tiene un campo de selección int, y una función setSelection (int). Y en la función getView configuro el fondo de la vista de acuerdo con la posición == selección.
he aquí cómo lo he hecho y está funcionando, el breve concepto es mantener la posición del elemento seleccionado en el adaptador y llamar a notifyDataSetChanged
al llamar a notifyDatasetChanged
el método getView
se vuelve a llamar y en la vista ver la posición en la posición seleccionada cambiar la vista de fondo . Aquí está el código:
Adaptador de navegaciónDista de vista de lista
public class MenuAdapter extends BaseAdapter {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private Context mContext;
private String name;
private int profile;
private int mIcons[];
private int selectedPosition = 0;
private String mNavTitles[];
private LayoutInflater mInflater;
public MenuAdapter(String titles[], int icon[], String Name, int profile) {
mNavTitles = titles;
mIcons = icon;
name = Name;
this.profile = profile;
}
public MenuAdapter(String Titles[], int Icons[], Context mContext) {
mNavTitles = Titles;
mIcons = Icons;
this.mContext = mContext;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mNavTitles.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(R.layout.item_row, parent, false);
TextView textView = (TextView) convertView.findViewById(R.id.rowText);
ImageView imageView = (ImageView) convertView.findViewById(R.id.rowIcon);
final LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.outerLayout);
imageView.setImageResource(mIcons[position]);
textView.setText(mNavTitles[position]);
if (position == selectedPosition)
layout.setBackgroundColor(mContext.getResources().getColor(R.color.app_bg));
else
layout.setBackgroundColor(mContext.getResources().getColor(R.color.normal_bg));
return convertView;
}
public void setSelectedPosition(int position) {
this.selectedPosition = position;
}
}
en tu actividad haz esto
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
mMenuAdapter.setSelectedPosition(position - 1);
mMenuAdapter.notifyDataSetChanged();
}
}
si alguien todavía enfrenta alguna dificultad, siéntase libre de preguntar.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/list_item_back_pressed" android:state_pressed="true" />
<item android:state_activated="true"><color android:color="@color/primary_blue"/></item>
<item android:drawable="@color/list_item_back_normal"/>
</selector>