選択されているかどうかに応じて、背景が異なるはずのカスタムボタンがあります。これをXMLファイルに記述する方法があるかどうかを知りたいです。摂氏用のボタンと華氏用のボタンがあります。 1つが選択された場合、「押されたまま」でクリックできず、もう1つのボタンを押すことができるようにしたいのですが。
<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" />
摂氏ボタンはデフォルトで選択されています。私は自分のコードでこのように取り組んでみましたが、面倒に思われます:
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" );
}
}
});
選択されているか選択されていない場合は、トグルボタンを使用する必要があります 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
これは、押されたボタンまたはフォーカスされたボタンの色を変更するために使用され、このコードを描画可能なフォルダーに書き込みます
<?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/
背景画像を変更するには:
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));
はい、それをレンダリングしているDrawable
の状態に基づいてView
を選択できます。
これがSelector
タイプのドローアブルの正確な目的です。ここの例とガイドを参照してください: http://developer.Android.com/guide/topics/resources/drawable-resource.html#StateList
基本的に、セレクターの各item
は、どの状態がどの値を持つかを定義します。また、どのドロアブルがこの値のセットを表すかを定義します。
次に、コードからView
の状態を設定できます。
celsiusButton.setPressed(true);
UI設定をモデル/コントローラーから分離しているため、これは実際には素晴らしいことです。コードがアプリケーションのUIを直接変更する責任を負わない場合、ドローアブルの大きなセットを維持するのが簡単になります。
私の作業セレクターの例は次のとおりです:
<?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>
この例では、状態に応じてボタンの背景をレンダリングします。