use*_*896 12 settings android preferences preferenceactivity preferencefragment
我已经实现了我的偏好,如官方指南中所示.
我有一个PreferenceActivity,可以像这样创建PreferenceFragment:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if (extras != null)
{
Bundle bundle = new Bundle();
_widgetID = extras.getInt(GlobalSettings.EXTRA_WIDGET_ID);
bundle.putInt(GlobalSettings.EXTRA_WIDGET_ID, _widgetID);
WidgetSettingsFragment fragment = new WidgetSettingsFragment();
fragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(android.R.id.content,
fragment).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
PreferenceFragment从资源加载首选项,它们包含一个首选项子屏幕,如下所示:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opens a subscreen of settings -->
<PreferenceScreen
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
<ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />
<!-- opens another nested subscreen -->
<PreferenceScreen
android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...
</PreferenceScreen>
<RingtonePreference
android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...
</PreferenceScreen>
...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
到目前为止这种方法效果很好,但现在我想up-Button在显示首选项子屏幕时在actionBar中有一个.知道怎么做到这一点?
我试图setDisplayHomeAsUpEnabled(true)在我的活动中设置,但是按钮只显示在主要首选项中(不应该在哪里),而不是在子屏幕中.
我想知道即使在官方文档中,子屏幕也没有活动的按钮显示:

链接到文档:设置
任何帮助都非常受欢迎
use*_*896 13
我终于开始工作了:D.它非常hacky但它的工作原理.
问题是,在xml-layouts中使用子屏幕导致一些"代码魔术".子屏幕启动了一个新的活动/对话框,您无法直接访问它.
要访问操作栏和主页/上行按钮的OnClickListener,您需要获取对PreferenceScreen的引用并获取其父对话框以访问操作栏及其主页/向上按钮.
这是我在PreferenceFragment中完成的方式:
@Override
public void onCreate(Bundle savedInstanceState)
{
...
final PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference(getString(R.string.keyPrefScreenDynamicWidgetDetails));
preferenceScreen.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference preference)
{
preferenceScreen.getDialog().getActionBar().setDisplayHomeAsUpEnabled(true);
final Dialog dialog = preferenceScreen.getDialog();
View homeBtn = dialog.findViewById(android.R.id.home);
if (homeBtn != null)
{
OnClickListener dismissDialogClickListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
dialog.dismiss();
}
};
// Prepare yourselves for some hacky programming
ViewParent homeBtnContainer = homeBtn.getParent();
// The home button is an ImageView inside a FrameLayout
if (homeBtnContainer instanceof FrameLayout) {
ViewGroup containerParent = (ViewGroup) homeBtnContainer.getParent();
if (containerParent instanceof LinearLayout) {
// This view also contains the title text, set the whole view as clickable
((LinearLayout) containerParent).setOnClickListener(dismissDialogClickListener);
} else {
// Just set it on the home button
((FrameLayout) homeBtnContainer).setOnClickListener(dismissDialogClickListener);
}
} else {
// The 'If all else fails' default case
homeBtn.setOnClickListener(dismissDialogClickListener);
}
}
return true;
}
});
...
}
Run Code Online (Sandbox Code Playgroud)
以下链接给了我最后的提示和代码来解决我的问题:
操作栏主页按钮无法使用嵌套的PreferenceScreen
| 归档时间: |
|
| 查看次数: |
7610 次 |
| 最近记录: |