0

我试图在 Holo.Light 和 Holo (Dark) 之间切换,因此我的应用程序中的所有内容都更改为用户在首选项中设置的主题。

我一直在查看一些已完成的开源应用程序,但似乎无法使其与我的项目一起使用,对此的任何帮助将不胜感激。

我在 DashboardActivity.java 中遇到的 Current ISSUE 是:

“我遇到了“setTheme(Integer.parseInt(pref.getString(”

仪表板活动(更新)

public class DashboardActivity extends Activity {

public static final int THEME_BLACK = R.style.DarkThemeAndroid;
public static final int THEME_WHITE = R.style.LightThemeAndroid;
public static final int THEME_WHITE_BLACK = android.R.style.Theme_Holo_Light_DarkActionBar;

@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            // I've having issue with the "pref.getString" i've tried "Settings.getString" and get error about needing a getString method is needed in Settings.java
    setTheme(Integer.parseInt( pref.getString("selectedTheme", String.valueOf(R.style.LightThemeAndroid) )));
    setContentView(R.layout.dashboard_layout);
          // the rest of my code
      )
    )

设置更新)

public class Settings extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

final static String[] mThemeEntries = {
    "Default (Light)", 
    "Dark"
    };
final static String[] mThemeValues = {  
    String.valueOf(R.style.LightThemeAndroid), 
    String.valueOf(R.style.DarkThemeAndroid)
    };
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Loads the XML preferences file.
    addPreferencesFromResource(R.xml.settings);
//  SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);


    ListPreference listPref = (ListPreference)findPreference("selectedTheme");

    listPref.setEntries(mThemeEntries);
    listPref.setEntryValues(mThemeValues);

    listPref.setValue( pref.getString("selectedTheme", String.valueOf(mThemeValues[0]) ) );

XML 资源

主题.xml

 <style name="LightThemeAndroid" parent="android:style/Theme.Holo.Light"> 
   </style>         

 <style name="DarkThemeAndroid" parent="android:style/Theme.Holo">
   </style>

设置.xml

  <ListPreference
android:title="Themes"
android:summary="Change the UI of the application"
android:key="theme"
android:entries="@array/themesReturnValue"
android:entryValues="@array/themesDisplayWord" 
android:defaultValue="Theme1" />

数组.xml

 <string-array name="themesReturnValue">
   <item>Light</item>
    <item>Dark</item>
    <item>LightActionBar</item>
         </string-array>   
<string-array name="themesDisplayWord">
    <item>Theme1</item>
    <item>Theme2</item>
    <item>Theme3</item>
        </string-array>
4

3 回答 3

0

ContextThemeWrapper类存在非静态 getTheme() 方法,该方法返回 Theme 对象类型。将 getTheme() 方法的名称更改为不同的名称,例如 getThe(),您应该没问题。

于 2013-01-15T03:28:48.950 回答
0

首先就像codeMagic说的,你以非静态方式调用getTheme,我也会把主题相关的常量放在1个类中。尝试使 getTheme 成为静态方法(尽管我可能会为主题创建一个单独的类)。除此之外,这是我 2 天前正在研究的一个解决方案,因为我在 google 或这里找不到任何关于更动态的流体主题偏好的答案。

我从我的偏好片段开始(在你的情况下,活动)。然后将主题和值声明为数组...

public class LayoutFragment extends PreferenceFragment {

final static String[] mThemeEntries = {
    "Default (Light)", 
    "Dark"
    };
final static String[] mThemeValues = {  
    String.valueOf(R.style.Theme_Default), 
    String.valueOf(R.style.Theme_Dark)
    };

然后在我的 oncreate 方法中,我设置了这些值(注意,在 xml 中我没有设置这些值,并且在 xml 文件中没有对这些值的引用)

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);                 
    addPreferencesFromResource(R.xml.pref_layout);
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());

    ListPreference listPref = (ListPreference)findPreference("selectedTheme");

    listPref.setEntries(mThemeEntries);
    listPref.setEntryValues(mThemeValues);

    listPref.setValue( pref.getString("selectedTheme", String.valueOf(mThemeValues[0]) ) );

}

请注意,我已将这些值转换为字符串,不要问为什么,但我在尝试存储这些资源 id 的 int 值时遇到了很多麻烦(这也是为什么不能选择 xml 值的原因)...

现在,当我需要根据用户偏好设置主题时......我只是打电话

setTheme(Integer.parseInt( pref.getString("selectedTheme", String.valueOf(R.style.Theme_Default) )));

当然,您可以在某处提供一个静态方法来进行铸件等,而无需为每个活动编写它。

编辑:你不需要数组是静态的,当我尝试不同的事情让它工作时,我必须像这样离开它们。

于 2013-01-22T15:16:36.120 回答
0

getTheme()是一个非静态方法,您正试图以静态方式调用它(而不是从实例变量)。您需要一个对象实例来调用非静态方法。此外,文档状态

请注意,这应该在上下文中实例化任何视图之前调用(例如,在调用 setContentView(View) 或 inflate(int, ViewGroup) 之前)。

文档

于 2013-01-15T03:24:15.870 回答