如何强制子PreferenceScreen包含在Fragment布局(Android)中

时间:2016-04-29 14:54:53

标签: android android-fragments preferenceactivity preferencefragment preferencescreen

我对Android的Preference系统很新,我目前遇到了问题。

根据Android指南(http://developer.android.com/guide/topics/ui/settings.html)的建议,我使用了Preference Fragment。因此,我的SettingsActivity包含一些内容(标题,标题等标题)和下面的PreferenceFragment。

当我点击与" sub"相关联的首选项时,就会发生这种情况。 PreferenceScreen,"新的首选项屏幕"不尊重我片段的布局,而是填充整个活动。

这是一个例子:让我说我有一个PreferenceFragment调用addPreferenceFromResource(R.xml.preferences)。 preferences.xml确实包含"更改密码" preference,它是一个包含3个TextEditPreference的PreferenceScreen。

的preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">   
    <EditTextPreference android:title="@string/pref_one"/>
    <EditTextPreference android:title="@string/pref_two"/>

    <PreferenceScreen android:title="@string/pref_change_password">

        <EditTextPreference android:title="@string/pref_current_pass"
            android:inputType="textPassword"
            android:hint="@string/hint_current_password" />

        <EditTextPreference android:title="@string/pref_new_pass"
            android:inputType="textPassword"
            android:hint="@string/hint_new_password" />

        <EditTextPreference android:title="@string/pref_confirm_new_pass"
            android:inputType="textPassword"
            android:hint="@string/hint_confirm_new_password" />

    </PreferenceScreen>
</PreferenceScreen>

所以当我点击PreferenceScreen时,它会这样做: The entire activity is filled by the preferenceScreen

但我希望它能做到这一点: enter image description here

我该怎么做? 提前感谢您的回答!

1 个答案:

答案 0 :(得分:2)

好的,经过Android Reference的深入研究后,我找到了解决方案。

当点击子PreferenceScreen时,会打开包含新Preference对象的Dialog,而不是新的Activity或其他。

因此,解决方案是检索对话框并使其适合原始PreferenceFragment的布局。为此,我使用onPreferenceTreeClick回调方法来检测是否单击了PreferenceScreen:

public class SettingsFragment extends PreferenceFragment {

    // onCreate and other stuff...

    @Override
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, 
                                          Preference preference) {

        // Initiating Dialog's layout when any sub PreferenceScreen clicked
        if(preference.getClass() == PreferenceScreen.class) {
            // Retrieving the opened Dialog
            Dialog dialog = ((PreferenceScreen) preference).getDialog();
            if(dialog == null) return false;

            initDialogLayout(dialog);   // Initiate the dialog's layout
        }
        return true;
    }

    private void initDialogLayout(Dialog dialog) {
        View fragmentView = getView();

        // Get absolute coordinates of the PreferenceFragment
        int fragmentViewLocation [] = new int[2];
        fragmentView.getLocationOnScreen(fragmentViewLocation);

        // Set new dimension and position attributes of the dialog
        WindowManager.LayoutParams wlp = dialog.getWindow().getAttributes();
        wlp.x       = fragmentViewLocation[0]; // 0 for x
        wlp.y       = fragmentViewLocation[1]; // 1 for y
        wlp.width   = fragmentView.getWidth();
        wlp.height  = fragmentView.getHeight();

        dialog.getWindow().setAttributes(wlp);

        // Set flag so that you can still interact with objects outside the dialog
        dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    }
}

就是这样,这就成了伎俩。如果您认为有更好的方法,请发表评论。