如何在使用AppCompat v.7的情况下显示和隐藏ActionBar

59

我有一个简单的应用程序,可以显示文本。

应用程序开始时,有一个主屏幕,上面有几个选项(例如,一个信息按钮,可导航到关于该应用程序的信息,一个浏览按钮,允许用户查看所有可以显示的单个文本片段)。主按钮导航到另一个屏幕,文本在其中显示。通过向左或向右滑动,他可以看到不同的文本段落。这是应用程序的主要目的。

目前,我已经实现了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.的帖子得出的:如何在活动创建之前隐藏操作栏,然后再次显示它?

有什么建议吗?

9个回答

95

在你想要没有操作栏的活动中,使用从Theme.AppCompat.NoActionBarTheme.AppCompat.Light.NoActionBar派生的主题。除非通过setSupportActionBar(Toolbar)提供自己的操作栏,否则该活动将永远无法显示操作栏。

在你想要有操作栏的活动中,使用从Theme.AppCompatTheme.AppCompat.LightTheme.AppCompat.Light.DarkActionBar派生的主题。这将允许你在此类活动中动态隐藏或显示操作栏。但是,你将无法使用这些主题提供自己的操作栏。

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


59

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

要隐藏

getSupportActionBar().hide();
展示
getSupportActionBar().show();

也可以从Fragment中完成

隐藏

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

展示

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

编辑:

正如@RenniePet所指出的那样,

如果您正在使用Toolbar作为ActionBar,则需要调用((AppCompatActivity)getActivity()).getSupportActionBar()


3
为了在一个片段中使用,我需要这样做:"((AppCompatActivity)getActivity()).getSupportActionBar().show();" - RenniePet
hide() 会抛出一个空异常。 - Alston

12

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

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

2
作为一条注释,ActionBarActivity现已被弃用。应该使用AppCompatActivity代替。 - lucian.pantelimon
3
我的应用中hide调用没有效果。 - Violet Giraffe

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

在窗口操作栏中删除Android,就像下面这样:

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

我希望可以帮助您。


1
需要从android:windowNoTitle中删除android。 - Aamir Abro

3
在onCreate方法中,setContentView后,可以使用这个方法来简单地显示或隐藏每个类。
getSupportActionBar().hide();
getSupportActionBar().show();

如果您想设置标题,

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

3

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);
}

0

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

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

0
如果您正在尝试使用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();
        }
    });

}

0

我希望这可以是解决方案。它在我的系统上运行良好:

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

这会强制使用过时的主题,并且不包括appcompat。 - Eugen Pechanec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接