如何使用 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.NoActionBar
或Theme.AppCompat.Light.NoActionBar
的主题。除非您通过 setSupportActionBar(Toolbar)
提供自己的操作栏,否则此活动将永远无法显示操作栏。
在您希望设置操作栏的活动中,使用源自Theme.AppCompat
、Theme.AppCompat.Light
或Theme.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-support-v7-appcompat