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" );
}
}
});
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
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/
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));
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.