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