使用自定义适配器时,ListView 不会使用主题设置样式
ListView doesn't get styled with theme when using custom adapter
我有包含三个片段的迷你演示。一个直接显示两个 TextView
和一个 editview
,下一个将相同的布局视为带有自定义适配器的列表中的行,第三个显示带有标准适配器的普通列表 (simple_list_item_1)
activity使用标准主题(Theme.AppCompat.Light.DarkActionBar
),我没有修改过。
我原以为所有三个块的样式都相似。相反,带有自定义适配器的第二个块似乎根本没有根据浅色主题设置样式。 (见文末截图post)
理想情况下,我希望自定义列表的行的样式与第一个块一样。或者,我想应用第三个块的样式。然而,所有的字体和背景似乎都有些颜色不对,我不确定如何找出当前用作主题一部分的内容。因此,通过手动指定文本颜色、大小、背景等来固定中间块的样式不是一种选择。
整个demo请参考MiniDemo
这是item_row.xml布局文件(顶层相对布局标签似乎被编辑器剥离了。完整布局请转到gitlab)
<TextView android:text="large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceLarge"
android:id="@+id/text1_field" />
<TextView android:text="large inverse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text2_field"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="5"
android:id="@+id/edit_field"
android:layout_alignParentRight="true" />
</RelativeLayout>
自定义片段。同样,完整版在 gitlab
public class CustomItemFragment extends ListFragment {
String[] DATA = new String[] {"foo1", "foo2", "foo3"};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ItemAdapter adapter = new ItemAdapter(this.getActivity().getApplicationContext(), DATA);
setListAdapter(adapter);
}
}`
适配器(gitlab):
public class ItemAdapter extends BaseAdapter {
private static final String TAG = ItemAdapter.class.getSimpleName();
private final Context mContext;
private final String[] mData;
public ItemAdapter(Context mContext, String[] data) {
this.mContext = mContext;
this.mData = data;
}
@Override
public int getCount() {
return mData.length;
}
@Override
public Object getItem(int position) {
return mData[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) LayoutInflater.from(mContext);
View rowView = inflater.inflate(R.layout.item_row, parent, false);
TextView text1View = (TextView) rowView.findViewById(R.id.text1_field);
TextView text2View = (TextView) rowView.findViewById(R.id.text2_field);
EditText editText = (EditText) rowView.findViewById(R.id.edit_field);
text1View.setText(mData[position]);
text2View.setText(mData[position]);
editText.setText(Integer.toString(position));
return rowView;
}
然后,这是一个演示效果的截图。
哎呀,我刚刚找到答案,来自 Use android.R.layout.simple_list_item_1 with a light theme
的提示
诀窍是删除getActivityContext()
并在创建适配器时直接传入activity对象。悲伤但有效。
不要使用 getApplicationContext()
,而是使用 getBaseContext()
或 getContext()
更多信息:Theme/Style is not applied when inflater used with ApplicationContext
我有包含三个片段的迷你演示。一个直接显示两个 TextView
和一个 editview
,下一个将相同的布局视为带有自定义适配器的列表中的行,第三个显示带有标准适配器的普通列表 (simple_list_item_1)
activity使用标准主题(Theme.AppCompat.Light.DarkActionBar
),我没有修改过。
我原以为所有三个块的样式都相似。相反,带有自定义适配器的第二个块似乎根本没有根据浅色主题设置样式。 (见文末截图post)
理想情况下,我希望自定义列表的行的样式与第一个块一样。或者,我想应用第三个块的样式。然而,所有的字体和背景似乎都有些颜色不对,我不确定如何找出当前用作主题一部分的内容。因此,通过手动指定文本颜色、大小、背景等来固定中间块的样式不是一种选择。
整个demo请参考MiniDemo
这是item_row.xml布局文件(顶层相对布局标签似乎被编辑器剥离了。完整布局请转到gitlab)
<TextView android:text="large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceLarge"
android:id="@+id/text1_field" />
<TextView android:text="large inverse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text2_field"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="5"
android:id="@+id/edit_field"
android:layout_alignParentRight="true" />
</RelativeLayout>
自定义片段。同样,完整版在 gitlab
public class CustomItemFragment extends ListFragment {
String[] DATA = new String[] {"foo1", "foo2", "foo3"};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ItemAdapter adapter = new ItemAdapter(this.getActivity().getApplicationContext(), DATA);
setListAdapter(adapter);
}
}`
适配器(gitlab):
public class ItemAdapter extends BaseAdapter {
private static final String TAG = ItemAdapter.class.getSimpleName();
private final Context mContext;
private final String[] mData;
public ItemAdapter(Context mContext, String[] data) {
this.mContext = mContext;
this.mData = data;
}
@Override
public int getCount() {
return mData.length;
}
@Override
public Object getItem(int position) {
return mData[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) LayoutInflater.from(mContext);
View rowView = inflater.inflate(R.layout.item_row, parent, false);
TextView text1View = (TextView) rowView.findViewById(R.id.text1_field);
TextView text2View = (TextView) rowView.findViewById(R.id.text2_field);
EditText editText = (EditText) rowView.findViewById(R.id.edit_field);
text1View.setText(mData[position]);
text2View.setText(mData[position]);
editText.setText(Integer.toString(position));
return rowView;
}
然后,这是一个演示效果的截图。
哎呀,我刚刚找到答案,来自 Use android.R.layout.simple_list_item_1 with a light theme
的提示诀窍是删除getActivityContext()
并在创建适配器时直接传入activity对象。悲伤但有效。
不要使用 getApplicationContext()
,而是使用 getBaseContext()
或 getContext()
更多信息:Theme/Style is not applied when inflater used with ApplicationContext