使用选择器设置imageView背景问题

时间:2012-04-15 14:25:43

标签: android android-layout android-listview selector

我在列表视图项中设置click事件时遇到问题。

这是默认情况下列表的显示方式:

enter image description here

按下红色图像(红色变为蓝色)时的外观如下: enter image description here

这是我按下列表项的时候: enter image description here

如您所见,红色图像也变为蓝色,即使我没有按下按钮。我想要的是,当我按下列表项时,红色图像没有变化,并且它保持不变。

我尝试将android:drawSelectorOnTop="true"添加到listview部分的xml文件中,但它不起作用。我也尝试使用选择器参数修复它,但仍然没有成功。

我上传了一些代码,接下来的部分是在不同的xml文件中,所以不要混淆。

编辑:我想使用操作系统项目列表背景颜色,而不是我自己的颜色android:listSelector,因为我已经使用过。

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@color/blue" />
    <item android:drawable="@color/red"/> 

</selector>

-----------------------新文件---------------------- ----------

<ListView android:id="@+id/list_theme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_above="@id/contbtn_themelist"
    android:stackFromBottom="false"
    android:transcriptMode="disabled"/>

-----------------------新文件---------------------- ----------

<RelativeLayout android:id="@+id/edit_back"
    android:layout_width="80dp"
    android:layout_height="77dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:background="@drawable/edit_skin_selector2"  >

    <ImageView
        android:id="@+id/skinEdit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:scaleType="fitXY"
        android:src="@android:drawable/ic_menu_edit"
        android:layout_centerInParent="true" />
</RelativeLayout>

编辑: row.xml

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:paddingBottom="5dip"
        android:paddingLeft="2dip"
        android:paddingRight="2dip"
        android:paddingTop="5dip" >

        <ImageView
            android:id="@+id/itemlist_checkedd"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_checkitem" />

        <ImageView
            android:id="@+id/skinpreview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@id/itemlist_checkedd"
            android:scaleType="fitXY" />

        <RelativeLayout android:id="@+id/edit_back"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@drawable/edit_skin_selector2"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true">

            <ImageView 
                android:id="@+id/skinEdit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@android:drawable/ic_menu_edit"
                android:layout_centerInParent="true" />
        </RelativeLayout>

        <ImageView
            android:id="@+id/separator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dip"
            android:layout_toLeftOf="@id/edit_back"
            android:src="@drawable/separator" />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="15dip"
            android:layout_toLeftOf="@id/separator"
            android:layout_toRightOf="@id/skinpreview"
            android:textAppearance="?android:attr/textAppearanceLarge" />

 </RelativeLayout>

任何帮助都会很棒,谢谢。

6 个答案:

答案 0 :(得分:4)

我遇到了这个问题,我使用这里的技术解决了这个问题:

http://android.cyrilmottier.com/?p=525

请看段落“别按一切!”

答案 1 :(得分:1)

您应该尝试使用android:duplicateParentState="false"表示不要将父级的可绘制状态用于其子级。

<ImageView
    android:id="@+id/skinEdit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:scaleType="fitXY"
    android:src="@android:drawable/ic_menu_edit"
    android:layout_centerInParent="true" 

    android:duplicateParentState="false"
   />

更新

使您的按钮的直接父级不可点击,即在row.xml中向其添加android:clickable="false",看看是否能解决问题。现在点击项目不会改变按钮状态。但点击按钮仍然可以正常工作。

更新

        <ImageButton 
            android:id="@+id/skinEdit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"

            android:src="@android:drawable/ic_menu_edit"
            android:scaleType="center"
            android:background="@android:drawable/state_redblue_drawable"
            android:padding=10dp
            android:clickable="true"/>

答案 2 :(得分:1)

之前我找到了这个解决方案..我没有链接,但你必须这样做。为包含你的botton的linearlayout创建一个自定义类,然后覆盖setPressed状态,不做任何事情;

public class UnpresseableLinearLayout extends LinearLayout
{
    public UnpresseableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

@Override
    public void setPressed(boolean pressed)
    {
        // Do nothing here. Specifically, do not propagate this message along
        // to our children so they do not incorrectly display a pressed state
        // just because one of their ancestors got pressed.
    }
}

这将解决问题,因为android:duplicateParentState =“false”在这种情况下不起作用。

将xml中的linearlayout替换为无法接收按下操作的xml

编辑: 对不起,我刚刚看到你正在使用RelativeLayout ..但我认为这是相同的。

答案 3 :(得分:0)

尝试使imageView可点击......

<ImageView
        android:id="@+id/skinEdit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:scaleType="fitXY"
        android:src="@android:drawable/ic_menu_edit"
        android:layout_centerInParent="true"
           android:focussable="false"
           android:focussableInTouchMode="false"
           android:clickable="true" />

或..

将选择器状态更改为

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:drawable="@color/blue" />
    <item android:drawable="@color/red"/> 

</selector>

答案 4 :(得分:0)

确定。首先对不起,迟到的回复。

在继续解决之前,让我们看看你从问题中得到了什么。

你想要的是,当你点击列表项时,那个红色图像不会转换为蓝色,如果用户点击红色图像,那么它应该转换为红色。但不是整个列表 - 项目正确???

如果是这样,那么就没有什么可以做的了。

不要放选择器。当您单击特定视图时想要更改背景颜色时,选择器基本上是用于。

是的,如果你想在用户点击它时改变RedImage的颜色,那么再次不要在那里使用选择器。但只需在运行时更改该图像的颜色。

如:

@Override 
        public void onClick(View view) { 
                 YOUR_VIEW.setBackgroundColor(0xffff0000);

        } 

希望它会对你有所帮助。如果它不能像你想要的那样工作那么请告诉我。

我想帮助你。

享受:)

答案 5 :(得分:0)

您使用什么来连接listAdapter列表。要完成你所说的内容,需要一个扩展BaseAdapter的新类,并在该类的getView事件上更改背景图像。

然后在您的主要活动上,您可以设置onlistItemClick来处理列表项的点击事件。