自定义按钮处理状态

我只是想用一个RelativeLayout来制作一个按钮,所以我可以在里面放置尽可能多的drawable或者textfields,并且我希望所有的孩子都能够改变颜色或者可以绘制到RelativeLayout状态。 如果我按下自定义按钮,它必须具有正确的颜色和可绘制的。

下面是一些代码(例如,只有一个TextView和一个ImageView):

在main.xml中,父布局是一个LinearLayout,下面是自定义按钮:

<RelativeLayout
    android:id="@+id/relativelayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dip"
    android:layout_marginRight="10dip"
    android:layout_marginTop="25dp"
    android:background="@drawable/background_state"
    android:clickable="true"
    android:focusable="true" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dip"
        android:clickable="true"
        android:text="Awesome text"
        android:textColor="@color/textview_state"
        android:textSize="20sp" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="51dip"
        android:layout_height="51dip"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dip"
        android:clickable="true"
        android:src="@drawable/imageview_state" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentTop="true"
        android:background="#FFFFFF"
        android:clickable="false"
        android:focusable="false" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="50dip"
        android:background="#D3E992"
        android:clickable="false"
        android:focusable="false" />

</RelativeLayout>

在可绘制文件夹中,imageview_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/imageview_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/imageview" />
</selector>

在drawable-hdpi文件夹中,有imageview.png和imageview_pressed.png。

在颜色文件夹中,background_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="#E0EBCC"/>
    <item android:drawable="#669900"/>

</selector>

在color文件夹中,textview_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#000"/>
    <item android:color="#FFF"/>
</selector>

到目前为止,当我单击RelativeLayout时,RelativeLayout的背景会正确更改,但ImageView和TextView保持默认状态。 我试着为TextView和ImageView设置属性android:clickable =“true”,但只有按下的元素会改变它的状态,而不是整个按钮。

任何帮助实现我的目标是欢迎:)


你可以在你的相对布局上设置一个OnClickListener,然后在你的代码中点击时做一些事情。 像这样的伪代码。

RelativeLayout rl = (RelativeLayout) findViewById(R.id.myRelLayout);
rl.setOnClickListener(.....) {
    button1.setBackgroudDrawable(R.drawable.newColor).
    text1.setText("Something");
}

正如Booger所建议的那样,我使用了一个OnTouchListener,并且我基本上会在里面进行更改。 它完美的作品,我会首选一个XML解决方案,但无论如何。 在我的活动中:

RelativeLayout relativeLayout= (RelativeLayout) findViewById(R.id.relativelayout);
relativeLayout.setOnTouchListener(...);

监听器的实现:

    public boolean onTouch(View v, MotionEvent event)
    {
        TextView text = (TextView) findViewById(R.id.textview);
        ImageView image = (ImageView) findViewById(R.id.imageview);
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativelayout);
        if (event.getAction() == android.view.MotionEvent.ACTION_DOWN)
        {
            layout.setBackgroundResource(R.color.background_pressed);
            text.setPressed(true);
            image.setPressed(true);

        } else if (event.getAction() == android.view.MotionEvent.ACTION_UP)
        {
            layout.setBackgroundResource(R._background);
            text.setPressed(false);
            image.setPressed(false);
        }
        return false;
    }

尽管RelativeLayout的背景使用xml正确地改变了它的状态,但是我用编程方式完成所有的事情,因为xml比代码快,所以延迟是可见的。 现在RelativeLayout背景属性设置为:

 android:background="@color/background"

不再提及选择器。

链接地址: http://www.djcxy.com/p/84709.html

上一篇: Custom Button handling state

下一篇: dynamic set image path