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

我使用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在这种情况下工作,但是当前选中的项目仍然是蓝色的。

编辑:我一直在审查这个更多,当适配器创build的上下文传递是getActionBar().getThemedContext()所以我想如果我能find正确的属性分配给我的操作栏样式我可以改变它从那里。 我已经尝试了几个不同的属性,没有运气。 有谁知道确切的属性?

我也意识到如果我把

<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" ,但对于选中/选中/激活没有任何作用,但是按下了。 有人知道为什么吗? 而我该如何改变它?

Solutions Collecting From Web of "导航选定项目的抽屉项目背景颜色"

为了解决这个问题:

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

2-在(res / values)下打开(或创build) 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文件夹下创builddrawer_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下创buildred_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:主题标签(如果不存在)

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > 

参考/贷记: 更改导航抽屉选定的项目颜色从默认的蓝色

这里是我怎么做的,它正在工作,简单的概念是保持在适配器中选定的项目的位置 ,调用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(); } } 

如果任何人仍然面临任何困难,请随时询问。

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

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

添加这个项目列表中的列表视图yourlistview.setItemChecked(position,true);

要改变“ 导航抽屉项目的背景颜色选定的项目 ”,你可以用attribut:

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

这对我有用:

  1. 首先定义一个可绘制的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" /> 
 <?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> 

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

我通常使用具有intselect字段和setSelection(int)函数的自定义适配器。 在getView函数中,我根据位置==select来设置视图的背景。

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

这可能不是正确的方法,将来可能会产生影响,但现在我已经按照自己的意愿工作了。

我知道它太晚了,但我已经在我的应用程序中解决了这个问题。

请不要认为这很愚蠢,只是简单地将“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"/> 

在未来如果有人来这里使用,导航抽屉活动(由活动提示窗口中的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()中的其他条件之前添加此代码

这工作对我来说:实现菜单抽屉不是通过填充导航视图列表,但与菜单项。

像这样创build了一个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为选中状态。 并实现可绘制的select器文件到你的导航抽屉这样

  app:itemBackground="@drawable/drawer_menu_selector" 

fyi:需要定义你的'app'命名空间。