Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 首选项活动和主题不适用_Android_Themes_Android Preferences - Fatal编程技术网

Android 首选项活动和主题不适用

Android 首选项活动和主题不适用,android,themes,android-preferences,Android,Themes,Android Preferences,嗨,我在清单文件中设置了如下主题: android:theme="@android:style/Theme.Light" @Override public void onCreate(Bundle savedInstanceState) { setTheme(R.style.Holo_Theme_Light); super.onCreate(savedInstanceState); } 但是我在Preferenc

嗨,我在清单文件中设置了如下主题:

android:theme="@android:style/Theme.Light"
        @Override
        public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Holo_Theme_Light);
        super.onCreate(savedInstanceState);
        }
但是我在Preferences活动中遇到了一个问题,在主首选项中主题显示ok,但是如果我进入子首选项,主题会变得混乱,它不是应该的白色,它是黑色的,字体是黑色的,所以你看不到太多,当我开始点击任何项目时,它们有时会变为白色,但很快就会变为黑色。这只发生在2.1上,在真实设备和模拟器中都是如此。在运行1.6的模拟器上进行了测试,测试结果正常。以下是首选项xml文件的部分代码:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen
        android:title="@string/account">
        <CheckBoxPreference
            android:key="enable_account"
            android:title="@string/account_use"
            android:summary="@string/account_summ" />
        <EditTextPreference
            android:key="username"
            android:title="@string/login"
            android:dependency="enable_account"
            android:summary="@string/login_summ" />
        <EditTextPreference
            android:key="password"
            android:title="@string/password"
            android:dependency="enable_account"
            android:summary="@string/password_summ"
            android:password="true" />
    </PreferenceScreen>

下面是一个屏幕截图:


有什么解决办法吗?

这似乎是个bug。请参见

有人刚刚在

简言之,顶级首选项屏幕似乎能识别主题,但嵌套屏幕却不能识别。因此,解决方案建议为嵌套的PreferenceScreen创建顶级PreferenceActivity,然后通过intent调用此新活动:

<PreferenceScreen android:key="key1"
                      android:title="1 Item"
                      android:summary="">
        <intent android:action="android.intent.action.VIEW"
                android:targetPackage="com.example"
                android:targetClass="com.example.PreferenceActivity2"/>
</PreferenceScreen>


除了应用程序本身,我不必将主题应用于任何东西。

最后我发现了如何以编程方式(通过java代码)更改“PreferenceActivity”的主题

要更改主题,请执行以下操作:

android:theme="@android:style/Theme.Light"
        @Override
        public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Holo_Theme_Light);
        super.onCreate(savedInstanceState);
        }
始终调用
setTheme(R.style.yourtheme)
super.onCreate(savedInstanceState)之前的方法方法。这样做将产生如下所示的结果

就这些

如果你调用
setTheme(R.style.yourtheme)super.onCreate(savedInstanceState)之后的code>method方法它将产生如下所示的结果


注意:嵌套首选项屏幕无法识别主题。要将主题应用于该嵌套首选项屏幕,您必须为该嵌套首选项屏幕创建另一个首选项活动,并调用
setTheme(R.style.yourtheme)方法。

您还可以使用此技术覆盖内部首选项屏幕的样式:

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
        Preference preference) {
    super.onPreferenceTreeClick(preferenceScreen, preference);
    if (preference != null) {
        if (preference instanceof PreferenceScreen) {
            if (((PreferenceScreen) preference).getDialog() != null) {
                ((PreferenceScreen) preference)
                        .getDialog()
                        .getWindow()
                        .getDecorView()
                        .setBackgroundDrawable(
                                this
                                .getWindow()
                                .getDecorView()
                                .getBackground()
                                .getConstantState()
                                .newDrawable()
                        );
            }
        }
    }
    return false;
}

此代码将主首选项屏幕的样式应用于单击的首选项屏幕。

如果您愿意使用看似黑魔法的方法来完成此操作,则有一个更简单的解决方案

查看的源代码,我们看到该对话框是使用通过
mContext.getThemeResId()
获得的主题资源创建的,该主题资源随后用于
ContextThemeWrapper

这对我们有很大帮助,因为
首选项屏幕中使用的
上下文
实际上是我们的
首选项活动
,所以我们所要做的就是重写
getThemeResId()
方法(该方法在公共API中隐藏),以提供我们的自定义主题,子首选项屏幕现在使用我们想要的任何自定义主题资源

/**
 * This is a hack to provide our own theme for the PreferenceScreen's dialog.
 *
 * @see android.preference.PreferenceScreen#showDialog(Bundle)
 */
public int getThemeResId() {
    return R.style.Theme_MyApp_PreferenceScreen;
}
请注意,由于此方法是用
@hide
注释的,因此我们不能使用通常在这种情况下使用的
@Override
注释;我们也不能调用
super.getThemeResId()
方法。如果您真的、真的希望能够有条件地覆盖此项并将超级实现作为回退调用,则必须使用反射来访问超级实现的方法:

        try {
            ((Object) this).getClass().getMethod("getThemeResId").invoke(this);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

可能不是很有帮助,但我在我的大多数应用程序中使用灯光主题,但我将首选项保留在默认的黑色主题中,因为这似乎是合适的,我的观点是,用户希望所有应用程序首选项都具有相同的样式。好主意!谢谢现在,如果答案是注释,我如何标记回答的问题?检查答案中的链接,现在有一个更简单的解决方案,请参见注释35还有一个解决方案比这两个解决方案都更简单;看看我的答案。是的,我同意!我可以确认它的工作,这是最简单的解决方案!不起作用。。。你能提供一个更完整的例子吗?反射几乎总是肮脏的,而不是长期的解决方案。