如果后台是?android:attr / selectableItemBackground(AlertDialog中的ListView)

时间:2018-04-25 19:22:40

标签: android

我非常喜欢导航抽屉中生成的选择器行为。

enter image description here

  1. 有涟漪效应。
  2. 选择时,ImageViewTextView具有正确的颜色。
  3. 在我的对话框中,我尝试通过使用以下布局来实现相同的效果。

    label_array_adapter.xml

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

    labelIconSelector

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

    labelTextViewColorSelector

    <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项似乎没有被选中。

    enter image description here

    我可以知道,有什么我错过的吗?

    如果它的背景是?android:attr / selectableItemBackground(AlertDialog中的ListView)

    如何使View看起来像是以编程方式选择的?

    更新

    使用

    alertDialog.getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    alertDialog.getListView().setSelection(position);
    

    也不会帮助。

1 个答案:

答案 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>

enter image description here

对于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>

enter image description here