web-dev-qa-db-fra.com

Comment définir l'arrière-plan du bouton sélectionné/non sélectionné dans le fichier XML

J'ai des boutons personnalisés censés avoir des arrière-plans différents selon qu'ils sont sélectionnés ou non. Je veux savoir s’il existe un moyen de le préciser dans le fichier XML. J'ai un bouton pour Celsius et un bouton pour Fahrenheit. Je veux que cela fonctionne là où, si l'un est sélectionné, il reste "appuyé" et impossible à cliquer, tandis que l'autre bouton peut être appuyé.

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

Le bouton Celsius est sélectionné par défaut. J'essaie de travailler dessus comme ça dans mon code, mais ça a l'air de devenir désordonné:

    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

Si cette option est sélectionnée ou non, vous devez utiliser un bouton bascule https://developer.Android.com/reference/Android/widget/ToggleButton.html

Sachez qu'il y a encore 4 états pour cela 

Vous les définissez dans un sélecteur comme celui-ci

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

Puis définissez-le dans votre bouton comme ceci

  Android:background="@drawable/like_button"

Modifier

Vous pouvez en fait utiliser un seul bouton pour votre usage. Sinon, vous pouvez utiliser 2 boutons radio

https://developer.Android.com/reference/Android/widget/RadioButton.html

13
jiduvah

Ceci est utilisé pour changer la couleur du bouton enfoncé ou focalisé Écrire ce code dans votre dossier pouvant être dessiné

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

Pour changer l'image de fond:

public void onClick(View v) {
   if(v == ButtonName) {
     ButtonName.setImageResource(R.drawable.ImageName);
   }
}

Ou, en utilisant un fichier 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>

Dans OnClick, ajoutez simplement ce code:

ButtonName.setBackgroundDrawable(getResources().getDrawable(R.drawable.ImageName));
2
Brenda Stephanie

Oui, vous pouvez sélectionner une Drawable en fonction de l'état de la View qui la restitue.

C’est l’objet exact d’un type Selector de dessinable. Voir exemples et guide ici: http://developer.Android.com/guide/topics/resources/drawable-resource.html#StateList

Fondamentalement, chaque item d'un sélecteur définit quels états ont quelles valeurs. Il définit également quel drawable représente cet ensemble de valeurs.

Ensuite, vous pouvez définir l’état de View à partir du code, par exemple.

celsiusButton.setPressed(true);

En pratique, c’est formidable, car vous séparez les paramètres d’UI du modèle/contrôleur. La maintenance de grands ensembles de tirables est plus facile lorsque le code n'est pas responsable de la modification directe de l'interface utilisateur de votre application.

Un exemple de mon sélecteur de travail est:

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

Cet exemple affiche un arrière-plan de bouton en fonction de son état.

0
andr