Цвет фона элемента меню навигации для выбранного элемента
Я использовал Android Studio для реализации навигационного ящика, и я не могу получить синий цвет, который используется для отображения раздела, в котором мы сейчас находимся.
Я пробовал много вещей, в настоящее время я использую listSelector, который выглядит так:
<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>
Я также пробовал state_checked
. state_pressed
работает в этой ситуации, но текущий выбранный элемент по-прежнему остается синим.
EDIT:
Я изучаю это больше, и когда создается адаптер, этот контекст передается getActionBar().getThemedContext()
, поэтому я думаю, что если я найду подходящий атрибут для привязки к моему стилю действия, я могу его изменить. Я пробовал несколько разных атрибутов без везения. Кто-нибудь знает точный атрибут?
Я также понял, что если я поставлю
<item name="android:activatedBackgroundIndicator">@drawable/nav_listview_selector</item>
в основной части моей темы и измените getActionBar().getThemedContext()
на getActivity.getBaseContext
, тогда я могу изменить цвет, но я не думаю, что это правильный путь. Я думаю, что тематический контекст должен использоваться. Поэтому, если кто-нибудь знает, где можно поставить activatedBackgroundIndicator
так, чтобы он использовался в getActionBar.getThemedContext()
EDIT2:
Таким образом, текстовое представление, используемое для списка, является одним из SDK, которое выглядит так:
<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"
/>
Итак, я пробовал модифицировать "?android:attr/activatedBackgroundIndicator"
на уровне темы, но он не влияет на check/selected/activated, но для нажатий. Кто-нибудь знает, почему это? И как я могу его изменить?
Ответы
Ответ 1
Все еще не уверен, почему это не работает. Но способ, которым я нашел это, - использовать мой собственный макет simple_list_item_activated
, который должен быть передан в ArrayAdapter, который был в основном тем же, за исключением того, что цвет текста был белым. Затем я заменил getActionBar().getThemedContext()
на getActivity().getBaseContext()
, и теперь он имеет эффект.
Это может быть неправильным и может иметь последствия в будущем, но на данный момент я работаю так, как хочу.
Ответ 2
Чтобы решить эту проблему:
1- Вам не нужен андроид: listSelector в вашем ListView.
2- Открыть (или Создать) styles.xml в (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- Под папкой res/drawable создайте файл 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- Под res/drawable создайте red_color.xml/ light_gray_color.xml (или любое другое имя) и добавьте нужный цвет Hex:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#C8FF0000"/>
</shape>
5- Откройте проект AndroidManifest.xml и добавьте тег android: theme (если не существует)
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Справка/кредит: Изменение отображаемого ящика выбранного цвета товара по умолчанию по умолчанию
Ответ 3
вот как я это сделал и он работает, краткая концепция поддерживает позицию выбранного элемента в адаптере и вызывает notifyDataSetChanged
при вызове notifyDataSetChanged
метод getView
вызывается снова и в режиме просмотра позиция позиции в выбранной позиции меняет вид фона. Вот код:
Адаптер представления списка NavigationDrawer
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;
}
}
в вашей деятельности сделайте это
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
mMenuAdapter.setSelectedPosition(position - 1);
mMenuAdapter.notifyDataSetChanged();
}
}
если кто-то все еще сталкивается с какой-либо трудностью, не стесняйтесь спрашивать.
Ответ 4
У меня есть меню ящиков с пользовательским классом адаптера. Может быть, это поможет кому-то списку ящиков
<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"/>
Добавьте это в список элементов списка listview
yourlistview.setItemChecked(позиция, true);
Ответ 5
Чтобы изменить "цвет фона элемента меню" Навигация "для выбранного элемента, вы можете сделать это с атрибутом:
colorControlHighlight
В вашем "styles.xml" это может выглядеть так:
<style name="YourStyleNameFor.NavigationDrawer" parent="ThemeOverlay.AppCompat.Light">
<item name="colorControlHighlight">@color/your_highlight_color</item>
</style>
Не забудьте применить свой стиль в теге:
android.support.design.widget.NavigationView
Например, в вашем файле activity_main.xml он может выглядеть так:
<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" />
Ответ 6
Это работает для меня:
-
Сначала определите drawable item_bg.xml
as:
<?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>
-
Затем используйте этот drawable в navigation_main_layout.xml
как:
<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" />
Ответ 7
<?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>
Ответ 8
В дополнение к предоставлению настраиваемого селектора, предназначенного для listSelector, вы также должны установить фоновый ресурс элемента списка на аналогичный селектор, который имеет разные чертежи для разных состояний.
Ответ 9
Обычно я использую свой пользовательский адаптер, который имеет поле выбора int и функцию setSelection (int). И в функции getView я устанавливаю фон представления в соответствии с выбором position ==.
Ответ 10
Я знаю его слишком поздно, но я решил эту проблему в своем приложении.
Pls не думает, что это глупо, просто измените положение "state_pressed" на верх.
<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"/>
Ответ 11
В будущем, если кто-нибудь придет сюда, используя активность навигационного ящика (предоставленный Studio в окне подсказки активности)
Ответ:
Используйте это до OnCreate() в 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);
и используйте это в onNavigationItemSelected() в MainActivity (вам не нужно писать эту функцию, если вы используете активность навигационного ящика, она будет добавлена в MainActivity).
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
Совет - добавьте этот код раньше Если else Условие в onNavigationItemSelected()
Ответ 12
Это сработало для меня:
реализованный ящик меню не путем заполнения списка навигации списком, а с элементами меню.
создал такой способ:
<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>
и в методе onCreate задайте идентификатор элемента меню, который соответствует выбранному действию, как отмечено.
и реализовать выталкиваемый селекторный файл в вашем навигационном ящике, подобном этому
app:itemBackground="@drawable/drawer_menu_selector"
fyi: нужно определить пространство имен приложения.