Цвет фона элемента меню навигации для выбранного элемента

Я использовал 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: нужно определить пространство имен приложения.