Ho dieci pulsanti di commutazione. Voglio salvare lo stato di cinque di quei pulsanti quando si fa clic sul pulsante Home. Ma voglio salvarlo solo se l'utente ha apportato una modifica a uno qualsiasi stato dei pulsanti. C'è un modo per conoscere il cambiamento negli stati senza usare setOnClickListener()?Come sapere se l'utente ha modificato lo stato del pulsante di attivazione/disattivazione?
risposta
Utilizzare la classe CompoundButton.OnCheckedChangeListener
.
ToggleButton button = /* ... */;
button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Save the state here
}
});
EDIT: Se si desidera utilizzare un singolo ascoltatore:
CompoundButton.OnCheckedChangeListener listener =
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String key = null;
switch(buttonView.getId()) {
case R.id.button1:
key = "key1";
break;
case R.id.button2:
key = "key2";
break;
default:
return;
}
// Save the state here using key
}
});
ToggleButton button1 = /* ... */;
button1.setOnCheckedChangeListener(listener);
ToggleButton button2 = /* ... */;
button2.setOnCheckedChangeListener(listener);
Ma ci sei un sacco di modi per implementare questa realtà. Quindi puoi inventare un altro metodo più adatto alle tue esigenze rispetto a questo.
In primo luogo verificare questo link http://developer.android.com/resources/tutorials/views/hello-formstuff.html#ToggleButton
Un semplice onChangeListener farà:
public class TestProjectActivity extends Activity {
ToggleButton one;
ToggleButton two;
ToggleButton three;
ToggleButton four;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
one = (ToggleButton) findViewById(R.id.toggleButton1);
two = (ToggleButton) findViewById(R.id.toggleButton2);
three = (ToggleButton) findViewById(R.id.toggleButton3);
four = (ToggleButton) findViewById(R.id.toggleButton4);
one.setOnCheckedChangeListener(changeChecker);
two.setOnCheckedChangeListener(changeChecker);
three.setOnCheckedChangeListener(changeChecker);
four.setOnCheckedChangeListener(changeChecker);
}
OnCheckedChangeListener changeChecker = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
if (buttonView == one) {
two.setChecked(false);
three.setChecked(false);
four.setChecked(false);
}
if (buttonView == two) {
one.setChecked(false);
three.setChecked(false);
four.setChecked(false);
}
if (buttonView == three) {
two.setChecked(false);
one.setChecked(false);
four.setChecked(false);
}
if (buttonView == four) {
two.setChecked(false);
three.setChecked(false);
one.setChecked(false);
}
}
}
};
}
ho fatto quanto segue, non è così bello, ma funziona:
ttsButton = (ToggleButton) findViewById(R.id.solution_ttsbutton);
ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener);
...
// gets called, if the button state changes
final CompoundButton.OnCheckedChangeListener toggleButtonChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// The user changed the button, do something
}
};
ed io effettuare le seguenti operazioni, se si desidera modificare il pulsante in modo programmatico senza eseguire il listener delle modifiche:
ttsButton.setOnCheckedChangeListener(null);
ttsButton.setChecked(false);
ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener);
@ sydd Grazie mille. Mi hai salvato. Grande trucco! – hungtdo
Esempio di pulizia e descrizione qui: http://developer.android.com/guide/topics/ui/controls/togglebutton.html –
Utilizzare una visualizzazione personalizzata
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Switch;
public class CustomSwitch extends Switch {
private OnCheckedChangeListener mListener;
public CustomSwitch(Context context) {
super(context);
}
public CustomSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
// Do not call supper method
mListener = listener;
}
@Override
public void setChecked(boolean checked) {
super.setChecked(checked);
if (mListener != null) {
mListener.onCheckedChanged(this, checked);
}
}
public void setCheckedProgrammatically(boolean checked) {
// You can call super method, it doesn't have a listener... he he :)
super.setChecked(checked);
}
}
utilizzo XML di esempio
<com.your.package.CustomSwitch
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Ora l'idea è quella di chiamare il metodo setCheckedProgrammatically nel codice. setChecked viene chiamato da Android quando gli utenti cambia lo stato del tasto compund
Nota che sto usando un interruttore, che si estende il pulsante compund, è possibile utilizzare sostanzialmente lo stesso codice su qualsiasi altro (casella di controllo, .. .)
Utilizzare View.OnTouchListener per ascoltare rilevare le interazioni dell'utente. L'ho implementato nella mia classe dell'adattatore.
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<ViewHolder>
implements AccountUtils.OnAccountStateChange ,View.OnTouchListener{
// variable to store whether screen id pressed or not
public static boolean pressed=false;
//If User touches the screen
//MotionEvent.ACTION_DOWN is triggred
//and when user lifts his hand (takes away from screen)
//MotionEvent.ACTION_UP is triggred
// Here you should the change the value of pressed accordingly
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
pressed = true;// Screen Touched
break;
case MotionEvent.ACTION_UP:
pressed = false;// Screen
break;
}
return false;
}
static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
final SwitchCompat btnToggle;
public ViewHolder(final View itemView) {
super(itemView);
btnToggle = (SwitchCompat) itemView.findViewById(R.id.btn_toggle);
btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// IF the value in Var pressed is true
// only then trigger this event
if (pressed) {
// YOUR METHOD GOES HERE
Toast.makeText(context, "Checked Changed", Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
mi sento di raccomandare questa soluzione: https://stackoverflow.com/a/9130007/2708288
In breve, utilizzare "booleano CheckBox # isShown()" per determinare qual caso, restituisce false anche si modifica lo stato di controllo all'interno di onStart() o onResume() di un'attività. (Non ho testato lo scenario Fragment.)
C'è un modo semplice per sapere se l'utente fa clic sul CompoundButton (casella di controllo, interruttore, RadioButton, ToggleButton), utilizzare il seguente:
new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { if (compoundButton.isPressed()) { // do something related to user click/tap } else { // do something related to programmatically state changes (checked/unchecked) } } }
Questa dovrebbe essere la risposta accettata a meno che qualcuno non dimostri che ".isPressed()" non attivare per altri dispositivi di input come uno stilo (ma ne dubito) –
- 1. Come sapere se un PHAsset è stato modificato?
- 2. Come sapere quale pulsante è stato premuto?
- 3. Come sapere se NSManagedObject è stato salvato?
- 4. Come verificare se object "isEmpty()" se Object.prototype è stato modificato?
- 5. Leggere lo stato "Abilitato" di un pulsante
- 6. Come sapere se urllib.urlretrieve ha esito positivo?
- 7. Script di Bash: determinare se il file è stato modificato?
- 8. Come verificare se un oggetto è stato modificato
- 9. Come dire se l'applicazione C++ win32 ha perso lo stato attivo dopo CTRL-ALT-DEL?
- 10. Ascolto se il cookie è stato modificato
- 11. Come sapere quale pulsante di invio ha attivato l'evento onsubmit
- 12. Come scoprire se un file è stato modificato?
- 13. è possibile sapere se il DOM è stato modificato e quale parte?
- 14. Come sapere quale finestra ha lo stato attivo e come modificarla?
- 15. Test se un input ha lo stato attivo
- 16. Posso sapere se l'iPhone ha un passcode?
- 17. Vedere se ContentEditable div ha lo stato attivo
- 18. Risultato intento, come sapere chi lo ha inviato?
- 19. Come posso sapere quale pulsante è stato selezionato?
- 20. stato attivo pulsante css che causa lo spostamento del testo?
- 21. Verifica se l'elemento è stato premuto o modificato
- 22. Come sapere se sys.stdout è stato svuotato in Python
- 23. Come posso sapere se un dispositivo iOS ha un GPS?
- 24. Rileva se un oggetto Java è stato modificato?
- 25. Come posso sapere se AdMob ha caricato un annuncio?
- 26. : Ottieni lo stato del provider
- 27. Come mantenere lo stato precedente di un'attività
- 28. In JSF2, come sapere se il componente composito ha figli?
- 29. Frammenti ripristina stato sull'orientamento modificato
- 30. Rubrica iOS - Come sapere quale contatto è stato aggiunto/modificato/eliminato?
Come posso utilizzare un unico listner per tutta la ginocchiera pulsanti? – nila
Come vedo questo non risponde alla domanda. Una formulazione più precisa sarebbe: Come distinguere tra button.setChecked(); e un utente fa clic? onCheckedChanged viene chiamato in entrambi i casi. – sydd
E come posso vedere dalla domanda, l'autore non è interessato a distinguere tra un'azione dell'utente e una chiamata al metodo e desidera solo sapere quando vengono modificati gli stati dei pulsanti. – Michael