对android中设置活动的更改做出反应

对android中设置活动的更改做出反应,android,android-theme,android-settings,Android,Android Theme,Android Settings,好的,问题是我正试图让我的android应用程序有一个设置活动,让用户能够更改应用程序的一些功能(语言、主题等等)。我的问题出现在尝试让应用程序对其中一个首选项的值的更改做出反应时。比如主题一,;我的想法是有一个“切换偏好”。当它打开时,应用程序的主题是Material.Light,当它关闭时,则是Material。为此,我想有一些“onValueChanged”的方法,当开关改变位置时会做出反应。这里的问题是,我无法在SettingsActivity中正确获取SwitchPreference的

好的,问题是我正试图让我的android应用程序有一个设置活动,让用户能够更改应用程序的一些功能(语言、主题等等)。我的问题出现在尝试让应用程序对其中一个首选项的值的更改做出反应时。比如主题一,;我的想法是有一个“切换偏好”。当它打开时,应用程序的主题是Material.Light,当它关闭时,则是Material。为此,我想有一些“onValueChanged”的方法,当开关改变位置时会做出反应。这里的问题是,我无法在SettingsActivity中正确获取SwitchPreference的实例,这两种情况都是因为“findPreference(key)”方法已被弃用,而且我真的不知道如何使它获取所需键的值


有什么方法可以做到这一点,或者我应该改变思考这个问题的方式吗?

除了在onValue change listener中设置主题之外,您还可以执行以下操作:

1) 创建主题选择的MEUTILS类和do开关盒,并为活动设置主题。我创建了自己的样式,您可以在这里选择您的stlye名称

public class ThemeUtils {
public final static int THEME_Professional = 1;
public final static int THEME_Default = 2;
public static void onActivityCreateSetTheme(Activity activity, int sTheme) {
    switch (sTheme)
    {
    default:
    case THEME_Professional:
        activity.setTheme(R.style.ProfessionalTheme);
        break;
    case THEME_Default:
        activity.setTheme(R.style.DefaultTheme);
        break;
    }
}
}

2) 在活动的onCreate方法中,调用setTheme方法

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme();
  }
3) 获取用户选择的主题

   private void setTheme() {
    int themeInt = getThemeValue();
    ThemeUtils.onActivityCreateSetTheme(this, themeInt);
   }
4) 获取样式id后,可以在ActivityCreateSetTheme上调用MEUTILS类方法

private int getThemeValue() {
    SharedPreferences pref =     PreferenceManager.getDefaultSharedPreferences(getContext());
    Boolean isGrid = pref.getBoolean(getString(R.string.grid_switch), false);
    if (isGrid) {
        return 2;
    } else {
        return 1;
    }
}

希望这个选项能帮助你

我试图实现代码,看看它是如何工作的,看看它是否完成了任务,但我遇到了一个错误;“R.string.grid_开关”对应什么?它是开关首选项键。无论如何,如果我正确理解代码(可能我没有…XD),这就解决了一半问题。问题是,这里您在活动的onCreate方法上检查所选主题。在这种情况下,需要销毁活动并重新创建,以便激活更改。对我来说,最佳的解决方案是在开关改变位置后立即进行改变。也就是说,如果不可能的话,我可以最后放一些类似“应用程序重启后更改将生效”的东西,在这里继续,然后像那样解决它(XD)。这不是最优的,但有可能。。。