Как установить фон выбранной/невыделенной кнопки в файле XML
У меня есть пользовательские кнопки, которые должны иметь разные фоны, если они выбраны или не выбраны. Я хочу знать, есть ли способ указать это в XML файле. У меня есть кнопка для Цельсия и кнопка для Фаренгейта. Я хочу, чтобы он работал там, где, если он выбран, он остается нажатым и не может быть нажат, а другая кнопка может быть нажата.
<Button
android:id="@+id/celsiusButton"
android:text="C"
android:background="@drawable/button_unpressed_shape"
android:layout_weight="3"
android:layout_height="match_parent"
android:layout_width="0dip"
android:gravity="center" />
<Button
android:id="@+id/fahrenheitButton"
android:text="F"
android:background="@drawable/button_unpressed_shape"
android:layout_weight="3"
android:layout_height="match_parent"
android:layout_width="0dip"
android:gravity="center" />
По умолчанию кнопка Celsius выбрана. Я пытаюсь работать над этим, как это в моем коде, но это просто кажется грязным:
tempText = (TextView) findViewById( R.id.temperatureId );
celsiusButton = (Button) findViewById( R.id.celsiusButton );
celsiusButton.setBackgroundDrawable( getResources().getDrawable( R.drawable.button_pressed_shape ) );
celsiusButton.setClickable( false );
celsiusButton.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
if( hasRead ) {
celsiusButton.setBackgroundDrawable( getResources().getDrawable( R.drawable.button_pressed_shape ) );
celsiusButton.setClickable( false );
fahrenheitButton.setBackgroundDrawable( getResources().getDrawable( R.drawable.button_unpressed_shape ) );
fahrenheitButton.setClickable( true );
temperature = ( ( ( temperature - 32 ) * 5 ) / 9 );
tempText.setText( Double.toString( temperature ).substring( 0, ( Double.toString( temperature ).length() - 2 ) ) + " C" );
}
}
});
fahrenheitButton = (Button) findViewById( R.id.fahrenheitButton );
fahrenheitButton.setOnClickListener( new OnClickListener() {
public void onClick( View v ) {
if( hasRead ) {
fahrenheitButton.setBackgroundDrawable( getResources().getDrawable( R.drawable.button_pressed_shape ) );
celsiusButton.setBackgroundDrawable( getResources().getDrawable( R.drawable.button_unpressed_shape ) );
celsiusButton.setClickable( true );
fahrenheitButton.setClickable( false );
temperature = ( ( temperature * 9 ) / 5 ) + 32;
tempText.setText( Double.toString( temperature ).substring( 0, ( Double.toString( temperature ).length() - 2 ) ) + "° F" );
}
}
});
Ответы
Ответ 1
Если он выбран или не выбран, вы должны использовать кнопку переключения https://developer.android.com/reference/android/widget/ToggleButton.html
Имейте в виду, что для этого есть еще 4 состояния
Вы определяете их в селекторе, подобном этому
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:state_pressed="true" android:drawable="@drawable/likeactivepressed" />
<item android:state_pressed="true" android:drawable="@drawable/likeinitialpressed"/>
<item android:state_checked="true" android:drawable="@drawable/likeon"/>
<item android:drawable="@drawable/likeinitial"/>
</selector>
Затем определите его в своей кнопке следующим образом:
android:background="@drawable/like_button"
редактировать
Вы могли бы просто использовать 1 кнопку для вашего использования. В качестве альтернативы вы можете использовать 2 переключателя
https://developer.android.com/reference/android/widget/RadioButton.html
Ответ 2
Это используется для изменения цвета кнопки на нажатой или сфокусированной записью этого кода в выпадающей папке
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Button Focused-->
<item android:state_focused="true"
android:state_pressed="false"
android:drawable="@drawable/login_hover"
/>
<!-- Button Focused Pressed-->
<item android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/login_hover"
/>
<!-- Button Pressed-->
<item android:state_focused="false"
android:state_pressed="true"
android:drawable="@drawable/login_hover"
/>
<!-- Button Default Image-->
<item android:drawable="@drawable/login_bg"/>
</selector
http://nishantvnair.wordpress.com/2010/10/05/change-color-of-button-on-click-android/
Ответ 3
Чтобы изменить фоновое изображение:
public void onClick(View v) {
if(v == ButtonName) {
ButtonName.setImageResource(R.drawable.ImageName);
}
}
Или, используя 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/login_selected" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/login_mouse_over" /> <!-- focused -->
<item android:drawable="@drawable/login" /> <!-- default -->
</selector>
В OnClick просто добавьте этот код:
ButtonName.setBackgroundDrawable(getResources().getDrawable(R.drawable.ImageName));
Ответ 4
Да, вы можете выбрать Drawable
на основе состояния View
, который оказывающее его.
Это точная цель типа Selector
drawable. См. Примеры и руководство здесь: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList
В принципе, каждый item
селектора определяет, какие состояния имеют какие значения. Он также определяет, какой drawable представляет этот набор значений.
Далее, вы можете установить состояние View
из кода, например.
celsiusButton.setPressed(true);
Это на практике отлично, потому что вы отделяете настройки пользовательского интерфейса от модели/контроллера. Сохранение больших наборов чертежей проще, если код не отвечает за изменение пользовательского интерфейса вашего приложения прямо.
Примером моего рабочего селектора является:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_background_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/ic_background_focused" android:state_focused="true"/>
<item android:drawable="@drawable/ic_background_default" />
</selector>
Этот пример отображает фон кнопки в зависимости от состояния.