2011-01-20 3 views
28

Можно создать дубликат:
Android. How do I keep a button displayed as PRESSED until the action created by that button is finished?Как я могу удерживать одну кнопку нажатой после щелчка по ней?

У меня есть одна кнопка, и я хочу, когда я нажал его, чтобы остаться в нажат (с зеленым цветом на Froyo) .. Любая помощь ??

mycodes_Button = (Button) findViewById(R.id.mycodes); 
... 
if (saved_Button.isPressed()) 
{ 
    saved_Button.setFocusable(true); 
} 

Что-то вроде этого?

+0

Можете ли вы рассказать, какая у вас проблема с этим кодом? –

+0

После того, как я нажму кнопку, он не останется нажатым (я имею ввиду зеленый цвет), он вернется в исходное состояние, серый. – Nikitas

ответ

33

Привет использовать следующий код будет Usefull,

mycodes_Button.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       mycodes_Button.setPressed(true); 
       return true; 
      } 
     }); 
+13

В основном это работает, но вы должны упомянуть, что вы теряете функциональность обычной кнопки.Поскольку вы возвращаете здесь «истину», материал 'onClick' никогда не выполняется. Таким образом, на самом деле вам нужно вызвать материал, вы хотите, чтобы кнопка выполнялась из этого метода 'onTouch'. Btw: Вы должны использовать 'v.setPressed (true)'. – Ridcully

+0

нет необходимости обрабатывать вещи 'onClick' отдельно. просто используйте 'v.performClick();' in 'onTouch' –

+0

Есть небольшая проблема с этим. Я думаю, что когда действие приостанавливается, кнопки становятся недоступными. Для меня это облом, потому что я показываю диалог прогресса, а также перехожу к другим видам деятельности и ожидаю, что кнопки будут удерживаться в этих ситуациях. –

4

Был бы ToggleButton в соответствии с вашими потребностями?

Судя по вашим комментариям, вы не знаете о Touch Mode. В этом режиме, который по умолчанию используется для большинства вещей, нет фокуса (чего вы пытаетесь достичь), и нет выбранные элементы.

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

+0

После того, как я нажму кнопку, он не останется нажатым (я имею в виду зеленый цвет), он возвращается в исходное состояние, серый. Мне нужна нормальная кнопка, а не ToggleButton .. благодарит за ответы! – Nikitas

+0

На самом деле мне нужна нормальная кнопка kostas .. Спасибо за ответ (ευχαριστώ για την απάντηση!) – Nikitas

+0

Нормальная кнопка не может оставаться в нажатом состоянии - она ​​может оставаться только в сфокусированном состоянии. – kgiannakakis

40

Я имел этот вопрос с помощью кнопки с настраиваемым фоном, и в конечном итоге с помощью selected state для этого. Это состояние доступно для всех просмотров.

Чтобы использовать эту функцию, вы должны определить пользовательские кнопки фон как state list:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="false" android:state_focused="false" 
    android:state_pressed="false"><bitmap ... /></item> 
    <item android:state_selected="true"><bitmap ... /></item> 
    <item android:state_focused="true"><bitmap ... /></item> 
    <item android:state_pressed="true"><bitmap ... /></item> 
</selector> 

Затем использовать этот фон, скажем, что в /res/drawable/button_bg.xml в файле макета, вы используете:

... 
<Button android:background="@drawable/button_bg" ... /> 
... 

в своем коде вы можете переключиться на (де-) выбранного состояния в вашем OnClick слушателя:

myButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    v.setSelected(true); 
    // normal click action here 
    } 
}); 

activated state соответствует намеченному значению лучше, но доступен только с Android 3.x и выше.

+0

Метод isActivated() доступен только с уровня API 11 и выше. Я не рекомендую использовать это по причинам сопоставимости со старой версией ОС Android. Уровень API уровня 11 равен Android 3.x, который никто не использует на своих телефонах. – philipp

+0

@phlipp прав, я заметил это при тестировании (после ввода этого ответа) и переключился на выбранный, но забыл обновить свой ответ. – beetstra

+2

Спасибо beetstra. Я заметил недостаток в «прессованном» решении, поэтому использовал твой. Проще и безупречно до сих пор. –