2

我对Android的偏好系统很陌生,目前我面临一个问题。如何强制子PreferenceScreen包含在片段布局(Android)

根据Android指南(http://developer.android.com/guide/topics/ui/settings.html)的建议,我使用偏好片段。因此,我的设置活动包含一些东西(如标题,标签等标题)和下面的PreferenceFragment。

事情是,当我点击与“子”PreferenceScreen相关的首选项时,“新的首选项屏幕”不尊重我的片段的布局,而是填充整个活动。

下面是一个例子:比方说,我有一个调用addPreferenceFromResource(R.xml.preferences)的PreferenceFragment。 preferences.xml确实包含“更改密码”首选项,该首选项是包含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

我该怎么办那? 非常感谢您的回答!

回答

2

好吧,经过深入了解Android Reference之后,我找到了解决方案。

看起来,当一个子PreferenceScreen被点击时,一个包含新的Preference对象的对话框被打开,而不是一个新的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); 
    } 
} 

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

+0

它的工作。但没有影子。你需要处理自己的操作栏图标后按。 – motis10