2

私は初めてスイッチを試しているので(Androidが初めて)、この問題を処理する方法がわかりません。アクティビティにスイッチがあり、それに setOnCheckedChangeListener() が添付されています。アクティビティの oncreate が呼び出されると、データベースへの非同期呼び出しを行い、受け取った値に応じて、スイッチのオン/オフのステータスを設定します。問題は、スイッチの状態を db の現在のステータスを表示するように設定していて、ユーザーがまだそれを変更していないにもかかわらず、listner 関数が呼び出されていることです。コードが正しく機能していることはわかっていますが、状態が変更されたリストナーでは、状態がユーザーによって変更されたことを確認するために何か他のものが必要です。onTouchEvent(MotionEvent event) は目的を満たすことができると思いますが、switch.setOnCheckedChangeListener と組み合わせて使用​​するホットな方法を知りません

誰かがそれに対するより良い解決策を知っていますか、少なくともlistnerでもontouchを使用する方法を教えてくれます...

sw_recording_switch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   }}

ありがとう !!!

4

2 に答える 2

3

確かに Switch.setChecked(boolean); を呼び出すとき。OnCheckedChangeListener もトリガーされます。この問題を克服する方法は、setChecked() を呼び出す前にフラグを使用して false に設定することでした。

この方法では、プログラムで setChecked() を使用してもリスナーは呼び出されますが、ユーザーがスイッチを押さない限り、内部のコードは実行されません。

    //prevent the code from listener to run, flag set to false before calling setChecked(true);
    should_run = false;
    toggle_facebook.setChecked(true);

    ....

    private OnCheckedChangeListener onSwitchSlided = new OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            switch(buttonView.getId())
            {
                case R.id.settings_toggle_facebook:
                {
                    if(true == should_run)
                    {
                        //do stuff
                    }

                    should_run = true;
                    break;
                }
                case R.id.settings_toggle_twitter:
                {
                    if(true == should_run)
                    {
                        //do stuff
                    }

                    should_run = true;
                    break;
                }
            }
        }
    };
于 2014-12-04T19:04:14.247 に答える
1

ハンドラが起動しないように初期化コードを処理する 2 つの方法。

初期化であることを認識するようにハンドラーを設計します。以下の例では、 isResumed() を使用して、コードが初期化中かどうかを判断します。これは、onResume の前に onCreate が呼び出されるため機能します。

@Override
public void onCheckedChanged(RadioGroup rg, int checkId) {
    switch (rg.getId()) {
        case R.id.rgMileKilometer:
            switch (checkId) {
                // process the speed radio group
                case R.id.rdoMiles:
                    // Speed Radio Group check if the mph button is checked
                    isMile = true;
                    break;
                case R.id.rdoKilometer:
                    isMile = false;
                    // Speed Radio Group check if the mph button is checked
                    break;
            }
            if (isResumed()) {
                //do something the code is ready...
            }
    }
}

初期化を行った後、リスナーを追加します

CheckBox cb = (CheckBox) view
            .findViewById(R.id.cbApplicationCacheTabs);
    cb.setChecked(isApplicationCacheTabs);
    cb.setOnCheckedChangeListener(this);
于 2014-12-04T18:55:07.377 に答える