4

これはそれほど問題ではありませんが、私はこれを行う正しい方法を見つけようとしています。

私は次の状況にあります:

public class SettingsDialogFragment extends DialogFragment implements OnCheckedChangeListener {

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.settings, container);

    ...

    CheckBox lBox1  = (CheckBox)view.findViewById(R.id.checkBox1);

    lBox1.setOnCheckedChangeListener(this);
    lBox1.setChecked(true);

    return view;
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    ....

}

私が抱えている「問題」はsetChecked(true)、onCheckChangedを呼び出すことですでに起動することです。レイアウトを膨らませるCheckBoxと、はfalse設定で初期化され、それをtrueに変更するのは実際にCheckedChangedイベントだと思います。

もちろん、初期値を設定した後で順序を変更してリスナーを割り当てることもできますが、さまざまなコンポーネントの初期値を渡しながら、レイアウトを膨らませる方法はありますか?それらは動的であるため、settings.xmlの特定の値に値を固定することはできません

乾杯

4

6 に答える 6

6

上記の提案は良いですが、この問題はチェック可能なListViewにまだ存在します。私はこの方法でそれを解決しました:リスナーを無効にし、チェック状態を設定してから、リスナーを再度設定します。ヘルパー関数は次のとおりです。

private void checkCheckBox(CheckBox checkBox, boolean checked) {
    checkBox.setOnCheckedChangeListener(null);
    checkBox.setChecked(checked);
    checkBox.setOnCheckedChangeListener(this);
}
于 2013-03-27T12:59:03.813 に答える
4

あなたはあなた自身の質問に答えました、それはが呼ばれるsetChecked(true)原因になっています。OnCheckedChangeListener

android:checked="true"簡単な修正は、CheckBox XML宣言に追加し、setChecked(true)呼び出しを省略することです。

于 2013-01-10T13:53:40.893 に答える
3

CheckBoxのコードは次のようになります。

public void setChecked(boolean checked) {
    if (mChecked != checked) {
        mChecked = checked;
        refreshDrawableState();

        // Avoid infinite recursions if setChecked() is called from a listener
        if (mBroadcasting) {
            return;
        }

        mBroadcasting = true;
        if (mOnCheckedChangeListener != null) {
            mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
        }
        if (mOnCheckedChangeWidgetListener != null) {
            mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
        }

        mBroadcasting = false;            
    }
}

したがって、基本的に、イベントハンドラーを前に削除または無効にする(または後でのみ設定する)場合を除いて、イベントを発生させずにメソッドを使用することはできません。

于 2013-01-10T14:18:43.877 に答える
1

初期値を設定したいだけの場合は、最初の提案がおそらく最善です。すべてを初期化した後でリスナーを登録するだけです。

于 2013-01-10T13:39:26.447 に答える
0

解決策はOnTouchListenerです。デフォルトでは、OnCheckedChangeListenerを設定しません。あなたがしなければならないことは次のとおりです。

**declared in the class object declaration**:
OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            **have fun**
        }
    };

**used to the point you would have set the OnCheckedChangeListener**
anyView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                anyUsableView.setOnCheckedChangeListener(onCheckedChangeListener);

                return false;
            }
        });

OnTouchListenerにfalseを返すことは非常に重要です。そうでない場合、ビューは機能しなくなります。

ヒント:このソリューションは、それに適したあらゆる種類のリスナーで使用できます(私はSwitchウィジェットで使用しています)

于 2015-04-16T13:44:55.573 に答える
0

解決策は、チェックされた値を設定する前にリスナーをデタッチするsetChecked()関数である可能性があります。

public void setCheckedNoEvent(boolean checked) {
    if (onCheckedChangeListener == null) {
        switcher.setChecked(checked);
    } else {
        switcher.setOnCheckedChangeListener(null);
        switcher.setChecked(checked);
        switcher.setOnCheckedChangeListener(OnCheckedChangeListener);
    }
}
于 2016-08-19T04:12:31.697 に答える