首页 > 解决方案 > Android Switch 不断切换回原来的样子

问题描述

我在我的一个片段上进行了此开关,以从深色主题切换到浅色主题。唯一的问题是,当我在返回片段时打开开关离开片段时,开关是关闭的,而不是像我离开它时那样打开。

这是图像。

当我继续片段时:片段关闭

当我拨动开关时:Fragment Switch On

然后我离开片段,然后回到片段:片段关闭而应该打开

她是我的代码:

SettingsFragment.java:

package com.barzalou.lpapineau.test.ui.settings;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProviders;

import com.barzalou.lpapineau.test.R;
import com.barzalou.lpapineau.test.ui.CheckedChangeCallback;

import java.util.Objects;

public class SettingsFragment extends Fragment {

    private SettingsViewModel settingsViewModel;

    private CheckedChangeCallback callback = null;
    public void onAttach(final Activity activity) {
        super.onAttach(activity);
        if (activity instanceof CheckedChangeCallback) {
            this.callback = (CheckedChangeCallback) activity;
        }
    }
    public void onDetach() {
        super.onDetach();
        callback = null;
    }

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) {
        settingsViewModel = ViewModelProviders.of(this).get(SettingsViewModel.class);
        View root = inflater.inflate(R.layout.fragment_settings, container, false);
        final TextView textView = root.findViewById(R.id.text_settings);
        settingsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }

    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        final Switch DarkMode = (Switch) getView().findViewById(R.id.DarkModeSwitch);

        final boolean DarkModeVal = DarkMode.isChecked();
        Log.d("Dark Mode Checked Value", String.valueOf(DarkModeVal));

        DarkMode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                callback.onCheckedChange(isChecked);
            }
        });
    }
}

SettingsViewModel.java:

package com.barzalou.lpapineau.test.ui.settings;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class SettingsViewModel extends ViewModel {

    private MutableLiveData<String> mText;

    public SettingsViewModel() {
        mText = new MutableLiveData<>();
        mText.setValue("Settings");
    }

    public LiveData<String> getText() {
        return mText;
    }
}

CheckedChangeCallback.java:

package com.barzalou.lpapineau.test.ui;

public interface CheckedChangeCallback {
    void onCheckedChange(boolean isChecked);
}

MainActivity.java:

package com.barzalou.lpapineau.test;

import android.content.Intent;
import android.content.SharedPreferences;
import android.media.audiofx.Equalizer;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.widget.CompoundButton;
import android.widget.Switch;

import com.barzalou.lpapineau.test.ui.CheckedChangeCallback;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.appcompat.app.AppCompatDelegate;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity implements CheckedChangeCallback {

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_exit) {
            finish();
            System.exit(0);
        }
        return false;
    }

    public void onCheckedChange(boolean isChecked) {
        Switch DarkMode = findViewById(R.id.DarkModeSwitch);

        if (isChecked) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            Log.d("Dark Mode Switch State", "On");
            DarkMode.setChecked(true);
        }
        else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            Log.d("Dark Mode Switch State", "Off");
            DarkMode.setChecked(false);
        }
    }
}

片段设置.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="#fff"
    android:padding="10dp"
    tools:context=".ui.home.HomeFragment">

    <!-- Title -->
    <TextView
        android:id="@+id/text_settings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:shadowColor="#bfbfbf"
        android:shadowDx="5"
        android:shadowDy="5"
        android:shadowRadius="0.01"
        android:text="@string/this_is_home"
        android:textAlignment="center"
        android:textColor="#000"
        android:textSize="34sp" />
    <!-- ...... -->

    <!-- Card_View Settings -->
    <androidx.cardview.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view_outer"
        android:layout_width="match_parent"
        android:layout_height="90dp"
        android:layout_gravity="center"
        android:translationY="60dp"
        android:layout_marginLeft="3dp"
        android:layout_marginStart="3dp"
        android:layout_marginTop="3dp"
        card_view:cardBackgroundColor="#d3d3d3"
        card_view:cardCornerRadius="4dp"
        card_view:cardElevation="0dp" />

    <androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view_inner"
        android:layout_width="match_parent"
        android:layout_height="90dp"
        android:layout_gravity="center"
        android:translationY="60dp"
        android:layout_marginRight="3dp"
        android:layout_marginEnd="3dp"
        card_view:cardBackgroundColor="#f5f5f5"
        card_view:cardCornerRadius="4dp"
        card_view:cardElevation="3dp" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="10dp"
            android:elevation="4dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:text="@string/Settings"
                android:textSize="22sp"/>
            <Switch
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:id="@+id/DarkModeSwitch"
                android:text="@string/dark_mode"/>
        </LinearLayout>
    </androidx.cardview.widget.CardView>
    <!-- .................. -->

    <!-- Card_View 2 -->
    <androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view_1"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:translationY="170dp"
        android:layout_marginRight="3dp"
        android:layout_marginEnd="3dp"
        card_view:cardBackgroundColor="#f5f5f5"
        card_view:cardCornerRadius="4dp"
        card_view:cardElevation="3dp" />

    <androidx.cardview.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view_2"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:translationY="170dp"
        android:layout_marginLeft="3dp"
        android:layout_marginStart="3dp"
        android:layout_marginTop="3dp"
        card_view:cardBackgroundColor="#d3d3d3"
        card_view:cardCornerRadius="4dp"
        card_view:cardElevation="0dp" >
    </androidx.cardview.widget.CardView>
    <!-- ........... -->
</RelativeLayout>

如何解决这个问题?我希望它在黑暗主题开启时保持翻转。

谢谢!

标签: javaandroidxml

解决方案


由于片段重新创建,切换结果丢失。所以你应该保存切换结果。例如,SharedPreference


推荐阅读