Android:按钮状态更改事件

4

按钮的一些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="#ffff0000"/> 
    <item android:state_focused="true"
          android:color="#ff0000ff"/> 
    <item android:state_enabled="true"
          android:color="#ff00ffff"/> 
    <item android:color="#ff000000"/> 
</selector>

当视图状态改变(例如按下/未按下),相应的颜色会自动更改。

我该如何编程处理某种状态更改事件,以执行比仅更改颜色更复杂的布局更改(例如更改字体大小或设置另一个文本)?


1
基本上,您想展示当按钮被点击时它已经被按下了吗? - Raghav Chopra
那么onSelected事件没有监听器吗?它可能不是由点击触发的,而是由程序中其他部分调用setSelected(bool)方法触发的。这可以在没有使用自定义按钮类的情况下实现。 - Lassi Kinnunen
7个回答

4

对于焦点变化和触摸事件,您可以通过setOnFocusChangeListener和setOnTouchListener注册监听器。对于禁用/启用状态的更改,您可以在更改按钮状态后直接执行。


1
好像没有一种通用的方法可以一次性处理所有的更改? - PVoLan
一个监听器监听所有事件?有什么用呢? :) 如果是这样,那么即使你只需要关注焦点改变的事件,你也需要为大量的事件编写处理程序。 顺便说一句,你可能想尝试编写自己的自定义按钮视图。 - muffinmad
那个选择器正在触发,当然。看起来Button类内部的某些东西应该调用某种“UpdateColorStateList()”,当它需要在按下/聚焦/选择等情况下更新背景时,例如。我想触发这个。 - PVoLan
14
创建一个继承自Button的类,并覆盖drawableStateChanged方法,像这样:@Override protected void drawableStateChanged() { Log.d("TEST", String.format("button focused: %s, enabled: %s, pressed: %s", isFocused() ? "yes" : "no", isEnabled() ? "yes" : "no", isPressed() ? "yes" : "no")); super.drawableStateChanged(); }然后观察adb logcat TEST:* *:S输出的日志。我认为这正是你需要的。 - muffinmad
@muffinmad 目前为止最佳答案!解决了我的按钮问题,并且在无效化方面比使用 OnTouchListener 更加立即。 - Meanman

4

//使用选择器方法传递您的按钮和图像 //您还可以使用色彩

b1=(Button)findViewById(R.id.button1);

//      b2=(Button)findViewById(R.id.button2);


        selector(b1, R.drawable.image_1_2, R.drawable.image_1);
      //  selector(b2, R.drawable.image_2_2, R.drawable.image_2);


    }

    public void selector(Button b,int pressed_image,int normal_image )
    {
        StateListDrawable states = new StateListDrawable();
        states.addState(new int[] {android.R.attr.state_pressed},
            getResources().getDrawable(pressed_image));         
       states.addState(new int[] { },
            getResources().getDrawable(normal_image));      
        b.setBackgroundDrawable(states);
    }

3
只需重写 View.setPressed 方法即可:
@Override
public void setPressed(boolean pressed) {
    super.setPressed(pressed);
    ...
}

0

为特定视图处理onTouch(View v,MotionEvent event)处理程序,并根据您的要求执行MotionEvent.DOWN / Up中的操作。


0
我以前也遇到过这种问题。我通过将这个XML文件放在Res的单独drawable文件夹中而不是drawable-mdpi或其他地方来解决它。并确保您将此Xml作为按钮的背景。

0

你需要通过findViewById(<object_id>)获取视图对象(按钮)的引用,然后使用API中的适当方法。

例如:

private Button aButton;

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

    aButton = (Button) findViewById(R.id.your_button_id);

    //example 1
    aButton.setVisibility(SomeExpressionEvaluation ? View.GONE : View.VISIBLE); 

    //example 2
    if (SomeExpressionEvaluation) { 
        aButton.setText("Some Text");
    }

等等,看一下 API,特别是从 View 类继承的方法。


0

我必须说,你可以使用一个(触摸监听器),这是如何使用触摸监听器的。

image=(ImageView)findViewById(R.id.image);

先找到你的图片

为你的图片添加一个触摸监听器

 image.setOnTouchListener(image_onTouch);

//添加一个名为image_onTouch的触摸方法

OnTouchListener image_onTouch=new OnTouchListener(){
    @Override
    public boolean onTouch(View arg0,MotionEvent arg1){
        int iAction=arg1.getAction();

        if(iAction==0){
            image.setImageResource(R.drawable.image1);
        }
        else{
            image.setImageResource(R.drawable.image2);
        }
        return false;
    }
};

// 图片1是您想要点击的图片,图片2是当您触摸该图片时,您必须创建另一张带有背景颜色的图片,并在代码中使用它


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