2011-08-25 13 views

risposta

15

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.

+0

Come posso utilizzare un unico listner per tutta la ginocchiera pulsanti? – nila

+8

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

+1

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

0

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

} 
29

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); 
+0

@ sydd Grazie mille. Mi hai salvato. Grande trucco! – hungtdo

+0

Esempio di pulizia e descrizione qui: http://developer.android.com/guide/topics/ui/controls/togglebutton.html –

1

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, .. .)

0

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

       } 
      } 
     }); 

    } 

} 

}

0

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.)

7

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) } } }

+2

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) –

Problemi correlati