0

SwitchCompatアクティビティにいくつかOnCheckedChangeListenerありますが、(を使用してSharedPreferences)アクティビティを開始するたびに、オンかオフかに関係なく OnCheckedChangeListener のアクションが実行されます(これはパフォーマンスが非常に悪いため、オン状態のアクションは、シェル スクリプトを実行し、SnackBar時間がかかるので a を表示することです)。

ここに小さなコードがあります...

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
        //Private stuffs...
        SwitchCompat play; //and many others
        public static final String PREFS_NAME = "SwitchButton";

        protected void onCreate(Bundle savedInstanceState) {
        // ...
        play = (SwitchCompat) findViewById(R.id.play_switch);
        play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Shell.SU.run("sh /data/data/br.com.packagename/play_on");
                    Snackbar snack_play_on = Snackbar.make(play, R.string.play_on, Snackbar.LENGTH_SHORT);
                    snack_play_on.show();

                    SharedPreferences.Editor editor = getSharedPreferences("SwitchButton", MODE_PRIVATE).edit();
                    editor.putBoolean("onPlay", true);
                    editor.apply();

                } else {
                    Shell.SU.run("sh /data/data/br.com.packagename/play_off");
                    SharedPreferences.Editor editor = getSharedPreferences("SwitchButton", MODE_PRIVATE).edit();
                    editor.putBoolean("onPlay", false);
                    editor.apply();

                    Snackbar snack_play_off = Snackbar.make(play, R.string.play_off, Snackbar.LENGTH_SHORT);
                    snack_play_off.show();
                }
            }
        });
        play.setChecked(sharedPrefs.getBoolean("onPlay", false));

だから... Snackbarが示すアクティビティ(アプリ自体)を開くたびに、SwitchCompatのオン状態にリンクされたアクションが実行されます。これにより、アクティビティのロード時にフレーム スキップが多すぎます (1GB、1.2GHz クアッド デバイスで約 230)。Switch は 1 つ以上、4 つまたは 5 つです。

私は何をすべきか?私は何かを見逃していますか、それともコードを間違った場所に置いていますか? OnResume、OnPause などの他のメソッドを使用する必要がありますか?

4

1 に答える 1

0

呼び出しsetChecked()は、ユーザーがクリックするのと同じ方法でリスナーを呼び出します。

すべてのチェックボックスを次のように設定するようになりました。

        play = (SwitchCompat) findViewById(R.id.play_switch);
        play.setOnCheckedChangeListener(null);
        play.setChecked(sharedPrefs.getBoolean("onPlay", false));
        play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           ...
于 2016-05-21T15:23:12.500 に答える