这个问题在SO上已经被问了很多,我已经引用了所有的答案。我的导航抽屉上的所选项目仍然保留默认的Holo蓝色背景。我是Java的新手,我对.setAdapter()
的“上下文”部分感到困惑
我的项目是一个Activity,它使用导航抽屉交换了多个片段。
这是我的适配器:
mDrawerListView.setAdapter(new ArrayAdapter<String>(
// First parameter - Context
getActionBar().getThemedContext(),
// Second parameter - Layout for the row
R.layout.fragment_navigation_drawer_list_item,
// Third parameter - ID of the TextView to which the data is written
android.R.id.text1,
// Forth - the Array of data
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
getString(R.string.title_section4),
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
此处的上下文来自Android Studio中的“预先烹饪”导航抽屉。我认为这将是答案Navigation Drawer item background colour for selected item。所以我将我的上下文更改为getActivity().getBaseContext(),
,但这并没有改变任何内容。
我的主题(styles.xml
):
<resources>
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
<item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<!-- Navigation Drawer styling -->
<style name="NavDrawerItemSelected" parent="AppBaseTheme">
<item name="android:activatedBackgroundIndicator">@drawable/activated_background</item>
</style>
</resources>
'drawables'中的 activated_background
dir:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@color/green" />
<item android:state_selected="true" android:drawable="@color/green" />
<item android:state_pressed="true" android:drawable="@color/green" />
<item android:state_checked="true" android:drawable="@color/green" />
<item android:drawable="@android:color/transparent" />
</selector>
我不知道应该使用上述哪些状态,所以我添加了我能找到的所有状态
最后,当选择一个项目时,会调用mDrawerListView.setItemChecked(position, true);
一切都有效,除了自定义主题样式。 (最小API = 11,在API 17 AVD上测试)
答案 0 :(得分:25)
我遇到了这个问题。问题是R.layout.fragment_navigation_drawer_list_item
的背景是需要改变为可绘制的。只需将android:background="@drawable/activated_background"
添加到布局中即可。
答案 1 :(得分:9)
我无法找到这个问题的完整明确答案,所以这里是:
步骤1.指定适配器将使用的列表项布局,在此示例中,我们指定:R.layout.fragment_navigation_drawer_list_item
像这样:
mDrawerListView.setAdapter(new ArrayAdapter<String>(
// First parameter - Context
getActionBar().getThemedContext(),
// Second parameter - Layout for the row
R.layout.fragment_navigation_drawer_list_item,
// Third parameter - ID of the TextView to which the data is written
android.R.id.text1,
// Forth - the Array of data
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
getString(R.string.title_section4),
}))`
步骤2.创建并自定义fragment_navigation_drawer_list_item.xml
以指定一个具有选择器的drawable:android:background="@drawable/activated_background"
完整的例子:
<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:minHeight="?android:attr/listPreferredItemHeightSmall"
android:background="@drawable/activated_background" />
步骤3.在activated_background.xml
文件中创建和自定义选择器,就像在问题中一样,它将如下所示:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@color/green" />
<item android:state_selected="true" android:drawable="@color/green" />
<item android:state_pressed="true" android:drawable="@color/green" />
<item android:state_checked="true" android:drawable="@color/green" />
<item android:drawable="@android:color/transparent" />
</selector>