标签: android-preferences

屏幕旋转时,为什么片段不会保留状态?

我在PreferenceFragment中获取一些自定义DialogPreference子类时遇到了一些麻烦,以便在旋转屏幕时保持可见.我在使用PreferenceActivity时没有遇到这个问题,因此我不知道它是Android错误还是代码问题,但我希望有人确认他们是否有相同的体验.

要对此进行测试,首先要创建一个包含至少一个DialogPreference的首选项屏幕(哪个子类无关紧要).然后在PreferenceActivity中显示它.运行应用程序时,请按DialogPreference以显示其对话框.然后旋转屏幕以使方向发生变化.对话框是否仍然可见?

然后尝试相同,但使用PreferenceFragment显示您的首选项而不是PreferenceActivity.再次,旋转屏幕时对话框是否仍然可见?

到目前为止,我发现如果使用PreferenceActivity,对话框将保持可见,但如果使用PreferenceFragment则不会.查看DialogPreference源代码,似乎正确的行为是对话框保持可见,因为在屏幕isDialogShowing重定向时onSaveInstanceState()调用时会保存状态信息.因此,我认为一个错误可能会阻止PreferenceFragment(及其中的所有内容)恢复该状态信息.

如果它是Android错误,那么它具有深远的影响,因为任何使用PreferenceFragment的人都无法保存和恢复状态信息.

有人可以确认吗?如果它不是一个错误,那么发生了什么?

android preferenceactivity android-preferences android-fragments dialog-preference

27
推荐指数
1
解决办法
2万
查看次数

安装应用程序时只运行一段代码

我想在我的应用程序中只运行一段代码,并且是第一次运行它时(新安装的应用程序).我怎么能这样做,任何人都可以解释给出一段代码.

实际上,在我的android项目中,我想创建数据库并在第一次运行时插入一些值.之后,该特定代码不应该再次运行.如何通过SharedPreferencesPreferences实现此机制.

示例代码将更有帮助.

android android-preferences sharedpreferences

27
推荐指数
4
解决办法
3万
查看次数

PreferenceActivity和主题不适用

大家好我已经在清单文件中设置了这样的主题:

android:theme="@android:style/Theme.Light"
Run Code Online (Sandbox Code Playgroud)

但我在首选项活动中有一个问题,在主要首选项中主题显示确定,但如果我得到一个子偏好,主题变得混乱,它不是白色应该,它是全黑的,字体是黑色,所以你看不到多少,当我开始点击任何项目时,他们有时会变成白色,但很快就会恢复到黑色.这只发生在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>
Run Code Online (Sandbox Code Playgroud)

这是一个截图:

替代文字http://i39.tinypic.com/16hnhh3.png

任何解决方法?

android themes android-preferences

25
推荐指数
1
解决办法
1万
查看次数

使用support.v7.preference时,首选项子屏幕无法打开

我正在尝试使用AppCompatActivity和support.v7.preference在子屏幕上实现首选项

根据文档,另一个PreferenceScreen中的每个PreferenceScreen都用作子屏幕,框架将处理单击时显示它. http://developer.android.com/guide/topics/ui/settings.html#Subscreens

<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- opens a subscreen of settings -->
    <PreferenceScreen
        android:key="button_voicemail_category_key"
        android:title="@string/voicemail"
        android:persistent="false">
        <ListPreference
            android:key="button_voicemail_provider_key"
            android:title="@string/voicemail_provider" ... />
        <!-- opens another nested subscreen -->
        <PreferenceScreen
            android:key="button_voicemail_setting_key"
            android:title="@string/voicemail_settings"
            android:persistent="false">
            ...
        </PreferenceScreen>
        <RingtonePreference
            android:key="button_voicemail_ringtone_key"
            android:title="@string/voicemail_ringtone_title"
            android:ringtoneType="notification" ... />
        ...
    </PreferenceScreen>
    ...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

这可以使用本机Activity,PreferenceFragment工作正常...但是使用AppCompatActivity和PreferenceFragmentCompat,单击Preference元素只会突出显示它,但不会打开子屏幕.

我在这个文档和代码上找不到任何东西......我需要实现任何额外的回调吗?


编辑:只是为了完整...

这可以工作并打开子屏幕:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new DemoPreferenceFragment())
                    .commit();
        }
    }

    static public class DemoPreferenceFragment extends PreferenceFragment {

        @Override …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-preferences

25
推荐指数
2
解决办法
8011
查看次数

首选项支持库 - SwitchPreference无法正常工作

几天前谷歌推出了Preference Support Library(Link).我刚刚尝试在我的应用程序中实现它,虽然看起来它不能用于SwitchPreferences哪个是奇怪的,因为谷歌表示我们可以使用与以前相同的XML文件,并且明确表示SwitchPreferences现在可用于所有API 7+设备.

报价(来源)

[...]并使用相同的首选XML文件(http://goo.gl/wOcIxI)添加首选项,同时向所有API 7+设备添加对SwitchPreference等元素(以前仅在API 14+设备上可用)的支持.[...]

错误信息

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package/com.my.package.Main}: android.view.InflateException: Binary XML file line #4: Error inflating class (not found)SwitchPreference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Run Code Online (Sandbox Code Playgroud)

相关部分显然是Binary XML file line #4: Error inflating class (not found)SwitchPreference.

Java代码

public class FragmentSettings extends PreferenceFragmentCompat {

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android android-preferences android-support-library android-switch

24
推荐指数
1
解决办法
7556
查看次数

Android偏好的默认值

如何获得XML中定义的Android首选项的默认值?我不想在代码和首选项XML中重复默认值的定义.

android android-preferences

23
推荐指数
2
解决办法
3万
查看次数

将UI首选项"摘要"字段设置为首选项的值

Android新手,我在用户更改首选项时有一些代码我将UI首选项中的"摘要"字段更新为他们输入的值.但是,在创建首选项活动时,我想将"摘要"字段设置为相应首选项中的值.请指教.谢谢.

public class MyPreferenceActivity extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
        sp.registerOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Preference pref = findPreference(key);
        if (pref instanceof EditTextPreference) {
            EditTextPreference etp = (EditTextPreference) pref;
            pref.setSummary(etp.getText());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-preferences

23
推荐指数
2
解决办法
4万
查看次数

如何使用android.support.v7.preference库创建自定义首选项?

我想支持至少api 10,我希望能够很好地设置我的偏好,我希望能够有标题(或显示PreferenceScreens).似乎PreferenceActivity不完全支持AppCompat着色,不适合.所以我正在尝试使用AppCompatActivityPreferenceFragmentCompat.

public class Prefs extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null)
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new PreferencesFragment())
                    .commit();
    }

    public static class PreferencesFragment extends PreferenceFragmentCompat {
        @Override public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }

        @Override
        public void onDisplayPreferenceDialog(Preference preference) {
            // the following call results in a dialogue being shown
            super.onDisplayPreferenceDialog(preference);
        }

        @Override public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
            // I can probably …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-preferences android-support-library

23
推荐指数
1
解决办法
1万
查看次数

当其他首选项被禁用时,如何在我的Android应用程序中启用首选项?

我曾经PreferenceActivity在我的Android应用程序中有偏好.我想要一个偏好说"pref 2"在其他偏好说"pref 1"未被选中时被启用,而"pref 2"在被选中"pref 1"时被禁用.即恰好与android:dependancy属性相反.

我怎样才能做到这一点?

android android-preferences

22
推荐指数
3
解决办法
2万
查看次数

设置多个SharedPreferences实例/文件的默认值

假设我有一个应用程序将首选项保存到两个文件,preferences1.xmlpreferences2.xml.然后,我可以使用以下代码检索对相应对象的引用:

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以操纵两者的首选项并注册侦听器以获取两者的更改.

我对这两个文件的初始化有一些疑问,使用setDefaultValues:

问题1 - PreferenceFragment上下文:我已经创建了一个PreferenceActivity具有两个PreferenceFragments和内的onCreate每一个I执行下面的代码的方法(与图1和2为取代片段1 X和2):

PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
Run Code Online (Sandbox Code Playgroud)

我已经看到两个片段在启动时都正确地设置了它们的默认值.但是,鉴于我在应用程序的shared_prefs目录中只能看到一个_has_set_default_values.xml文件,它是如何理解属性的preferences1.xmlpreferences2.xml已经设置好了吗?只要在第一个打开的PreferenceFragment中调用setDefaultValues就会创建此文件,但即使在此之后,如果我打开第二个PreferenceFragment,它也会正确初始化默认值.如何理解它尚未初始化preferences2.xml以及_has_set_default_values.xml的目的是什么,因为它不包含有关哪些优先文件已被初始化的信息?

问题2 - 标准活动上下文:当我启动我的应用程序时,PreferenceActivity不是第一个启动的活动,用户可能永远不会打开它,所以我想在主Activity中初始化两个首选项文件及其默认值,我怎样才能做到这一点?对于默认的共享首选项,很容易:

PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false); 
Run Code Online (Sandbox Code Playgroud)

对于两个首选项文件,我该怎么办?我无法执行以下操作,因为我无法在PreferenceFragment类中检索PreferenceManager的实例:

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND …
Run Code Online (Sandbox Code Playgroud)

android preferenceactivity android-preferences sharedpreferences android-activity

21
推荐指数
1
解决办法
2701
查看次数