2011-08-25 20 views

答えて

15

CompoundButton.OnCheckedChangeListenerクラスを使用してください。

ToggleButton button = /* ... */; 
button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // Save the state here 
    } 
}); 

EDIT:あなたは、単一のリスナーを使用する場合:

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

をしかし、実際にこれを実装する方法はたくさんあります。だからあなたは、あなたの必要性に合ったもう一つの方法を作り上げることができます。

+0

どのように私はすべてのトグルのための単一のリスナーを使用することができますボタン? – nila

+8

私はこれが質問に答えないことを見ている。より正確な定式化は次のようになります:button.setChecked();ユーザーは?両方の場合にonCheckedChangedが呼び出されます。 – sydd

+1

質問からわかるように、著者はユーザーアクションとメソッド呼び出しを区別するのに興味がなく、ボタンの状態がいつ変更されるかを知りたいだけです。 – Michael

0
シンプルonChangeListenerがどうなる http://developer.android.com/resources/tutorials/views/hello-formstuff.html#ToggleButton

このリンク

最初のチェック:

  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

は、私は次の、そのとても素敵ではないが行っているが、それは動作します:

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

とI変更リスナーを実行せずにプログラムでボタンを変更する場合は、次のようにします。

ttsButton.setOnCheckedChangeListener(null); 
ttsButton.setChecked(false); 
ttsButton.setOnCheckedChangeListener(toggleButtonChangeListener); 
+0

@ syddありがとうございました。あなたは私を助けてくれる。素晴らしいトリック! – hungtdo

+0

クリーナーの例と説明はこちら:http://developer.android.com/guide/topics/ui/controls/togglebutton.html –

1

サンプルXMLの使用

<com.your.package.CustomSwitch 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

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

} 

カスタムビューを使用して今アイデアがsetCheckedProgrammaticallyコード内のメソッドを呼び出すことです。 setCheckedは、ユーザーがcompundボタンの状態を変更したときにAndroidから呼び出されます

私はcompundボタンを拡張するスイッチを使用していますが、他のチェックボックスでは基本的に同じコードを使用できます。 )

0

View.OnTouchListenerを使用して、ユーザーの操作を検出します。 これを私のアダプタクラスに実装しました。

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

私は、このソリューションをお勧めします:https://stackoverflow.com/a/9130007/2708288

簡単に言えば、それもあなたがチェック状態を変更するfalseを返した場合、決定するために、 "ブールのCheckBox#isShown()" を使用アクティビティのonStart()またはonResume()内。 (私はフラグメントシナリオをテストしていません。)

7

ユーザーがCompoundButton(チェックボックス、スイッチ、ラジオボタン、トグルボタン)をクリックした場合は以下を使用し、知るための簡単な方法があります:

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

これは、誰かが '.isPressed()'がスタイラスのような他の入力デバイスを切り替える(しかし、私はそれを疑う) –