【问题标题】:Using Themes in Android在 Android 中使用主题
【发布时间】:2013-01-15 03:06:06
【问题描述】:

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

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

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

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

DashboardActivity(更新)

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>

【问题讨论】:

    标签: java android themes settings android-preferences


    【解决方案1】:

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

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

    Docs

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        首先就像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) )));
        

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

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

        【讨论】:

        • 我已经更新了上面的一些代码,非常感谢你帮助我解决这个问题,但是我仍然遇到了一些麻烦,你能看看我上面的代码,看看我去哪里了数组。
        • 尝试从您的设置 xml 中删除条目、entryValues 和 defaultEntry。是否有任何错误导致它无法编译?您还应该更改与您的环境相匹配的值...例如, (ListPreference)findPreference("selectedTheme");应该是 (ListPreference)findPreference("theme");
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多