如何以编程方式更改ImageButton的样式

时间:2012-11-01 22:52:33

标签: android styles imagebutton

在这个特定的Activity中,用户应该选择在摇滚剪刀游戏中选择的玩家1和玩家2的析构函数。

我尝试了几种方法:第一种方法是简单地让所选的ImageButton点击,但我找不到任何解决方案来实现这一点。

第二个是设置选择ImageButton无法点击并更改其Image,如下图所示。在那里,玩家1选择了“摇滚”而玩家2没有选择。如您所见,只要我更改Image的{​​{1}},边框就会消失。

enter image description here

我改变了ImageButton s的状态

Button

和所有其他5 public void onClickRock1(View v){ choosenDestructor1 = 1; buttonRock1.setImageResource(R.drawable.rock_clicked); buttonRock1.setBackgroundColor(getResources().getColor(R.color.button_background_stay_clicked)); buttonRock1.setClickable(false); buttonPaper1.setImageResource(R.drawable.paper); buttonPaper1.setBackgroundColor(getResources().getColor(R.color.button_background)); buttonPaper1.setClickable(true); buttonScissors1.setImageResource(R.drawable.scissors); buttonScissors1.setBackgroundColor(getResources().getColor(R.color.button_background)); buttonScissors1.setClickable(true); } 类似于此方法。现在,我认为用简单的Button覆盖ImageButton的样式会使我的自定义Image样式的边框消失,但这只是猜测。

我写了第二个具有不同背景颜色和相同边框的自定义ImageButton样式,但我无法弄清楚如何在ImageButton代码中设置该样式。

所以我的问题是,哪种方法最明智地解决这个问题(我认为是第三种,但也许还有另一种方法)如果是第三种方法,那么如何设置{{1}的样式来自代码。

修改

与rgrocha的回答类比,我编辑了我的ImageButton(已经集成在ImageButton中),如下所示

selector

custom_imagebutton.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="@drawable/rock">
        <shape>
            <solid
                android:color="@color/button_background" />
            <stroke
                android:width="2dp"
                android:color="#FFF716" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />

        </shape>
    </item>
    <item android:state_selected="true" android:drawable="@drawable/rock_clicked">
        <shape>
            <solid
                android:color="@color/button_background_stay_clicked" />
            <stroke
                android:width="2dp"
                android:color="#FFF716" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item android:drawable="@drawable/rock">        
        <shape>
            <solid
                android:color="@color/button_background" />
            <stroke
                android:width="1dp"
                android:color="#FFFFFF" />
            <corners
                android:radius="0dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>  
</selector>

像这样解决它会导致为每个onClickRock1(岩石,纸张,剪刀)制作public void onClickRock1(View v){ choosenDestructor1 = 1; buttonRock1.setSelected(true); buttonPaper1.setSelected(false); buttonScissors1.setSelected(false); } ,并且以下问题在这里: 1.边界不可见(重要的是,因为我希望有这些边界) 2. custom_imagebutton.xml不再缩放(这没关系,因为我喜欢它更像这样)

所以基本上,它看起来像我上面发布的图片,除了ImageButton s由于没有缩放而有点大(在Image,我设置Image)< / p>

2 个答案:

答案 0 :(得分:2)

您可以为要应用的每个州制作一个可绘制的选择器,并将其设置为主要法师或背景,您可以选择更适合您需要的状态。

在此选择器中,您可以制作边框,颜色,图像,以及任何您想要更改的内容。

选择器如下所示:

<item android:state_pressed="true">
    <shape android:shape="rectangle" >

        <solid android:color="@color/button_highlight" />
        <corners android:radius="5dp" />

    </shape>
    </item>
<item android:state_selected="true">
    <shape android:shape="rectangle" >

        <solid android:color="@color/menu_bg_selected" />
        <corners android:radius="5dp" />

    </shape>
</item>

有关完整的drawable文档,请参阅http://developer.android.com/guide/topics/resources/drawable-resource.html。对于您的情况,请参阅“状态选择器”。

您甚至可以使用setSelected(),setEnabled(()等以编程方式更改按钮的状态。

答案 1 :(得分:0)

根据选择者的说法,这是一个快速工作的例子。我希望它会帮助你一些。 此处适用于具有指定android:background源的按钮。此示例显示了单击后图像的更改方式。

MainActivity.java:

public class MainActivity extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public void onClickButton1(View view) {

    //button is selected when false and vice versa
    view.setSelected(!view.isSelected());
    Log.d("xxx", view.isSelected() + "");
}

public void onClickButton2(View view) {

    //same here...
    view.setSelected(!view.isSelected());
    Log.d("xxx", view.isSelected() + "");
}

public void onClickButton3(View view) {

    //same here...
    view.setSelected(!view.isSelected());
    Log.d("xxx", view.isSelected() + "");
}
}

activity_main.xml:

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

    <ImageButton
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dip"
        android:background="@drawable/button_style"
        android:onClick="onClickButton1" />

    <ImageButton
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dip"
        android:background="@drawable/button_style"
        android:onClick="onClickButton2" />

    <ImageButton
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dip"
        android:background="@drawable/button_style"
        android:onClick="onClickButton3" />

</LinearLayout>

button_style.xml:

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

    <item android:drawable="@drawable/aselected" android:state_selected="true"/>
    <item android:drawable="@drawable/anone" />

</selector>

图片: image image

P.S要缩放图像,您可以使用选项:

<ImageView
android:scaleType="scaleXY" />