我非常喜欢导航抽屉中生成的选择器行为。
ImageView
和TextView
具有正确的颜色。在我的对话框中,我尝试通过使用以下布局来实现相同的效果。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="?android:attr/selectableItemBackground"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<ImageView
android:duplicateParentState="true"
android:id="@+id/image_view"
android:paddingStart="24dp"
android:paddingLeft="24dp"
android:paddingEnd="16dp"
android:paddingRight="16dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="?attr/labelIconSelector" />
<TextView
android:duplicateParentState="true"
android:textSize="16sp"
android:id="@+id/text_view"
android:layout_width="0dp"
android:width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textColor="?attr/labelTextViewColorSelector" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_label_white_24dp"
android:tint="@color/colorPrimaryBrown" />
</item>
<item>
<bitmap android:src="@drawable/ic_label_white_24dp"
android:tint="#ff757575" />
</item>
</selector>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/colorPrimaryBrown" />
<item android:color="@color/primaryTextColorLight" />
</selector>
在我的ArrayAdapter
中,我尝试通过view.setSelected(true)
public class LabelArrayAdapter extends ArrayAdapter<TabInfo> {
private static class ViewHolder {
public final ImageView imageView;
public final TextView textView;
public ViewHolder(View view) {
imageView = view.findViewById(R.id.image_view);
textView = view.findViewById(R.id.text_view);
Utils.setCustomTypeFace(textView, Utils.ROBOTO_REGULAR_TYPE_FACE);
}
}
public LabelArrayAdapter(@NonNull Context context, List<TabInfo> tabInfos) {
super(context, R.layout.label_array_adapter, tabInfos);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = LayoutInflater.from(this.getContext());
view = inflator.inflate(R.layout.label_array_adapter, null);
final ViewHolder viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
// Not sure why this is required.
view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, Utils.dpToPixel(48)));
} else {
view = convertView;
}
ViewHolder holder = (ViewHolder) view.getTag();
TabInfo tabInfo = getItem(position);
if (tabInfo == null) {
holder.imageView.setVisibility(View.INVISIBLE);
holder.textView.setText("(No label)");
} else {
holder.imageView.setVisibility(View.VISIBLE);
holder.textView.setText(tabInfo.getName());
}
if (position == 0) {
view.setSelected(true);
} else {
view.setSelected(false);
}
return view;
}
}
这是我尝试通过Dialog
显示DialogFragment
的方式。
return new AlertDialog.Builder(getActivity())
.setTitle("Move to")
.setAdapter(new LabelArrayAdapter(this.getContext(), customTabInfos), (dialog, which) -> {
})
.create();
但是,它无法正常工作,如下面的屏幕截图所示。第1项似乎没有被选中。
我可以知道,有什么我错过的吗?
如果它的背景是?android:attr / selectableItemBackground(AlertDialog中的ListView)
如何使View看起来像是以编程方式选择的?使用
alertDialog.getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
alertDialog.getListView().setSelection(position);
也不会帮助。
答案 0 :(得分:0)
这是一种方法,使用可绘制的图层列表作为表示所选项目的视图组的背景。
首先,对于API 21+,我们定义了一个图层列表drawable,它在选择项目时显示所选颜色。必须调用View#setSelected()
才能生效。
layer_list.xml(v21)
演示的 color/selected
为#2000ffe5
。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<selector>
<item
android:drawable="@color/selected"
android:state_selected="true" />
</selector>
</item>
<item
android:id="@+id/selectableBackground"
android:drawable="?android:selectableItemBackground" />
</layer-list>
对于API&lt; 21,我们不能在图层列表中使用android:drawable="?android:selectableItemBackground"
,因此我们将回到替代但类似的视觉提示。
layer_list&lt; API 21
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<selector android:exitFadeDuration="@android:integer/config_shortAnimTime">
<item
android:drawable="@color/selected"
android:state_pressed="false"
android:state_selected="true" />
<item
android:drawable="@color/selectable_background"
android:state_pressed="true" />
</selector>
</item>
</layer-list>