【问题标题】:How to hide action bar for fragment?如何隐藏片段的操作栏?
【发布时间】:2014-02-01 21:49:05
【问题描述】:

如何隐藏某些片段的操作栏? 我已经在 stackoverflow 上搜索了答案,但我只找到了一个解决方案,它涉及在 android manifest 中禁用主要活动的操作栏。因为我需要为一个片段禁用操作栏,所以这不是一个选项。 有任何想法吗?谢谢。

编辑:最低 API 级别为 7,未使用 sherlock

【问题讨论】:

  • 能把主要活动和其他活动的代码贴出来吗?
  • 我的假设是,如果您必须更改 ActionBar,您可能需要 Activity 或 Dialog 而不是 Fragment
  • 如果您使用的是Navigation Component,请参阅stackoverflow.com/a/58027509/4859873

标签: android android-actionbar


【解决方案1】:

如果您正在使用 AppCompatActivity(您应该),那么这是对我有用的解决方案:

((AppCompatActivity) getActivity()).getSupportActionBar().hide();

您可以在 onCreate() 中添加它。支持 Fragment 的 getActivity() 返回一个 FragmentActivity,它不包含 getSupportActionBar() 方法。如果您有 AppCompatActivity,则仅使用 getActionBar() 会产生空指针异常。

【讨论】:

  • 在使用 .hide() 操作栏后消失,但仍然创建了一个空白空间!!
  • 即使我也面临同样的问题。 ActionBar 消失,但创建了黑色空间
【解决方案2】:

将此代码放入要隐藏工具栏的片段中...

 @Override
public void onResume() {
    super.onResume();
    ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
}
@Override
public void onStop() {
    super.onStop();
    ((AppCompatActivity)getActivity()).getSupportActionBar().show();
}

【讨论】:

  • 这对我有用...而且我们确保它导入... import androidx.appcompat.app.AppCompatActivity;
【解决方案3】:

getActionBar().hide()getSupportActionBar().hide()(如果使用 ActionBarCompat v7 库)。 问候

【讨论】:

  • 使用android.support.v7.app.ActionBargetting 错误(无法解析方法)
  • 但是link to docs
  • getActivity().getActionBar().hide();
【解决方案4】:

在所需的片段中使用此隐藏 actionBar。

getActivity().getSupportActionBar().hide();

并在你的下一个片段中显示 actionBar。

getActivity().getActionBar().show();

【讨论】:

    【解决方案5】:

    如前所述,(requireActivity() as AppCompatActivity).supportActionBar?.hide() 调用可能会隐藏操作栏。 如果您想在某些片段中显示它并在其他片段中隐藏它,在基本片段的onViewCreated 中应用默认(针对您的情况)可见性可能会很方便:

    abstract class BaseFragment : Fragment() {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            (requireActivity() as AppCompatActivity).supportActionBar?.show()
        }
    }
    

    并将其隐藏在特定的片段中:

    class HiddenActionBarFragment : BaseFragment() {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            (requireActivity() as AppCompatActivity).supportActionBar?.hide()
        }
    }
    

    此解决方案比使用onStart - onStop 更改可见性更灵活,因为在转换期间,不同片段的onStart 将比当前片段的onStop 更早地被调用。因此,下一个片段将无法“覆盖”当前片段的onStop 中应用的动作可见性。

    【讨论】:

      【解决方案6】:

      在保存片段的 Activity 中,将 getSupportActionBar().hide() 放在 setContentView 之前。

      在膨胀布局之前,还要在片段中添加:((AppCompatActivity) getActivity()).getSupportActionBar().hide()。如果您使用此ActionBarActivity,此方法有效。它还可以消除我在隐藏操作栏中的滞后

      【讨论】:

        【解决方案7】:

        您可以简单地将其放入您的片段类 createView 方法中:-

            View layout = inflater.inflate(R.layout.player_fragment, container, false);
            ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        

        【讨论】:

          【解决方案8】:

          在将布局膨胀到 SHOW Action Bar ` 之前将代码粘贴到片段中 //Kotlin 语句

          (activity as AppCompatActivity?)!!.supportActionBar!!.show()
          

          在扩展布局之前将代码粘贴到片段中以 Hide Action Bar ` //Kotlin 语句

          (activity as AppCompatActivity?)!!.supportActionBar!!.hide()
          

          这对我来说很好。

          【讨论】:

            【解决方案9】:

            您是否在希望隐藏 ActionBar 的片段的onCreate() 中尝试过getActivity().getSupportActionBar().hide()

            我假设你没有使用ActionBarSherlock

            【讨论】:

              【解决方案10】:

              此解决方案适用于复杂的非 AppCompat 应用程序,这些应用程序在运行 Lollipop 之后使用原生 ToolBar,否则使用原生 ActionBar

              它假定您想要在 Fragments 可见时隐藏 ActionBar。

              在您的每个活动中的 onCreate() 中:

              getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() 
                  {
                      @Override
                      public void onBackStackChanged() {
                          U.ABkk(this, getFragmentManager().getBackStackEntryCount());
                      }
                  }
              );
              

              或(更好)在实现 Application.ActivityLifecycleCallbacks

              的“单例”类中
              @Override
              public void onActivityCreated(final Activity A, Bundle savedInstanceState) {
                  A.getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
                      @Override
                      public void onBackStackChanged() {
                          U.ABkk(A, A.getFragmentManager().getBackStackEntryCount());
                      }
                  });
              }
              

              在实用程序类内部:

              /** Show/hide ActionBar for  KitKat devices */
              public static void ABkk(Activity A, int count) {
                  if (lollipop()) return;     // No problem when using Toolbar
                  ActionBar ab = A.getActionBar();
                  if (ab==null) return;
                  if (count==1) { ab.hide(); }
                  if (count==0) { ab.show(); }
              }
              
              /** Return true if API 21 or greater */
              private static boolean lollipop() {
                  return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
              }   
              

              使用 onActivityCreated() 是一种不需要对您的片段或活动进行更改的解决方案!

              【讨论】:

                猜你喜欢
                • 2016-09-03
                • 1970-01-01
                • 1970-01-01
                • 2013-06-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多