getActionBar() 返回 null
Posted
技术标签:
【中文标题】getActionBar() 返回 null【英文标题】:getActionBar() returns null 【发布时间】:2011-10-15 13:48:15 【问题描述】:我遇到了一个奇怪的问题。 我正在使用targetsdk 13制作一个应用程序。
在我的主要活动的 onCreate 方法中,我调用 getActionBar()
来设置我的操作栏。这在 android 3.2 模拟器上运行时可以正常工作,但在使用 Android 3.0 和 3.1 时,getActionBar()
方法返回 null。
我觉得这非常奇怪,我看不出它为什么会这样做。 这是模拟器的错误还是我需要做些什么来确保我的应用程序具有操作栏?
解决方案:
我想我已经找到了解决这个问题的方法。
我没有使用 setContentView 为活动设置布局。相反,我使用fragmentTransaction.add(android.R.id.content, mFragment, mTag)
将片段添加到活动中。
这在 3.2 中运行良好,但在早期的蜂窝版本中,如果您不在 onCreate()
方法中使用 setContentView,则显然未设置操作栏。
所以我通过在我的onCreate()
方法中使用setContentView()
方法来修复它,并且只为它提供一个包含空FrameLayout 的布局。
我仍然可以像以前一样使用fragmentTransaction.add(android.R.id.content, mFragment, mTag)
方法。
这不是最漂亮的修复,但它有效。
【问题讨论】:
正如您在回答另一篇文章时指出的那样,您需要一个 Holo 主题。不要假设您仅在 v13 res 文件夹中指定了全息主题?对不起,如果这听起来太明显了。 不,这也是我的第一个想法,但事实并非如此。不过感谢您的回复。 【参考方案1】:可以使用getSupportActionBar()
代替getActionBar()
方法。
【讨论】:
从这里开始,这是为我做的! 谢谢,我使用的是“android.support.v7.app.ActionBarActivity”,所以这对我有用。 经过2小时的搜索!更改为 getSupportActionBar() 和 android.support.v7.app.ActionBarActivity 终于为我解决了。 这是解决问题的方法。【参考方案2】:如果您使用的是支持库
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity
使用getSupportActionBar()
而不是getActionBar()
* 更新:
ActionBarActivity 类现在已弃用:
import android.support.v7.app.ActionBarActivity;
我推荐使用:
import android.support.v7.app.AppCompatActivity
【讨论】:
withinandroid.support.v7.app
: ActionBarActivity
deprecated 请改用android.support.v7.app.AppCompatActivity
。【参考方案3】:
如果您使用的是 android.support.v7.app.AppCompatActivity
公共类 HomeActivity 扩展 AppCompatActivity
那么你应该使用 android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
如果您使用的是 android.support.v4.app.FragmentActivity
公共类 HomeActivity 扩展 FragmentActivity
那么你应该使用 android.app.ActionBar
ActionBar ab = getActionBar();
如果您使用的是 android.support.v7.app.ActionBarActivity
公共类 HomeActivity 扩展 ActionBarActivity
您应该使用 android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
【讨论】:
很好的答案,解决了困惑!【参考方案4】:您必须在活动呈现其视图之前将窗口类型定义为操作栏。
使用
requestWindowFeature(Window.FEATURE_ACTION_BAR);
在调用 setContentView() 方法之前。
【讨论】:
如果 getSupportActionBar() 不起作用,那么这就像一个魅力【参考方案5】:我遇到了上述问题,getActionBar()
方法返回 null。我在设置setContentView()
后调用了getActionBar()
,但它仍然返回null
。
我通过在最初缺少的 Android Manifest 文件中设置 min-sdk 版本解决了这个问题。
<uses-sdk android:minSdkVersion="11" />
【讨论】:
这为我节省了很多时间!在 Android SDK 中使用蓝牙聊天示例应用程序的任何人都需要使用此修复程序。该应用程序的清单忽略在其 minSdkVersion 标记中包含“android:”命名空间,因此它没有注册。添加命名空间修复了找不到操作栏的错误。马虎,谷歌! 其实你可能只需要指定targetSdkVersion。如果您使用的是兼容库,则可以使用较低的 minSdkVersion 运行,但 targetSdkVersion 会确定行为。 太棒了!!这就是我要找的。span>ActionBar 需要应用程序或活动的主题才能拥有应用程序标题。确保您没有将您的应用程序或活动设置为 Theme.NOTITLE。
<application
android:name="com.xxx.yyy"
android:debuggable="false"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code
<activity
android:name="com.xxx.yyy.Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.NoTitle" // remove this line if you have in your code
android:windowSoftInputMode="adjustResize|stateHidden" >
【讨论】:
而且,如果你在 xml 中有主题声明,在其中添加工具栏,请从那里删除 'android:theme'【参考方案7】:import android.support.v7.app.AppCompatActivity;
然后
extends AppCompatActivity
然后使用
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
【讨论】:
修复了我在谷歌导航抽屉示例中的问题。 很好的解决方案,但对于那些实施它的人来说,很可能会遇到基于兼容性的错误。如果您碰巧这样做,请务必检查您的进口公司。 android.support.v4.app.FragmentTransaction 而不是 android.app.FragmentTransaction 和 android.support.v7.app.ActionBar 而不是 android.app.ActionBar【参考方案8】:这个答案很晚,但可能对任何从 Google 到达的人都有帮助:您可能需要声明
<item name="android:windowActionBar">true</item>
在您的styles.xml
中。似乎false
可以是默认值。您还需要使用 API 11 或更高版本。
更多细节可以在文档here 中找到。具体来说,引用:
提示:如果您有一个想要移除的自定义活动主题 操作栏,将 android:windowActionBar 样式属性设置为 错误的。但是,如果您使用主题删除操作栏,则 窗口根本不允许操作栏,所以你不能添加它 稍后——调用 getActionBar() 将返回 null。
【讨论】:
【参考方案9】:我遇到了同样的问题,其中一种解决方案是在调用 getActionBar()
之前使用 setContentView()
。
但还有另一件事解决了这个问题。我将应用程序的主题指定为@android:style/Theme.Holo.Light
。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
...
</application>
我认为任何包含<item name="android:windowActionBar">true</item>
的主题都可以使用。
【讨论】:
谢谢,它对我有用。在我的例子中,getActionBar() 方法也返回 null,我可以解决它,将主题样式更改为 Theme.Holo.Light。对于其他一些主题(例如 Theme.AppCompat),ActionBar 似乎没有处于活动状态,因此它的值为 null。【参考方案10】:主要原因是使用了不支持 ActionBar 的主题:
在清单文件中,在您的目标活动或应用程序元素中添加以下内容(如果您想在整个应用程序上统一主题)
支持动作栏"Theme.AppCompat.Light"
或"Theme.Holo.Light"
的主题示例...
android:theme="@android:style/Theme.Holo.Light"
最好把所有的样式都放在styles.xml
里,到处用"@style/themName"
这样就可以了
android:theme="@style/AppTheme"
styles.xml 将包含以下内容:
<style name="AppTheme" parent="Theme.AppCompat.Light">
提示:
有些主题在旧版 SDK 中无法使用,例如"@android:style/Theme.Holo.Light.DarkActionBar"
在 SDK 版本 14 之前不受支持。
要让您的应用支持最低特定版本的 SDK,您可以在 <app>
元素下添加以下内容:
<uses-sdk android:minSdkVersion="14" />
要在 AndroidStudio 中指定最低 SDK 版本,您可以使用应用的 Gradle 文件。
android
defaultConfig
minSdkVersion 14
targetSdkVersion 21
【讨论】:
但是如果我使用 Theme.Holo.Light.DarkActionBar,我该怎么做才能支持 API 级别 9-13【参考方案11】:我遇到了这个问题。我正在检查版本号并仅在它大于或等于 Honeycomb 时启用操作栏,但它返回 null。我找到了原因 根本原因是我在 values-v11 文件夹下的 style.xml 中禁用了 Holo 主题样式。
【讨论】:
我已经通过使用 Holo 主题作为我的 AppTheme 的父主题解决了我的问题。【参考方案12】:转到 AndroidManifest.xml 并替换
android:theme="@style/AppTheme"
by
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
【讨论】:
【参考方案13】:使用 getSupportActionBar() 代替 getActionBar()
【讨论】:
【参考方案14】:就我而言,我的代码中有这个不起作用:
@Override
protected void onCreate(Bundle savedInstanceState)
context = getApplicationContext();
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
然后我按照代码的顺序玩:
@Override
protected void onCreate(Bundle savedInstanceState)
requestWindowFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
它成功了!
结论:requestWindowFeature 应该是你在 onCreate 方法中调用的第一件事。
【讨论】:
【参考方案15】:我遇到了同样的问题。它通过在 styles.xml 中更改 App 主题来解决
之前
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
之后
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
【讨论】:
【参考方案16】:我想添加一件事,因为我刚刚遇到了这个问题,如果您尝试在具有父级的 Activity 上执行 getActionBar(),它将返回 null。我正在尝试重构我的 Activity 包含在 ActivityGroup 中的代码,在查看了如何在源代码中创建 ActionBar 的源代码之后,我花了好几分钟才“哦,duh”。
【讨论】:
你能发布你的活动组解决方案吗? 我记得的解决方案是我重构了我的代码以不使用任何 ActivityGroups。抱歉,我没有代码 sn-ps :( 这实际上不是一个解决方案;更多的评论。但是很有用!【参考方案17】:我通过这个改变来解决它:
-
更改 minifest
android:theme="@android:style/Theme.Holo.Light" >
加入班级extends ActionBarActivity
将导入添加到类import android.support.v7.app.ActionBarActivity
【讨论】:
【参考方案18】:添加到其他答案:
确保在调用getActionBar()
之前在onCreate()
方法中调用setActionBar()
或setSupportActionBar()
:
在你的activity.xml中定义一些工具栏,然后在onCreate()中:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
【讨论】:
【参考方案19】:我知道我在这个问题上迟到了(而且是 Android 新手),但我发现这里的信息非常有用,并认为我应该添加我自己努力的结果,让 ActionBar 按我的意愿工作,以防其他人像我一样来寻求帮助。
我有一个小部件,它是一个没有窗口标题的浮动窗口。我使用样式主题来实现android:windowIsFloating
、android:backgroundDimEnabled
和android:windowNoTitle
。小部件工作正常,直到我想添加一个按钮,该按钮调用具有多个列表片段页面的片段寻呼机并使用 ActionBar。它会因空指针异常而在寻呼机活动上崩溃。我将其缩小到 ActionBar 为空。根据之前对此线程做出贡献的人的发现,我从清单文件中删除了我的主题,并且 ActionBar 工作正常,但现在我的窗口现在不再浮动(它是全屏)并且它有一个我不想要的页面标题。
进一步的研究将我带到了Styles and Themes API Training Guide,这使我找到了解决方案。我发现我可以将自定义主题添加到清单文件中的各个活动中,而在我将其应用到应用程序之前。我的所有窗口现在都具有所需的外观。
【讨论】:
【参考方案20】:尝试从 ActionBarActivity 扩展您的 Activity 类。这为我解决了。执行以下操作:
public class MyActivity extends ActionBarActivity
. . .
就我而言,该类仅从 Activity 扩展。
【讨论】:
【参考方案21】:这也可能对某些人有所帮助。
就我而言,这是因为我没有在 menu.xml 中定义上下文
试试这个:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.android.ActionBarActivity">
而不是这个:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
【讨论】:
【参考方案22】:只需通过命令点击查看源码的实现:
private void initWindowDecorActionBar()
Window window = getWindow();
// Initializing the window decor can change window feature flags.
// Make sure that we have the correct set before performing the test below.
window.getDecorView();
if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null)
return;
mActionBar = new WindowDecorActionBar(this);
mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
mWindow.setDefaultIcon(mActivityInfo.getIconResource());
mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
requestWindowFeature(Window.FEATURE_ACTION_BAR);修复了我看到 requestWindowFeature(Window.FEATURE_ACTION_BAR) 失败的问题;代码是开源的使用它!!
【讨论】:
【参考方案23】:android.support.v7.app.ActionBar actionBar = getSupportActionBar();
工作很快
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。【参考方案24】:就我而言,我只需要扩展 AppCompatActivity
而不是 Activity
supportActionBar?.setDisplayHomeAsUpEnabled(true)
完整的活动示例类:
导入 android.os.Bundle 导入 androidx.appcompat.app.AppCompatActivity
//class LocationFound : Activity() <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_location_found)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
关于版本
minSdkVersion 22
targetSdkVersion 29
【讨论】:
以上是关于getActionBar() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章
第一个片段崩溃时的 getActivity().getActionBar()
为啥 Android Studio 告诉我使用 getSupportActionBar() 而不是 getActionBar()?
getActionBar().setDisplayHomeAsUpEnabled(true)报空指针(已解决)
使用getActionBar.setTitle()时,应用程序崩溃;同时扩展FragmentActivity