如何动态地将按下的颜色更改为选择器的其他颜色?

时间:2014-10-09 08:18:32

标签: java android selector

这是我的列表选择器:(item_selector.xml)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@color/orange" />
    <item android:state_focused="true" android:drawable="@color/orange" />
    <item android:state_pressed="true" android:drawable="@color/orange" />
    <item android:drawable="@color/transparent" />
</selector>

这是我的行列(row_item.xml)

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/alarm_item_drawer_selector"
    >

    <ImageView 
        android:id="@+id/item_icon"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerHorizontal="true"
        android:paddingTop="5dp"
        android:paddingBottom="2dp"
        android:src="@drawable/ic_launcher"/>

    <TextView      
        android:id="@+id/item_title"
        style="@style/DrawerItemTextStyle"
        android:textColor="@color/text_drawer_item_selector"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/item_icon" />

</RelativeLayout>

我想改变android:state_pressed =&#34; true&#34;机器人:抽拉=&#34; @色/橙色&#34;动态的其他颜色。我的目标是使每一行的按压颜色不同。有可能吗?

3 个答案:

答案 0 :(得分:9)

对每个项目影响一个新的StateListDrawable。

    StateListDrawable stateListDrawable= new StateListDrawable();
    stateListDrawable.addState(new int[] {android.R.attr.state_pressed}, new ColorDrawable(getContext().getResources().getColor(R.color.anycolor)));
    stateListDrawable.addState(new int[] {android.R.attr.state_focused}, new ColorDrawable(getContext().getResources().getColor(R.color.anycolor)));
    stateListDrawable.addState(new int[] {android.R.attr.state_selected}, new ColorDrawable(getContext().getResources().getColor(R.color.anycolor)));
    stateListDrawable.addState(new int[] {}, new ColorDrawable(getContext().getResources().getColor(R.color.anycolor)));

    view.setBackgroundDrawable(stateListDrawable);

答案 1 :(得分:1)

我在我的一个项目中所做的是创建了一个静态方法,它可以获取任何视图,并将其背景更改为我制作的六种不同颜色选择器之一。这里的诀窍是没有尝试更改列表视图选择器,您想要更改列表视图布局的父布局的背景。

以下是一个例子:

listview.xml(listview的实际内容)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/parent"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:id="@+id/text"
    android:text="Text"
    android:padding="20dp"/>

</LinearLayout>
我的适配器中的

getView()方法:

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    Holder holder = new Holder();
    if (view == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        view = inflater.inflate(R.layout.listview, viewGroup, false);
    } else {

        holder = (Holder) view.getTag();
    }

    holder.parent = (LinearLayout) view.findViewById(R.id.parent);
    setRandomListViewSelector(holder.parent);
    holder.text = (TextView) view.findViewById(R.id.text);
    holder.text.setText(strs.get(i));

    return view;
}

更改背景的静态方法:

public static void setRandomListViewSelector(View parentView) {

        int i = new Random().nextInt(2);

        switch (i) {
            case 0:
                parentView.setBackgroundResource(R.drawable.list_selector_blue);
                break;

            case 1:
                parentView.setBackgroundResource(R.drawable.list_selector_red);
                break;
       }

}

list_selector_blue.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
    <shape>
        <solid android:color="@android:color/holo_blue_dark"/>
    </shape>
</item>
</selector>

在我的示例中,我只使用Random类随机生成0到1之间的数字。如果您想要更多控件,可以创建一个全局变量并将其递增1,以便您可以更好地控制在什么背景颜色设置。

答案 2 :(得分:0)

如果要动态更改它,则必须通过代码执行此操作。为此,您必须使用onTouchListener,因为您想知道何时触摸并释放视图。

    final TextView textView =findViewById(R.id.item_title);
    textView.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent)
        {
            switch (motionEvent.getAction()){
                case MotionEvent.ACTION_DOWN:
                    textView.setTextColor(Color.RED);
                    break;
                case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:
                    textView.setTextColor(Color.BLACK);
                    break;
            }
            return false;
        }
    });

上面的代码会在您按下时更改textview的文本颜色。将Color.RED更改为您想要的颜色