【问题标题】:Show up-Button in actionBar in subscreen preferences在子屏幕首选项中的 actionBar 中显示 up-Button
【发布时间】:2014-02-21 19:45:01
【问题描述】:

我已按照官方指南中的说明实施了我的偏好。

我有一个 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 从资源加载首选项,它们包含一个首选项子屏幕,如下所示:

<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>

到目前为止效果很好,但现在我希望在显示首选项子屏幕时在 actionBar 中有一个up-Button。知道如何实现吗?

我尝试在我的活动中设置setDisplayHomeAsUpEnabled(true),但向上按钮仅显示在主要首选项中(不应该显示的位置)而不是子屏幕中。

我想知道即使在官方文档中,子屏幕也显示没有活动的向上按钮:

文档链接:Settings

非常欢迎任何帮助

【问题讨论】:

  • Afaik,根据 Google 的设计建议,在这种情况下,系统返回按钮比向上导航更可取。否则,如果您创建自己的新 Activity,您可以很好地为 那个 特定子屏幕 Activity 使用 getActionBar().setDisplayHomeAsUpEnabled(true)。
  • 有一个几乎完全相同的问题:stackoverflow.com/questions/11971800/…
  • 问题是我只有一个PreferenceFragment,它显示首选项并自动显示首选项的子屏幕。我没有子屏幕的活动或片段类。我不知道如何检查是否显示子屏幕以调用setDisplayHomeAsUpEnabled(true),因为我知道没有接口或回调。

标签: android settings preferences preferenceactivity preferencefragment


【解决方案1】:

我终于让它工作了:D。这很 hacky,但它可以工作。

问题是,在 xml 布局中使用子屏幕会产生一些“代码魔法”。 为子屏幕启动了一个新活动/对话框,您无法直接访问它。

要访问操作栏和主页/向上按钮的 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;
       }
  });
...

}

以下链接为我提供了解决问题的最终提示和代码:

Action Bar Home Button not functional with nested PreferenceScreen

【讨论】:

  • 聪明但老套,可能不便携。它依赖于您无法控制的对话框的实现细节。
【解决方案2】:

我按照“支持带有首选项标头的旧版本”部分 http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders 中的 Android 文档执行此操作。使用旧的 PreferenceActivity,您可以在 xml 中指定一个 Preference,该 Preference 会启动对同一首选项活动类的意图。该活动检查意图操作并确定它是否嵌套(以显示向上按钮)以及在屏幕中膨胀哪个首选项 xml。

当然,我也打算支持旧设备。我发现 PreferenceFragment 仅对使用首选项标头的大型平板电脑有用。

为了在手机和平​​板电脑之间重复使用偏好,我想出了这个解决方案https://stackoverflow.com/a/20806812/1139784

【讨论】:

    【解决方案3】:

    要启用向上操作,请执行以下操作:

    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(Intent intent) 和 onSupportNavigateUpTo(Intent intent) 方法并指定要返回的意图。

    【讨论】:

    • 感谢您的回答,但这不是我的问题的答案
    猜你喜欢
    • 2012-06-11
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多