我有一个奇怪的问题。 我正在使用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,则操作栏显然未设置。
所以我在我的setContentView()
方法中使用onCreate()
方法修复了它,并为它提供了一个包含空FrameLayout的布局。
我仍然可以像以前一样使用fragmentTransaction.add(android.R.id.content, mFragment, mTag)
方法。
这不是最漂亮的修复,但它确实有效。
答案 0 :(得分:210)
可以使用getSupportActionBar()
代替getActionBar()
方法。
答案 1 :(得分:46)
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
getSupportActionBar()
代替getActionBar()
import android.support.v7.app.ActionBarActivity;
我建议使用:
import android.support.v7.app.AppCompatActivity
答案 2 :(得分:33)
在活动呈现视图之前,您必须将窗口类型定义为操作栏。
使用
requestWindowFeature(Window.FEATURE_ACTION_BAR);
在调用setContentView()方法之前。
答案 3 :(得分:32)
如果您使用 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 :(得分:31)
我遇到了getActionBar()
方法返回null的上述问题。在设置getActionBar()
之后我正在调用setContentView()
,并且仍然返回null
。
我通过在Android Manifest文件中设置最初缺少的min-sdk版本来解决此问题。
<uses-sdk android:minSdkVersion="11" />
答案 5 :(得分:27)
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" >
答案 6 :(得分:18)
这个答案很晚,但对于从谷歌来的人可能会有所帮助:您可能需要声明
<item name="android:windowActionBar">true</item>
在styles.xml
中。似乎false
可以是默认值。您还需要使用API 11或更高版本。
更多详情可在文档here中找到。具体来说,引用:
提示:如果您有要删除的自定义活动主题 操作栏,将android:windowActionBar样式属性设置为 假。但是,如果您使用主题删除操作栏,那么 窗口根本不允许操作栏,因此您无法添加它 稍后调用getActionBar()将返回null。
答案 7 :(得分:18)
import android.support.v7.app.AppCompatActivity;
然后
extends AppCompatActivity
然后使用
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
答案 8 :(得分:10)
我遇到了同样的问题,其中一个解决方案是在调用setContentView()
之前使用getActionBar()
。
但还有另一件事可以解决这个问题。我将应用程序的主题指定为@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>
。
答案 9 :(得分: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">
提示:
"@android:style/Theme.Holo.Light.DarkActionBar"
。要允许您的应用支持最低特定版本的SDK,您可以在<app>
元素下添加以下内容:
<uses-sdk android:minSdkVersion="14" />
要在AndroidStudio中指定min SDK版本,您可以使用应用的Gradle文件。
android{
defaultConfig{
minSdkVersion 14
targetSdkVersion 21
}
}
答案 10 :(得分:8)
我遇到了这个问题。我正在检查版本号并仅在它大于或等于Honeycomb时启用操作栏,但它返回null。我找到了原因 根本原因是我在style-v11文件夹下的style.xml中禁用了Holo主题样式。
答案 11 :(得分:7)
转到AndroidManifest.xml并替换
机器人:主题=&#34; @风格/ AppTheme&#34;
by
机器人:主题=&#34; @android:风格/ Theme.Holo.Light.DarkActionBar&#34;
答案 12 :(得分:6)
使用getSupportActionBar()而不是getActionBar()
答案 13 :(得分:4)
在我的情况下,我在我的代码中有这个不起作用:
@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方法中调用的第一个东西。
答案 14 :(得分:3)
我有同样的问题。它通过在styles.xml中修改App主题来解决。
在
#!/usr/bin/env python
import os
import yaml
import ldap
with open('ldap_users.yaml', 'r') as file:
doc = yaml.load(file)
for employeeType, inactive in doc['users'].iteritems():
print employeeType, inactive
在
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
答案 15 :(得分:2)
我想添加一件事,因为我刚刚遇到这个问题,如果你想在一个有父类的Activity上尝试getActionBar(),它将返回null。我正在尝试重构我的Activity包含在ActivityGroup中的代码,在查看ActionBar如何在源代码中创建的源代码后,我花了好几分钟去“哦duh”。
答案 16 :(得分:1)
我通过这个改变来解决它:
android:theme="@android:style/Theme.Holo.Light" >
extends ActionBarActivity
import android.support.v7.app.ActionBarActivity
答案 17 :(得分:0)
只需点击命令检查源代码的实现:
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)失败了;代码是开源使用它!!
答案 18 :(得分:0)
这也可以帮助一些人。
就我而言,这是因为我没有在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">
答案 19 :(得分:0)
尝试从ActionBarActivity扩展Activity类。这解决了我。做类似以下的事情:
public class MyActivity extends ActionBarActivity
{
. . .
在我的情况下,该课程仅从活动中延伸。
答案 20 :(得分:0)
要添加其他答案:
在致电setActionBar()
之前,请务必在setSupportActionBar()
方法中致电onCreate()
或getActionBar()
:
在activity.xml中定义一些工具栏,然后在onCreate()中定义:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
答案 21 :(得分:0)
我知道我在这个问题上已经迟到了(并且刚接触Android),但我发现这里的信息非常有用,并且我认为我应该添加自己的努力的结果,让ActionBar工作,因为我想要以防其他人像我这样来寻求帮助。
我有一个小部件,它是一个没有窗口标题的浮动窗口。我使用样式主题来实现android:windowIsFloating
,android:backgroundDimEnabled
和android:windowNoTitle
。小部件工作正常,直到我想添加一个调用带有多个列表片段页面的片段分页器并使用ActionBar的按钮。它将在具有空指针异常的寻呼机活动上崩溃。我把它缩小到ActionBar为空。根据以前为这个线程做出贡献的人的发现,我从清单文件中删除了我的主题,ActionBar运行正常,但现在我的窗口现在更长时间浮动(它是全屏)并且它有一个我不想要的页面标题。
进一步的研究把我带到Styles and Themes API Training Guide,这让我找到了解决方案。我发现在将清单文件应用到应用程序之前,我可以将自定义主题添加到清单文件中的各个活动。我的所有窗户现在都有所需的外观。
答案 22 :(得分:0)
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
工作很快
答案 23 :(得分:0)
就我而言,我只需要扩展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