Affecter un même comportement à plusieurs Togglebuttons
Bonjour,
Je suis en train de développer une petite application qui devrais me permettre d'animer un spectacle de théâtre d’improvisation.
Je ne suis pas programmateur mais ai quelques notions et ça m’intéresse beaucoup d'apprendre. Du coup je me repose sur un manuel et fouille les forums mais là j'ai besoin de petits coups de pouces pour avancer un peu :D
Voici le principe de mon appli:
- Sur un écran figurent une liste de caractéristiques à attribuer à des joueurs. (des togglebuttons)
- Pour l'instant le bouton change simplement de couleur lorsqu'on le sélectionne/désélectionne. A terme ce sera un peu plus riche mais allons y pas à pas.
- Depuis le menu on accède à un mode d'édition qui permet non pas de changer la couleur mais le titre des boutons lorsqu'on clique dessus.
En copiant du code à droite et à gauche j'ai réussi à faire quelque chose qui commence à fonctionner, mais je rencontre le problème suivant :
- J'aimerais ne pas avoir à programmer chaque bouton indépendamment mais créer une classe anonyme (est ce que j'utilise les bons termes ???). J'ai trouvé des informations sur un site et je suis particulièrement intéressé par ce paragraphe.
Citation:
en fait on implémente des classes anonymes dans des attributs de façon à pouvoir les utiliser dans plusieurs éléments graphiques différents qui auront la même réaction pour le même évènement.
Du coup j'ai codé selon l'exemple :
Mainactivity
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| package giffres.imperco;
import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
//On déclare l'activité principale, dérivée d'AppacompatActivity et implémentant le Caraclistener du fragment
public class MainActivity extends AppCompatActivity implements MyDialogFragment.CaracListener{
//Déclaration des varaibles
Boolean edit_mode = false;
View targetView;
MenuItem menuedit;
ToggleButton psybutton1;
ToggleButton psybutton2;
ToggleButton phybutton1;
ToggleButton phybutton2;
private View.OnClickListener clickListenerBoutons = new View.OnClickListener() {
@Override
public void onClick(View v) {
//test du mode d'édition
if (edit_mode) {
//Si mode d'édition,
//On cherche les fragments déja crées
FragmentManager manager = getFragmentManager();
Fragment frag = manager.findFragmentByTag("fragment_edit_carac");
//S'il y en a on les enlève
if (frag != null) {
manager.beginTransaction().remove(frag).commit();
}
//On ouvre le dialog d'édition de la caractéristique
MyDialogFragment EditCaracDialog = new MyDialogFragment();
EditCaracDialog.show(manager, "fragment_edit_carac");
//Si on n'est pas en mode d'édition
//Si le bouton est coché
} else if (psybutton1.isChecked()) {
// on définit son image de fond
psybutton1.setBackgroundResource(R.drawable.button_red);
//Si le bouton n'est pas coché
} else {
// on définit son image de fond
psybutton1.setBackgroundResource(R.drawable.button_grey);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Affectation du fichier de layout
setContentView(R.layout.activity_main);
//Obtention des références des composants
targetView = findViewById(R.id.MainLayout);
psybutton1 = (ToggleButton) findViewById(R.id.button_psy1);
phybutton1 = (ToggleButton) findViewById(R.id.button_phy1);
psybutton2 = (ToggleButton) findViewById(R.id.button_psy2);
phybutton2 = (ToggleButton) findViewById(R.id.button_phy2);
//Comportement lors d'un changement d'un clic sur les boutons
psybutton1.setOnClickListener(clickListenerBoutons);
phybutton1.setOnClickListener(clickListenerBoutons);
psybutton2.setOnClickListener(clickListenerBoutons);
phybutton2.setOnClickListener(clickListenerBoutons);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate our menu from the resources by using the menu inflater.
getMenuInflater().inflate(R.menu.main, menu);
menuedit = menu.findItem(R.id.menu_edit);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_load:
//Chargement d'une sauvegarde
return true;
case R.id.menu_edit:
//Bascule mode d'édition
edit_mode = !edit_mode;
//Passage en mode d'édition ou non
EditMode();
return true;
case R.id.menu_background:
// Choix de l'image de fond
return true;
case R.id.menu_save:
// Sauvegarder la planche
return true;
}
return super.onOptionsItemSelected(item);
}
public void onFinishCaracDialog(String carac) {
psybutton1.setTextOn(carac);
psybutton1.setTextOff(carac);
}
public void EditMode(){
if(edit_mode) {
targetView.setBackgroundColor(R.color.white);
menuedit.setTitle(R.string.menu_nedit);
menuedit.setIcon(R.drawable.ic_done_black_24dp);
}
else {
targetView.setBackgroundColor(R.color.black);
menuedit.setTitle(R.string.menu_edit);
menuedit.setIcon(R.drawable.ic_create_black_24dp);
}
}
} |
et celui du fragment "Mydialogfragment"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package giffres.imperco;
import android.app.DialogFragment;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
/**
* Created by david on 21/12/2015.
*/
public class MyDialogFragment extends DialogFragment implements TextView.OnEditorActionListener {
private EditText caractxt;
public interface CaracListener {
void onFinishCaracDialog(String carac);
}
// Empty constructor required for DialogFragment
public MyDialogFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.carac_dialog, container);
caractxt = (EditText) view.findViewById(R.id.caractxt);
// set this instance as callback for editor action
caractxt.setOnEditorActionListener(this);
caractxt.requestFocus();
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
return view;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// Return input text to activity
CaracListener activity = (CaracListener) getActivity();
activity.onFinishCaracDialog(caractxt.getText().toString());
this.dismiss();
return true;
}} |
Le début de l'opération se déroule normalement mais après avoir validé ma boite de dialogue, comme agir sur le bouton concerné et non sur un bouton désigné au préalable. Le problème se pose pour l'image de fond ici:
Code:
1 2 3 4 5 6 7 8 9 10
| //Si on n'est pas en mode d'édition
//Si le bouton est coché
} else if (psybutton1.isChecked()) {
// on définit son image de fond
psybutton1.setBackgroundResource(R.drawable.button_red);
//Si le bouton n'est pas coché
} else {
// on définit son image de fond
psybutton1.setBackgroundResource(R.drawable.button_grey);
} |
et pour le titre du bouton ici
Code:
1 2 3 4
| public void onFinishCaracDialog(String carac) {
psybutton1.setTextOn(carac);
psybutton1.setTextOff(carac);
} |
Quelqu'un peut-il me mettre sur la voie car là je commence à vraiment sécher et en plus j'ai l'impression que ce na doit pas être sorcier.
J'ai aussi les quelques soucis suivants mais c'est secondaire, je recréerai des discussion exprès.
Lors de l'utilisation:
- Lorsque je modifie les titleon et titleoff de mon togglebutton, la mise à jour n'est effectué que lorsque je réédite ce bouton une seconde fois.
- Lorsque je change d'orientation, le layout est réinitialisé et je perds tout mon paramétrage.
- Lorsque je passe en mode d'édition, je demande normalement un background blanc mais j'obtiens un gris. Il doit y avoir un problème de transparence.