Android 使用开关按钮切换dayNight主题

Android 使用开关按钮切换dayNight主题,android,button,android-widget,android-theme,Android,Button,Android Widget,Android Theme,我在我的布局中实现了一个开关按钮,我想使用Android的日夜主题。使用这个按钮,日夜主题可以正常工作,但问题是当我点击开关时,它不能立即工作,我必须改变活动,然后它就可以工作了,例如如果我在一个活动中单击“切换”,它将不会执行任何操作,直到我按下“后退”按钮并移动到其他活动,然后再次返回该活动,并且当我更改活动并返回时,我的切换状态始终设置为默认状态,请帮助 我使用的是Android Studio和dayNight主题 下面是我的切换活动 @Override protected

我在我的布局中实现了一个开关按钮,我想使用Android的日夜主题。使用这个按钮,日夜主题可以正常工作,但问题是当我点击开关时,它不能立即工作,我必须改变活动,然后它就可以工作了,例如如果我在一个活动中单击“切换”,它将不会执行任何操作,直到我按下“后退”按钮并移动到其他活动,然后再次返回该活动,并且当我更改活动并返回时,我的切换状态始终设置为默认状态,请帮助

我使用的是Android Studio和dayNight主题

下面是我的切换活动

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {

        setContentView(R.layout.settings_page);
        DayNightt = (Switch)findViewById(R.id.dayNight_Switch);
        DayNightt.setChecked(false);
        DayNightt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

                }else{
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }
            }
        });
        super.onCreate(savedInstanceState);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}
XML交换活动

<Switch
        android:id="@+id/dayNight_Switch"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView"
        android:layout_marginTop="58dp"
        android:checked="false"
        android:text="Switch" />

更改后开关添加此方法:

super.recreate();
重新创建活动,如果工作正常,则设置正确主题

有些人喜欢这样:

DayNightt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    super.recreate();
                    //Or this
                    recreate();

                }else{
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    super.recreate();
                    //Or this
                    recreate();
                }
            }
        });
更新

如果第一种方法不起作用,您可以尝试以下方法:

DayNightt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    Intent intent = getActivity().getIntent();
                    getActivity().finish();
                    startActivity(intent);

                }else{
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    Intent intent = getActivity().getIntent();
                    getActivity().finish();
                    startActivity(intent);
                }
            }
        });

注意:第二种方法对我来说不是最好的,但你可以尝试。

我通过在活动中实现onPause()和onResume()方法解决了切换按钮状态的更改,现在切换状态在更改活动后保持不变,我也在活动中实现了一个捆绑包。我在onCreate方法之后添加了它

更新代码

 private static Bundle bundle = new Bundle();

   @Override
    public void onPause() {
        super.onPause();
        bundle.putBoolean("ToggleButtonState", DayNightt.isChecked());
    }
    @Override
    public void onResume() {
        super.onResume();
        DayNightt.setChecked(bundle.getBoolean("ToggleButtonState",false));
    }

剩下的唯一问题是我必须切换“活动”才能看到它的实现,我会在某个时候克服它。

super.recreate()对我的情况不起作用,重新创建只需在我单击“切换”按钮时冻结应用程序,然后在“活动”的super.oncreate()之后添加代码。不,先生,它仍然冻结:(还有其他选择吗?@rohib我用您可以尝试的其他方法更新我的答案。sir getActivity()显示无法解决方法错误