Android:点击按钮时更改按钮颜色

6

基本上,我正在尝试创建一个按钮,当单击时(注意:不是按下),它将从color1更改为color2的颜色。再次单击时,它将从color2更改回color1。

我已经疯狂搜索了很多信息,但取得的唯一信息是如何在按钮被按下(用户按住按钮)时更改颜色(此代码将在下面编写)。但是,我希望当用户单击(按下和释放)按钮时,颜色会更改,然后再次单击后恢复。

此文件位于res/drawable中

<!-- Changes color when user hols down button -->
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true">
    <shape>
        <!-- change to color2 -->
    </shape>
</item>

<item>
    <shape>
        <!-- change to color1 -->
    </shape>
</item>
</selector>
2个回答

8
boolean tmp = false;
button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
         tmp = !tmp;
         v.setBackgroundColor(tmp ? Color.RED : Color.BLUE);
    }
});

编辑:显然你想要一个更复杂的示例

首先在drawable目录下创建一个XML文件并将其命名为pink_button.xml,将以下代码放入其中:

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

    <solid android:color="#FF5EF1"/>
    <corners android:radius="15dp"/>
    <stroke
        android:width="1dp"
        android:color="#303030"/>

</shape>

现在创建一个名为blue_button.xml的文件。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid android:color="#008DFF"/>
    <corners android:radius="15dp"/>
    <stroke
        android:width="1dp"
        android:color="#303030"/>

</shape>

现在制作一些演示活动布局,我使用了按钮演示活动.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <Button
        android:id="@+id/btnDemo"
        android:layout_width="150dp"
        android:layout_height="30dp"
        android:layout_centerInParent="true"
        android:layout_marginTop="100dp"
        android:background="@drawable/pink_button"
        android:gravity="center"
        android:text="PINK"
        android:textColor="@android:color/white"
        android:textSize="15sp"/>

</RelativeLayout>

最后是活动,你可以随便命名,我使用了ButtonDemoActivity

public class ButtonDemoActivity extends Activity {


    private Button btnDemo;
    private boolean isPink = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button_demo_activity);

        btnDemo = (Button) findViewById(R.id.btnDemo);
        btnDemo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isPink = !isPink;
                int resId = isPink ? R.drawable.pink_button : R.drawable.blue_button;
                btnDemo.setBackgroundResource(resId);
                btnDemo.setText(isPink ? "PINK" : "BLUE");
            }
        });
    }
}

以下是每个按钮状态的最终外观: enter image description here

是的,这种方法有点用,但是当我尝试使用它时,按钮会完全改变。基本上,它没有圆角等属性。但我猜你也可以在onClick方法中改变它? - hokosha
当然。不要改变颜色,使用 setbackgroundDrawable(R.drawable.something),你可以拥有一个自定义形状的可绘制对象,就像你的问题中一样。我的答案旨在简化事情 :) - Bojan Kseneman
首先,感谢您的简化,非常感激!好的,我想我明白了,但出于某种原因无法使其正常工作。您能否以某种方式展示您的意思? - hokosha
我为您添加了一个简单但实用的示例。干杯 - Bojan Kseneman

0

你走在正确的道路上。添加其他状态,比如:

<item android:state_selected="true">
  <shape>
    <!-- change to color2 -->
  </shape>
</item>

然后在你的onClick方法中添加一些切换:

v.setSelected( !v.isSelected() );

我尝试添加了一个状态,但是那并没有帮助。而且现在我没有一个 onClick 方法。我的按钮的 activity.xml 如下所示 (...) android:background="@drawable/custom_button"/> ,其中 custom_button 是主贴中的 xml 文件。你有任何关于我该如何编写 onClick 方法的建议吗?除了你写的那一行之外。 - hokosha
你可以尝试使用 ToggleButton,它不需要 onClick 并且可以保持其状态。但是你必须在你的 selector 中提供状态。 - injecteer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接