所选项目的导航抽屉项目背景颜色

时间:2014-03-13 09:48:17

标签: android android-listview android-navigation

我使用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_checkedstate_pressed适用于此情况,但当前所选项目仍为蓝色。

编辑: 我一直在研究这个,当创建适配器时,传递的上下文是getActionBar().getThemedContext()所以我在想如果我能找到正确的属性来分配我的动作栏样式我可以从那里改变它。我尝试了几个不同的属性而没有运气。有谁知道确切的属性?

我也意识到我是否放

<item name="android:activatedBackgroundIndicator">@drawable/nav_listview_selector</item>

在我的主题的主要部分并更改getActionBar().getThemedContext() getActivity.getBaseContext然后我可以更改颜色,但我不认为这是正确的方法。我认为应该使用主题背景。因此,如果有人知道可以放置activatedBackgroundIndicator的位置,以便在getActionBar.getThemedContext()中使用

EDIT2:

因此,用于listview的文本视图是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",但它对于选中/选中/激活没有效果,但它对按下有效。有人知道为什么吗?我怎么能改变它?

13 个答案:

答案 0 :(得分:51)

解决这个问题:

1-你在ListView下不需要android:listSelector。

2-(res / values)下打开(或创建) styles.xml

<!-- 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" >

参考/信用:Changing Navigation Drawer Selected Item Color from default blue

答案 1 :(得分:6)

这是我的工作方式,它正在运作,简短的概念维持适配器中所选项目的位置并调用{ {1}}在调用notifyDataSetChanged时再次调用notifyDatasetChanged方法,并在获取视图中检查所选位置上的位置是否更改背景视图。这是代码:

NavigationDrawer列表视图的适配器

getView

在您的活动中执行此操作

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;

}


}

如果还有人遇到任何困难,请随时提出。

答案 2 :(得分:6)

要更改“所选项目的导航抽屉项目背景颜色”,您可以使用attribut进行更新:

  

colorControlHighlight

在“ styles.xml ”中,它可能如下所示:

 num /= 2;
 rem = num % 2;

不要忘记在标记中应用样式

  

android.support.design.widget.NavigationView

例如,在您的 activity_main.xml 中,它可能如下所示:

rem = num % 2;
 num /= 2;

答案 3 :(得分:5)

我使用自定义适配器类实现了抽屉菜单。可能会帮助某人抽屉列表

<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(position,true);

答案 4 :(得分:4)

这对我有用:

  1. 首先将drawable item_bg.xml定义为:

    <?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>
    
  2. 然后在navigation_main_layout.xml中使用此drawable作为:

    <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" />
    

答案 5 :(得分:2)

<?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>

答案 6 :(得分:0)

除了为listSelector提供自定义选择器drawable之外,您还应该将列表项的背景资源设置为类似的选择器drawable,它具有不同状态的不同drawable。

答案 7 :(得分:0)

我通常使用具有int选择字段和setSelection(int)函数的自定义适配器。在getView函数中,我根据position == selection。

设置了视图的背景

答案 8 :(得分:0)

仍然不确定为什么它不起作用。但我发现它的方法是使用我自己的simple_list_item_activated布局传递给ArrayAdapter,除了将文本颜色设置为白色外基本相同。然后我将getActionBar().getThemedContext()替换为getActivity().getBaseContext(),现在它已经生效了。

这可能不是正确的方法,可能会在将来产生影响,但现在我按照我想要的方式工作。

答案 9 :(得分:0)

我知道为时已晚,但我已在我的应用中解决了这个问题。

请不要认为这很愚蠢,只需将“state_pressed”的位置改为top。

<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"/>

答案 10 :(得分:0)

在未来如果有人来这里使用导航抽屉活动(由活动提示窗口中的Studio提供)

答案是 -

在MainActivity中的OnCreate()之前使用它

    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);

并在MainActivity中的onNavigationItemSelected()中使用它(如果使用Navigation Drawer活动,则不需要编写此函数,它将添加到MainActivity中)。

 NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
    nav.setItemTextColor(csl);
    nav.setItemIconTintList(csl2);
    nav.setItemBackgroundResource(R.color.white);

提示 - 在onNavigationItemSelected()

中的If else Condition之前添加此代码

答案 11 :(得分:0)

这对我有用: 实现菜单抽屉不是通过使用列表填充导航视图,而是使用菜单项。

创建了这样的drawable:

<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方法中,将与所选活动对应的菜单项的ID设置为已选中。 并将drawable选择器文件实现到您的导航抽屉,如下所示

    app:itemBackground="@drawable/drawer_menu_selector"

fyi:需要定义你的应用程序&#39;命名空间。

答案 12 :(得分:0)

我在此问题上寻找解决方案,尝试了所有方法,只有这种解决方案对我有用。

您可以在此链接https://tuchangwei.github.io/2016/07/18/The-solution-that-the-menu-item-of-Navigation-View-can-t-change-its-background-When-it-is-selected-checked/

上找到它

归功于https://tuchangwei.github.io/