【问题标题】:Android app : show PreferenceFragment as a dialog?Android 应用程序:将 PreferenceFragment 显示为对话框?
【发布时间】:2013-01-18 20:55:13
【问题描述】:

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

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

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

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

addPreferencesFromResource(R.xml.preferences_connection);

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

【问题讨论】:

    标签: android fragment android-preferences android-dialogfragment


    【解决方案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,因此我可以重新初始化已更改的特定设置值。

    【讨论】:

    • 看起来效果很好!但我有点担心兼容性。使用 PreferenceFragment 和 PreferenceActivity 时它会在未来的设备上运行吗?那么旧设备呢?
    • 我会接受你的回答,因为它确实很好地回答了这个问题!但是我刚刚发现很多人还在使用Android 2.3。所以这个解决方案对他们不起作用。你知道如何让它发挥作用吗?
    • 我对 2.x 的兼容性没有帮助。截至 1 月,40% 的市场价格在 15 sdk 或更高(ICS 或更高),并且每季度以超过 10% 的速度增长。我决定我的新应用程序将设置为最小和目标 sdk 15。简单地说,我决定我不想使用兼容性库,添加额外的可绘制文件夹,添加额外的布局库,编写我自己的下载管理器,或在活动和片段之间切换。在不添加版本相关代码的情况下为多个屏幕编写已经够糟糕的了。我的 2.x 应用程序没有设置最大 sdk 并且可以正常运行到 Jelly Bean。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2014-03-25
    • 2023-03-23
    相关资源
    最近更新 更多