web-dev-qa-db-ja.com

XMLファイルで選択済み/未選択のボタンの背景を設定する方法

選択されているかどうかに応じて、背景が異なるはずのカスタムボタンがあります。これを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" );
            }
        }
    });
12
JuiCe

選択されているか選択されていない場合は、トグルボタンを使用する必要があります 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

13
jiduvah

これは、押されたボタンまたはフォーカスされたボタンの色を変更するために使用され、このコードを描画可能なフォルダーに書き込みます

<?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/

5
Ramesh Sangili

背景画像を変更するには:

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));
2

はい、それをレンダリングしている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>

この例では、状態に応じてボタンの背景をレンダリングします。

0
andr