2013-03-19 2 views
2

У меня есть кнопка, которую я дать цвет, изображение и текст, как это:Android селектора с изображением и текстом

android:background="@color/green" 
android:drawableLeft="@drawable/custom_routes_start_button_icon" 
android:text="@string/custom_route_start" 

Это невыделенная состояние и хочу, чтобы выбранное состояние быть что-то вроде этого:

Для всех, я знаю, что невозможно указать элемент в селекторе текста или drawableLeft (только для рисования). Кто-нибудь знает хороший способ достичь этого? Может быть, еще один файл xml, где может быть указан селектор?

+0

попробуйте сделать кнопку, у которой уже есть текст –

+0

фон и drawableLeft должны иметь возможность использовать обычный селектор (для каждого). Текст может быть выполнен с помощью onTouchListener (сменить текст в то время как вниз и вернуться обратно) – Warpzit

+0

Что вы подразумеваете под «выбранным»? Вы имеете в виду, что нажата кнопка? Или он получил фокус? – Terry

ответ

3

Вы должны использовать две кнопки и показывать только один из них. Используйте android:visibility в формате XML и setVisibility(), чтобы показать/скрыть кнопки.

Итак, сначала запустите кнопку запуска и скройте кнопку остановки. Когда пользователь нажимает кнопку «Пуск», скройте кнопку «Пуск» и покажите кнопку «Стоп». Когда пользователь нажимает кнопку остановки, скройте его и снова покажите кнопку запуска.

+0

Oke благодарит за ответ. Это легко понять, но никогда не думал, что это лучший способ решить такую ​​проблему. –

+1

Это :-) Выводные объекты StateSelector предназначены только для отображения разных состояний одной кнопки, например. нажата, неактивна и т. д., но то, что вам нужно, - это, очевидно, две кнопки. В одном из моих приложений у меня есть именно то, что вы хотите - кнопка запуска и остановки, которые отображаются попеременно. Поэтому я знаю, о чем говорю ;-) – Ridcully

+0

Спасибо. Реализовано и отлично работает –

0

Вы хотите изменить цвет фона кнопки, если вы нажмете кнопку? да, вы можете сделать это

первого определения состояния

private int btnState = 1; 
private final static int BUTTON_STATE_SELECTED = 0; 
private final static int BUTTON_STATE_UNSELECTED = 1; 

затем установить идентификатор к кнопке

android:id="@+id/btnRoute" 
android:background="@color/green" 
android:drawableLeft="@drawable/custom_routes_start_button_icon" 
android:text="@string/custom_route_start" 

объявить кнопку в вашей деятельности

Button btnRoute = (Button) findviewbyid(R.id.btnRoute); 

после этого создать прослушиватель onclick, который изменит цвет кнопки на основе состояния

private View.OnClickListener mOnClickBtnRoute = new View.OnClickListener() { 
switch(btnState) { 
case BUTTON_STATE_SELECTED: 
btnRoute.setBackgroundColor(green); 
btnRoute.setText(start); 
Drawable img = getContext().getResources().getDrawable(R.drawable.custom_routes_start_button_icon); 
btnRoute.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null); 
btnState = BUTTON_STATE_UNSELECTED; 
break; 
case BUTTON_STATE_UNSELECTED: 
btnRoute.setBackgroundColor(red); 
btnRoute.setText(stop); 
Drawable img = getContext().getResources().getDrawable(R.drawable.custom_routes_stop_button_icon); 
btnRoute.setCompoundDrawablesWithIntrinsicBounds(img, null, null, null); 
btnState = BUTTON_STATE_SELECTED; 
break; 
} 
}; 

, то не забудьте установить слушателя к кнопке

btnRoute.setOnClickListener(mOnClickBtnRoute); 

пожалуйста, помните, что весь код кодируется здесь так, может быть, там будет так делать печатать с ошибками, пожалуйста, не просто копировать вставить но постарайтесь понять концепцию :), и если у вас есть вопрос о моем ответе, не стесняйтесь спрашивать в комментарии!

+0

Но я также хочу изменить изображение в выбранном состоянии. Так что не выбрано: green, start_image, start_text Выбранный гость: red, stop_image, stop_text –

+0

да, вы можете! используя функцию setcompounddrawable, см. мой отредактированный ответ! –

1

вы можете изменить это с помощью кода:

писать ниже код в XML-файле:

android:background="@color/green" 
android:drawableLeft="@drawable/custom_routes_start_button_icon" 
android:text="@string/custom_route_start" 

и ButtonClick событие:

yourButton = (TextView) findViewById(R.id.yourButton); 

    yourButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Drawable checkImg = getApplicationContext().getResources().getDrawable(
         R.drawable.custom_routes_stop_button_icon); 
      yourButton.setCompoundDrawablesWithIntrinsicBounds(checkImg, null, null, 
      null); 
      yourButton.setBackgroundColor(red); 
      yourButton.setText(custom_route_stop); 
     } 
    }); 

Вы также можете разместить этот код onTouchlistener:

yourButton.setOnTouchListener(new OnTouchListener() { 
     boolean isTouch = false; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       Drawable checkImg = getApplicationContext().getResources().getDrawable(
         R.drawable.custom_routes_stop_button_icon); 
       yourButton.setCompoundDrawablesWithIntrinsicBounds(checkImg, null, null, null); 
       yourButton.setBackgroundColor(red); 
       yourButton.setText(custom_route_stop); 
      } 
      else { 
       Drawable checkImg = getApplicationContext().getResources().getDrawable(
         R.drawable.custom_routes_start_button_icon); 
       yourButton.setCompoundDrawablesWithIntrinsicBounds(checkImg, null, null, null); 
       yourButton.setBackgroundColor(green); 
       yourButton.setText(custom_route_start); 
      } 
      return false; 
     } 
    }); 
+0

Итак, какое решение лучше для программирования. Изменение цвета, текста и текста в коде (например, ваше решение) или две кнопки, в которых одновременно отображается только 1? –

+0

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

2

Я не уверен, что ToggleButton (или даже флажок) будет соответствовать вашему прецеденту. Вы действительно можете использовать селектор для вашего рисования (слева, справа, сверху, снизу), использовать фон с selctor и даже другой текст для ваших двух состояний.

Фактически вы можете определить селекторный для фона (/ res/color/custom_color.XML)

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/green" 
      android:state_checked="true" /> 
    <item android:color="@color/red" 
     android:state_checked="false"/> 
</selector> 

и один для drawableLeft (/res/drawable/custom_drawable.xml).

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/custom_routes_start_button_icon" 
      android:state_checked="true" /> 
    <item android:drawable="@color/custom_routes_stop_button_icon" 
     android:state_checked="false"/> 
</selector> 

и, наконец, ваше определение ToggleButton в

android:background="@color/custom_color" 
android:drawableLeft="@drawable/custom_drawable" 
android:textOn="@string/custom_route_start" 
android:textOff="@string/custom_route_stop" 

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

Хотя это поздний ответ, надейтесь, что кто-то сочтет это полезным.

+0

. Это лучший вариант. Кнопка Toggle разрешает мою проблему – Gem

Смежные вопросы