Android:有没有更好的方法来创建具有两个状态的View?

时间:2014-02-18 15:29:33

标签: android android-layout

我正在尝试创建一个具有两种状态的视图 - 它具有“就绪”状态和“已按下”状态。

目前实施的方式似乎效率低下。按钮的两种状态都按如下方式编码到布局中:

<!-- 'ready' state button -->
<RelativeLayout
            android:id="@+id/strut_button_1"
            style="@style/StrutButton" >

            <TextView
                android:id="@+id/strut_1_badge"
                style="@style/Strut1Badge"
                android:text="1" />

            <TextView
                android:id="@+id/strut_1_value"
                style="@style/StrutValue"
                android:text="@string/placeholder_text_short" />

        </RelativeLayout>

<!-- 'pressed' state button -->
        <RelativeLayout
            android:id="@+id/strut_button_1_complete"
            style="@style/StrutButtonComplete"
            android:visibility="gone" >

            <TextView
                android:id="@+id/strut_1_badge"
                style="@style/Strut1Badge"
                android:text="1" />

            <TextView
                android:id="@+id/strut_1_value"
                style="@style/StrutValueComplete"
                android:text="@string/placeholder_text_short" />

            <TextView
                style="@style/CheckMark"
                android:text="\u2714"
                android:layout_gravity="center_vertical|right"  />

        </RelativeLayout>

我设置了一些处理程序来切换按钮的可见性。当按下“就绪”状态按钮时,它将其可见性变为GONE,并将“按下”状态按钮的可见性变为SHOW。

我考虑过使用按钮选择器,但选择器似乎无法呈现我需要的按钮布局。有没有比我现在更好的方法呢?

2 个答案:

答案 0 :(得分:0)

尝试使用设置状态的XML drawable:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/color_radio_selected" android:state_focused="true"/>
    <item android:drawable="@drawable/color_radio_selected" android:state_pressed="true"/>
    <item android:drawable="@drawable/color_radio_selected" android:state_selected="true"/>
    <item android:drawable="@drawable/color_radio_selected" android:state_checked="true"/>
    <item android:drawable="@drawable/color_radio_unselected"/>

</selector>

以上设置为任何按下/聚焦状态选择单选按钮的状态

然后,您可以将此按钮指定为按钮的背景,如下所示:

<RadioButton
        android:id="@+id/btn_network"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/menu_background"
        android:button="@android:color/transparent"
        android:drawableTop="@drawable/color_radio_button   <!--    HERE --!>
        android:gravity="center"
        android:paddingBottom="8dp"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:paddingTop="14dp"
        android:text="@string/network"
        android:textColor="@drawable/menu_button_text_white"
        android:textSize="14sp" />

答案 1 :(得分:0)

首先,尝试使用Button设置按钮而不是TextViews。它们更容易使用,因为您实际上是在制作按钮。您可以通过背景图像自定义它的外观。

您可以在Java代码中设置不同的状态。您可以先在活动中实现View.OnTouchListener并设置一个OnTouchListener,如下所示:

button.setOnTouchListener(this);

然后在OnTouchListener中,

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction()==MotionEvent.ACTION_DOWN){
        switch (v.getId()){
            case (R.id.yourbuttonid):
                //This code changes the background of the Button 
                v.setBackgroundResource(R.drawable.pressed_state)
                break;
        }
    }else if (event.getAction()==MotionEvent.ACTION_UP) {
        switch(v.getId()){
            case (R.id.yourbuttonid):
                //This code changes the background of the Button
                v.setBackgroundResource(R.drawable.ready_state)
                break;
        }

    }
}

在上面的代码中,我们设置按下按钮时会发生什么(ACTION_DOWN)以及按下按钮后它会发生什么(ACTION_UP)。在按下按钮之前,按钮将按照xml中的编码。

此代码甚至可以用于不同的按钮。只需在休息后添加另一个案例;在开关里。

希望这有帮助!!