кнопка Android установлена ​​нажата после нажатия - PullRequest
10 голосов
/ 12 мая 2011

вчера я заметил возможность интегрировать фрагменты в более старые уровни API через пакет совместимости, но это не очень важно для вопроса.:)

У меня есть кнопка с OnClickListener

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        doSomething();
        button.setPressed(true);
    }
});

Из-за фактического нажатия она отображается как нажатая, и после отпускания щелчка состояние кнопки не нажимается и остается, чтоспособ.

Есть ли простой способ удерживать состояние кнопки нажатым после отпускания?Первое, о чем я могу подумать, это какой-то таймер, но это кажется неразумным.

Ответы [ 7 ]

25 голосов
/ 01 января 2012

Просто чтобы заметить, это потому, что Android меняет setPressed как до, так и после onClickEvent, поэтому изменение его самостоятельно не имеет никакого эффекта.Другой способ обойти это - использовать onTouchEvent.

button.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        // show interest in events resulting from ACTION_DOWN
        if (event.getAction() == MotionEvent.ACTION_DOWN) return true;

        // don't handle event unless its ACTION_UP so "doSomething()" only runs once.
        if (event.getAction() != MotionEvent.ACTION_UP) return false;

        doSomething();
        button.setPressed(true);                    
        return true;
   }
});
13 голосов
/ 15 октября 2012

Используйте ToggleButton вместо Button.

<ToggleButton
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:background="@drawable/topping_selector"
    android:checked="false"
    android:textOff="Topping2"
    android:textOn="Topping2" />

topping_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" 
        android:drawable="@drawable/btn_topping_on" />

    <item android:state_checked="false" 
        android:drawable="@drawable/btn_topping_off" />

</selector>
6 голосов
/ 12 мая 2011

Вы можете сохранить состояния кнопок в XML-файле в папке Drawable, а затем использовать в качестве фона для кнопки. Например:

 android:background="@drawable/buttonstate"

buttonstate.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/back_focused" />
    <item android:drawable="@drawable/back" /> <!-- default -->
</selector>
3 голосов
/ 12 марта 2015

Вы можете использовать android.os.Handler класс. Некрасиво, но работает и:

final Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        doSomething();
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                button.setPressed(true);
            }
        });
    }
});
3 голосов
/ 18 марта 2014

Лучшее решение:

В XML-файле:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_activated="true">
        <bitmap android:src="@drawable/image_selected"/>
    </item>
    <item>
        <bitmap android:src="@drawable/image_not_selected"/>
    </item>
</selector>

И в Java:

@Override
public void onClick(View v) {
   v.setActivated(!v.isActivated());
}
0 голосов
/ 05 октября 2017

Это решение, которое я использовал, на данный момент также работает на Android 7.0.

YourActivity.java

public void onStandbyStart(String message) {
    startStandbyBtn.setActivated(true);
}

public void onBackOnline(String message) {
    startStandbyBtn.setActivated(false);
}

YourActivityLayout

<Button
        ...
        style="@style/generic_btn_style"
        ... />

Значения / styles.xml

    <style name="generic_btn_style" parent="@android:style/Widget.Button">
        <item name="android:gravity">center_vertical|center_horizontal</item>
        <item name="android:background">@drawable/generic_btn</item>
        <item name="android:textColor">@color/selector_white_black</item>
        <item name="android:focusable">true</item>
        <item name="android:clickable">true</item>
</style>

вытяжка / generic_btn.xml Этот селектор выбирает фон кнопки. Я использую нажатой в качестве активированной.

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/generic_btn_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/generic_btn_pressed" android:state_enabled="true" android:state_pressed="true" />
    <item android:drawable="@drawable/generic_btn_pressed" android:state_activated="true" />
    <item android:drawable="@drawable/generic_btn_focused" android:state_enabled="true" android:state_focused="true" />
    <item android:drawable="@drawable/generic_btn_enabled" android:state_enabled="true" />
</selector>

цвет / selector_black_white Здесь я установил цвет текста. В моем случае мне нужно выбрать черный цвет текста при нажатии.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#fff" android:state_pressed="true" /> <!-- pressed -->
    <item android:color="#fff" android:state_activated="true" /> <!-- pressed -->
    <item android:color="#000" /> <!-- default -->
</selector>
0 голосов
/ 15 января 2015

Другое решение заключается в расширении Button и переопределении метода setPressed(boolean pressed), чтобы вы могли обрабатывать вызовы платформы из onClickEvent с помощью флага, например, для изменения логического нажатого параметра в зависимости от ваших потребностей.

public class MyButton extends Button {
   boolean isSelected = false;  //this is your flag
   @Override
   public void setPressed(boolean pressed) {
       if(isSelected) {
           //here you change the parameter so it stays pressed
           super.setPressed(true);
           return;
       }
       super.setPressed(pressed);
   }

   public void setIsSelected(boolean selected) {
       this.isSelected = selected;
   }

   public MyButton(Context context) {
       super(context);
   }
}
...