Android应用:将PreferenceFragment显示为对话框?

时间:2013-01-18 20:55:13

标签: android fragment android-preferences android-dialogfragment

我是Android新手(具有iOS背景),我想做以下事情: 我做了一个PreferenceFragment,在其中我要求用户将他的凭据连接到我的WebServices。当我检测到我的服务器拒绝了这些凭据时,我想向我的用户显示一个对话框(模态),他可以在其中编辑他的首选项(凭据)。

我已经设法使用PreferenceActivity来完成它。所以当我点击一个bouton时,我执行以下代码:

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

将PreferenceActivity作为带有XML资源的对话加载:

addPreferencesFromResource(R.xml.preferences_connection);

但这是折旧的。我可以这样做,但有片段吗?我应该使用DialogFragment来显示我的PreferenceFragment吗?在DialogFragment中重建我的凭据会更容易吗?我应该使用Activity而不是Fragment吗?

1 个答案:

答案 0 :(得分: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);
        }
    }
}

不要将对话框主题与设置活动相关联。对于某些首选项类型(如单选按钮),您将获得奇怪的结果。 (我尝试了对话框,无法找到编码错误。当我使用标准活动主题而不是对话框主题时,一切正常。显然,全息对话框主题与设置定义相冲突。

注意:我使用了startActivityforResult,因此我可以重新初始化更改的特定设置值。