トグルボタンが10個あります。ホームボタンをクリックすると、そのボタンの5つの状態を保存します。しかし、ユーザーがいずれかのボタンの状態を変更した場合にのみ保存したいと思います。 setOnClickListener()を使用せずに状態の変化を知る方法はありますか?ユーザーがトグルボタンの状態を変更したかどうかを知るには?
答えて
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);
をしかし、実際にこれを実装する方法はたくさんあります。だからあなたは、あなたの必要性に合ったもう一つの方法を作り上げることができます。
このリンク
最初のチェック:
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);
}
}
}
};
}
は、私は次の、そのとても素敵ではないが行っているが、それは動作します:
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);
@ syddありがとうございました。あなたは私を助けてくれる。素晴らしいトリック! – hungtdo
クリーナーの例と説明はこちら:http://developer.android.com/guide/topics/ui/controls/togglebutton.html –
サンプル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ボタンを拡張するスイッチを使用していますが、他のチェックボックスでは基本的に同じコードを使用できます。 )
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();
}
}
});
}
}
}
私は、このソリューションをお勧めします:https://stackoverflow.com/a/9130007/2708288
簡単に言えば、それもあなたがチェック状態を変更するfalseを返した場合、決定するために、 "ブールのCheckBox#isShown()" を使用アクティビティのonStart()またはonResume()内。 (私はフラグメントシナリオをテストしていません。)
ユーザーが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) } } }
これは、誰かが '.isPressed()'がスタイラスのような他の入力デバイスを切り替える(しかし、私はそれを疑う) –
どのように私はすべてのトグルのための単一のリスナーを使用することができますボタン? – nila
私はこれが質問に答えないことを見ている。より正確な定式化は次のようになります:button.setChecked();ユーザーは?両方の場合にonCheckedChangedが呼び出されます。 – sydd
質問からわかるように、著者はユーザーアクションとメソッド呼び出しを区別するのに興味がなく、ボタンの状態がいつ変更されるかを知りたいだけです。 – Michael