4

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

我已经设法使用 PreferenceActivity 做到了。因此,当我单击一个按钮时,我执行以下代码:

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

它将 PreferenceActivity 作为带有 XML 资源的 Dialog 加载:

addPreferencesFromResource(R.xml.preferences_connection);

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

4

1 回答 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);
        }
    }
}

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

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

于 2013-01-19T04:30:44.657 回答