3

アプリでa を使用しCompoundButtonています。newsLetterUpdate()onCheckedChange()コールバックで名前が付けられたメソッドを呼び出しますCompoundButton.OnCheckedChangeListener。これのチェック状態をCompoundButtonプログラムで変更しますが、onCheckedChange()コールバックが呼び出されます。onCheckedChange()のチェック状態を切り替えた場合にのみ、 がトリガーされるようにしますViewonCheckedChange()コールバックを呼び出さずに複合ボタンの状態を変更する解決策を教えてください。

4

5 に答える 5

4

onCheckedChange()したがって、要件に従って、ユーザーがアクションを開始した場合にのみ、コールバック内のコードを実行する必要があると思います。右?

では、なぜ を使用しているのでしょうか。目的を達成するために代わりに をonCheckedChange()使用できます。onClickListener()

現在、コードを内部に記述している可能性があります。

compundbutton.setOnCheckedChangeListener(your_current_listener);

そのコードをそこから次の場所に移動します。

compundbutton.setOnClickListener(your_new_listener);

その後、onCheckedChange ()リスナーは、プログラムでチェック状態を設定しても呼び出されません。

compundbutton.setChecked(checked);

それがあなたを助けることを願っています..!:)

于 2014-12-05T07:10:48.530 に答える
0

方法 1 :checkChangeListener使用がビューと対話しているときにのみ呼び出す必要がある場合は、そのクラスonClickListenerに putメソッドを実装します。newsLetterUpdate

方法 2 : チェックボックスをプログラムで変更する前にリスナーの登録を解除し、完了したら再度登録します。

方法 3 : ブール値フラグを使用します...チェックボックスをプログラムで変更するときに設定し、false の場合は完了時に設定します...ユーザーの操作のみで実行するフラグでコードを保護します

于 2014-12-05T06:37:01.870 に答える
0

方法 4: カスタム ビューを使用する

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

}

XML の使用例

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

ここでのアイデアは、メソッドsetCheckedProgrammaticallyをコードで呼び出すことです。ユーザーがコンパウンドボタンの状態を変更すると、setCheckedが Android によって呼び出されます。

コンパウンドボタンを拡張するスイッチを使用していることに注意してください。基本的に同じコードを他のもの(チェックボックスなど)で使用できます。

于 2015-04-15T20:55:37.120 に答える
0

次のように isPressing 値を確認すると、 onCheckedChange イベントがユーザーがボタンを押したことによるものかどうかを確認できます。

switch.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener {

            override fun onCheckedChanged(switch: CompoundButton?, checked: Boolean) {
                if (switch == null) {
                    return
                }
                if (switch.isPressed) {
                    viewModel.onCheckedChanged(checked)
                }
            }

        })
于 2019-02-27T10:45:16.327 に答える