我已经实现了我的偏好,如官方指南中所示。
我有一个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();
}
}PreferenceFragment从资源中加载首选项,它们包含一个像这样的首选项subscreen:
<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>到目前为止,这是很好的工作,但现在我想在up-Button中有一个在actionBar中显示的首选项subscreen。知道怎么做到吗?
我尝试在我的活动中设置setDisplayHomeAsUpEnabled(true),但是向上按钮只显示在主首选项中(在不应该显示的地方),而不是在subscreen中。
我想知道,即使在官方文档中,subscreen也没有活动的向上按钮:

链接到文档:设置
任何帮助都是受欢迎的。
发布于 2014-02-07 23:52:09
我终于把它做好了:D.它很烦人,但很管用。
问题是,在xml布局中使用子屏幕会产生某种“代码魔术”。subscreen将启动一个新的活动/对话框,您无法直接访问它。
要访问actionbar和home/up按钮的OnClickListener,您需要获得对您的PreferenceScreen的引用,并获得它的父对话框,以便访问actionbar及其home/up按钮。
在我的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;
}
});
...
}下面的链接为我提供了解决问题的最后提示和代码:
发布于 2014-02-04 20:08:36
我在“支持具有首选项标题的旧版本”部分的http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders中按照Android文档这样做。使用遗留的PreferenceActivity,您可以在xml中指定一个首选项,该首选项将对相同的首选项活动类启动意图。该活动检查意图操作,并确定它是否是嵌套的(以显示up按钮),以及在屏幕中使用哪种首选xml。
当然,我也打算支持较旧的设备。我发现PreferenceFragment只对使用首选项头的大型平板电脑有用。
为了在手机和平板电脑之间重用首选项,我想出了一个解决方案https://stackoverflow.com/a/20806812/1139784
发布于 2014-02-05 07:59:49
若要启用up操作,请执行以下操作:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayUseLogoEnabled(true);这会给你一个图标。
然后添加
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}你可以把这个改到你需要去的地方。作为另一种选择,您可以使用navigateUpTo(意图)和onSupportNavigateUpTo(意图)方法,并指定要返回的意图。
https://stackoverflow.com/questions/21440685
复制相似问题