【问题标题】:How To Show and hide ActionBar with AppCompat v.7如何使用 AppCompat v.7 显示和隐藏 ActionBar
【发布时间】:2015-07-28 20:40:06
【问题描述】:

我有一个显示文本的简单应用。

应用程序从一个带有几个选项的主屏幕开始(例如,一个指向应用程序信息的信息按钮,一个允许用户查看可以显示的所有单独文本的浏览按钮)。主按钮通向另一个显示文本的屏幕。通过左右滑动,他可以看到不同的文本段落。这是应用程序的主要用途。

目前我已经实现了一个 ActionBar。我的 MainActivity.Java 扩展了 AppCompatActivity。应用程序中的所有内容都在此活动中。

现在我想让 ActionBar 只出现在“显示”模式,而不是在启动屏幕或“信息”/“浏览”模式中。

是否可以在应用的某个部分有一个 ActionBar,而在应用的另一部分没有 ActionBar? (并将它们全部放在同一个活动中?)

我一直在尝试实现这一点,但无济于事。如果可以的话,接下来我应该尝试什么?

到目前为止,我尝试了以下方法:

1) 创建这个主题

<style name="Theme.AppCompat.NoActionBar" parent="Theme.AppCompat.Light">
    <item name="android:windowActionBar">false</item>  
    <item name="android:windowNoTitle">true</item>
</style>  

并将其应用到 MainActivity ...

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar" > 

.... 完成此操作后,ActionBar 仍然存在。 (这来自这个 S.O. 帖子 (android:windowNoTitle will not hide actionbar with appcompat-v7 21.0.0)

2) 另一种尝试是将其添加到 onCreate。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    getActionBar().hide();

    setContentView(R.layout.activity_main);

这来自于研究这个 S.O.发帖:(How to hide action bar before activity is created, and then show it again?)

有什么建议吗?

【问题讨论】:

    标签: android android-layout android-activity


    【解决方案1】:

    您希望没有操作栏的活动中使用源自Theme.AppCompat.NoActionBarTheme.AppCompat.Light.NoActionBar 的主题。除非您通过 setSupportActionBar(Toolbar) 提供自己的操作栏,否则此活动将永远无法显示操作栏。

    您希望设置操作栏的活动中,使用源自Theme.AppCompatTheme.AppCompat.LightTheme.AppCompat.Light.DarkActionBar 的主题。这将允许您在此类活动中动态隐藏或显示操作栏。您将无法使用这些主题提供自己的操作栏。

    使用 appcompat-v7 操作栏时,您需要通过调用 getSupportActionBar() 而不是 getActionBar() 来获取它。

    【讨论】:

      【解决方案2】:

      您可以通过编程方式隐藏和显示 ActionBar。

      隐藏

      getSupportActionBar().hide();
      

      显示

      getSupportActionBar().show();
      

      也可以从片段完成

      隐藏

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

      显示

      getActivity().getSupportActionBar().show();
      

      编辑:

      @RenniePet 所述,

      如果您将Toolbar 用作ActionBar,则需要致电((AppCompatActivity)getActivity()).getSupportActionBar()

      【讨论】:

      • 为了在片段中使用,我必须这样做:"((AppCompatActivity)getActivity()).getSupportActionBar().show();"
      • hide() 会抛出一个空异常。
      【解决方案3】:

      将您的活动扩展为AppCompatActivity,然后将操作栏用作:-

      getSupportActionBar().hide();  // for hiding
      getSupportActionBar().show();  // for showing
      

      【讨论】:

      • 请注意,ActionBarActivity 现已弃用。应该改用AppCompatActivity
      • hide 调用在我的应用中无效。
      【解决方案4】:
      <style name="Theme.AppCompat.NoActionBar" parent="Theme.AppCompat.Light">
          <item name="android:windowActionBar">false</item>  
          <item name="android:windowNoTitle">true</item>
      </style>
      

      删除项目windowActionbar中的android。就像follow:

      <style name="Theme.AppCompat.NoActionBar" parent="Theme.AppCompat.Light">
          <item name="windowActionBar">false</item>  
          <item name="android:windowNoTitle">true</item>
      </style>
      

      希望对你有帮助。

      【讨论】:

      • 也需要从 android:windowNoTitle 中删除 android。
      【解决方案5】:

      AppCompatActivity 有自己的嵌入式工具栏。您不需要在主 xml 中使用额外的工具栏定义。

      只需调用 getSupportActionBar().show()

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          getSupportActionBar().show();
      }
      
      public boolean onCreateOptionsMenu(Menu menu)
      {
          getMenuInflater().inflate(R.menu.menu_main, menu);
          return super.onCreateOptionsMenu(menu);
      }
      
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
      
          //noinspection SimplifiableIfStatement
          if (id == R.id.action_settings) {
      
              TextView text1=(TextView)findViewById(R.id.textView);
              text1.setText("I changed the text!");
      
          }
      
          return super.onOptionsItemSelected(item);
      }
      

      【讨论】:

        【解决方案6】:

        在 onCreate 方法中,在 setContentView 之后,简单地使用它来显示或隐藏每个类。

        getSupportActionBar().hide();
        getSupportActionBar().show();
        

        如果要设置标题,

        getSupportActionBar().setTitle("This is ToolBar");
        

        【讨论】:

          【解决方案7】:

          我希望这可以解决。它在我的系统上运行:

          android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
          

          【讨论】:

          • 这会强制使用过时的主题并且不包括 appcompat。
          【解决方案8】:

          使用AppTheme关闭所有活动的工具栏:
          styles.xml

          <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- .NoActionBar -->
          

          【讨论】:

            【解决方案9】:

            如果您尝试使用 AppCompatActivity 显示/隐藏 INTENT 的 ActionBar 并遇到以下问题:

            • 指针空异常...
            • 线程问题...

            按照以下步骤访问相同的相关线程进入意图:

            // 1) Calling the intent in the "main activity"
            Intent intent = new Intent(context, YourClass.class);
            startActivity(intent);
            
            // 2) Get the context in your "Intent activity"
            public class YourClass extends AppCompatActivity {
            YourClass mContext;
            
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                mContext = this;
            }
            
            // 3) Hide/Show Action bar from a method
            public void yourMethod(YourClass mContext){
            
                mContext.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mContext.getSupportActionBar().hide();
                    }
                });
            
            }
            

            【讨论】:

              猜你喜欢
              • 2013-05-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多