Android应用程序:如何将PreferenceFragment显示为对话框?

4

我是一名 iOS 开发者,现在接触 Android,想要实现以下功能:

我创建了一个 PreferenceFragment 用于获取用户连接 WebServices 的凭据。当服务器返回凭据无效时,我希望能够弹出一个对话框(模态),让用户编辑自己的偏好设置(凭据)。

使用 PreferenceActivity 我已经成功实现了这个功能。当点击按钮时,执行以下代码:

Intent settingsActivity = new Intent(getActivity().getBaseContext(), PreferencesConnection.class);
startActivity(settingsActivity);

如何使用XML资源将PreferenceActivity作为对话框加载:

addPreferencesFromResource(R.xml.preferences_connection);

但是这种方法已经被废弃了。我可以使用Fragment实现同样的功能吗?我应该使用DialogFragment来展示我的PreferenceFragment吗?或者在DialogFragment中重新构建凭证是否更容易?我应该使用Activity而不是Fragment吗?

1个回答

1
要创建一个没有PreferenceHeaders的老式单页面设置屏幕,请按照以下步骤进行:
在调用设置屏幕的活动中(示例在onMenuItemSelected中):
case R.id.menuSettings:
        Intent settingsIntent = new Intent(this, SettingsActivity.class);
        startActivityForResult(settingsIntent, GC.SETTINGS_ACTIVITY_ID);
        break;

在您的XML文件夹中,创建一个老式的PreferenceScreen。包括PreferenceCategory、ListPreference、CheckBoxPreference等。请勿使用PreferenceHeaders。
创建一个设置活动:
package com.mycompany.project1;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;

public class SettingsActivity extends PreferenceActivity {

    private final static String TAG = "SettingsAcitivity";

    public SettingsActivity() {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyLog.d(TAG, "onCreate");
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new LocationFragment()).commit();
    }

    public static class LocationFragment extends PreferenceFragment {

        private String TAG = "LocationFragment";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            MyLog.d(TAG, "onCreate");
            addPreferencesFromResource(R.xml.settings);
        }
    }
}

请勿将对话主题与设置活动相关联。对于某些偏好类型(如单选按钮),您将得到奇怪的结果。(我尝试了对话框,但找不到编码错误。当我使用标准活动主题而不是对话框主题时,一切都正常工作。显然,Holo对话框主题与设置定义冲突。)
注意:我使用“startActivityforResult”,这样我可以重新初始化更改的特定设置值。

看起来很好用!但我有一点担心兼容性。在使用PreferenceFragment和PreferenceActivity时,它会在未来的设备上工作吗?那么旧设备呢? - NLemay
我会接受你的答案,因为它确实很好地回答了这个问题!但是我刚刚发现很多人仍在使用Android 2.3。所以这个解决方案对他们来说不起作用。你有什么想法可以让它起作用吗? - NLemay
1
我对2.x兼容性没有帮助。截至1月份,40%的市场处于sdk 15或更高版本(ICS或更高版本),每个季度增长率超过10%。我决定我的新应用程序将设置为最小和目标sdk为15。简单地说,我决定不想使用兼容库,添加额外的可绘制文件夹,添加额外的布局库,编写自己的下载管理器或在活动和片段之间切换。编写适用于多个屏幕的应用程序已经足够繁琐了,不需要再添加发布相关代码。我的2.x应用程序没有设置最大sdk,可以在Jelly Bean上正常运行。 - Howard Hodson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接