我对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时,它会这样做:
我该怎么做? 提前感谢您的回答!
答案 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);
}
}
就是这样,这就成了伎俩。如果您认为有更好的方法,请发表评论。