如何使用 AppCompat v.7 显示和隐藏 ActionBar

Posted

技术标签:

【中文标题】如何使用 AppCompat v.7 显示和隐藏 ActionBar【英文标题】:How To Show and hide ActionBar with AppCompat v.7 【发布时间】: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?)

有什么建议吗?

【问题讨论】:

【参考方案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();
        
    );


【讨论】:

以上是关于如何使用 AppCompat v.7 显示和隐藏 ActionBar的主要内容,如果未能解决你的问题,请参考以下文章

使用 AppCompat 时如何更改 ActionBar 标题字体

Android 眼睛 显示隐藏密码(ImageView)

如何使用android-support-v7-appcompat

带有下划线 appcompat 的 Android 微调器

Xamarin Forms 2.0 AppCompat android 键盘模式

如何使用主题和 Theme.AppCompat.DayNight 更改操作栏中的文本颜色