getActionBar () trả về null


176

Tôi đang có một vấn đề kỳ lạ. Tôi đang làm một ứng dụng với Targetdk 13.

Trong phương thức onCreate của hoạt động chính của tôi, tôi gọi getActionBar()để thiết lập thanh hành động của mình. Điều này hoạt động tốt khi chạy trên trình giả lập Android 3.2, nhưng khi sử dụng Android 3.0 và 3.1 thì getActionBar()phương thức trả về null.

Tôi thấy điều này cực kỳ kỳ lạ, và tôi không thể thấy bất kỳ lý do tại sao nó sẽ làm như vậy. Đây có phải là một lỗi với trình giả lập hay có điều gì tôi cần phải làm, để đảm bảo rằng ứng dụng của tôi có một thanh hành động không?

GIẢI PHÁP: Tôi nghĩ rằng tôi đã tìm thấy một giải pháp cho vấn đề này. Tôi đã không sử dụng setContentView để đặt bố cục cho hoạt động. Thay vào đó tôi đã sử dụng fragmentTransaction.add(android.R.id.content, mFragment, mTag)để thêm một đoạn vào hoạt động. Điều này hoạt động tốt trong 3.2, nhưng trong các phiên bản tổ ong trước đó, thanh hành động dường như không được đặt nếu bạn không sử dụng setContentView trong onCreate()phương thức. Vì vậy, tôi đã sửa nó bằng cách sử dụng setContentView()phương thức trong phương thức của mình onCreate()và chỉ cung cấp cho nó một bố cục có chứa FrameLayout trống. Tôi vẫn có thể sử dụng fragmentTransaction.add(android.R.id.content, mFragment, mTag)phương thức giống như trước đây.

Đây không phải là bản sửa lỗi đẹp nhất, nhưng nó hoạt động.


khi bạn chỉ trả lời một bài khác, bạn cần có chủ đề Holo. Đừng cho rằng bạn chỉ định chủ đề holo của mình trong thư mục res v13? Xin lỗi nếu điều đó nghe quá rõ ràng.
PJL

Không, đó cũng là suy nghĩ đầu tiên của tôi, nhưng đó không phải là trường hợp. Dù sao cũng cảm ơn câu trả lời của bạn.
Christian Skogsberg

Câu trả lời:


226

Có thể sử dụng getSupportActionBar()thay cho getActionBar()phương pháp.


Trong số tất cả từ đây, điều này đã làm cho tôi!
msysmilu

16
cảm ơn, tôi đã sử dụng "android.support.v7.app.ActionBarActivity" vì vậy điều này đã làm điều đó cho tôi.
vận tốc

1
Sau 2 giờ tìm kiếm! Thay đổi thành getSupportActionBar () và android.support.v7.app.ActionBarActivity cuối cùng cũng sửa nó cho tôi.
FacePalm

Đây là giải pháp cho vấn đề.
zygimantus

46

Nếu bạn đang sử dụng thư viện hỗ trợ

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

sử dụng getSupportActionBar()thay vìgetActionBar()

* Cập nhật:

Lớp ActionBarActivity hiện không được chấp nhận:

import android.support.v7.app.ActionBarActivity;

Tôi khuyên bạn nên sử dụng:

import android.support.v7.app.AppCompatActivity

trong android.support.v7.app: ActionBarActivitykhông dùng nữa android.support.v7.app.AppCompatActivitythay thế.
A. Petrov

35

Bạn phải xác định loại cửa sổ là thanh hành động trước khi hoạt động hiển thị chế độ xem của nó.

sử dụng

requestWindowFeature(Window.FEATURE_ACTION_BAR);

trước khi gọi phương thức setContentView ().


Nếu getSupportActionBar () không hoạt động, thì điều này hoạt động như một cơ duyên
Ashwin Balani

35
  1. nếu bạn đang sử dụng android.support.v7.app.AppCompatActivity

    lớp công khai HomeActivity mở rộng AppCompatActivity {

Sau đó, bạn nên sử dụng android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. Nếu bạn đang sử dụng android.support.v4.app.FragmentActivity

    lớp công khai HomeActivity mở rộng FragmentActivity {

thì bạn nên sử dụng android.app.ActionBar

    ActionBar ab = getActionBar();
  1. Nếu bạn đang sử dụng android.support.v7.app.ActionBarActivity

    lớp công khai HomeActivity mở rộng ActionBarActivity {

bạn nên sử dụng android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

Câu trả lời tuyệt vời, giải quyết sự nhầm lẫn !!
sud007

31

Tôi đã đối mặt với vấn đề trên trong đó getActionBar()phương thức trả về null. Tôi đã gọi getActionBar()sau khi cài đặt setContentView()và nó vẫn quay trở lại null.

Tôi đã giải quyết vấn đề bằng cách đặt phiên bản min-sdk trong tệp Bản kê khai Android bị thiếu ban đầu. <uses-sdk android:minSdkVersion="11" />


4
Điều này giúp tôi tiết kiệm rất nhiều thời gian! Bất kỳ ai sử dụng ứng dụng ví dụ Trò chuyện Bluetooth trong SDK Android đều cần sử dụng bản sửa lỗi này. Tệp kê khai của ứng dụng bỏ qua không gian tên "android:" trong thẻ minSdkVersion của nó và vì vậy nó không đăng ký. Thêm không gian tên sẽ sửa lỗi không tìm thấy thanh hành động. Cẩu thả, Google!
Nick

Trên thực tế, bạn có thể chỉ cần xác định targetSdkVersion. Bạn có thể chạy với minSdkVersion thấp hơn nếu bạn đang sử dụng thư viện compat, nhưng targetSdkVersion xác định hành vi.
William

Tuyệt quá!! đây là những gì tôi đang tìm kiếm
swiftBoy

<used-sdk android: minSdkVersion = "11" /> đã giải quyết vấn đề của tôi nhờ
Majid

27

ActionBar cần ứng dụng hoặc chủ đề của hoạt động để có tiêu đề ứng dụng. Hãy chắc chắn rằng bạn chưa tạo kiểu cho ứng dụng hoặc hoạt động của mình là 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" > 

19
import android.support.v7.app.AppCompatActivity;

sau đó

extends AppCompatActivity

sau đó sử dụng

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

khắc phục sự cố của tôi trong ví dụ về ngăn kéo điều hướng của google.
Weishi Zeng

Giải pháp tốt, nhưng đối với những người sẽ thực hiện thì rất có thể sẽ gặp lỗi dựa trên khả năng tương thích. Nếu bạn tình cờ làm như vậy, hãy đảm bảo kiểm tra nhập khẩu của bạn trên android.support.v4.app.FragmentTransaction thay vì chỉ android.app.FragmentTransaction và android.support.v7.app.ActionBar thay vì android.app.ActionBar
Serj Ardovic

18

Câu trả lời này là muộn nhưng có thể hữu ích cho bất kỳ ai đến từ Google: Bạn có thể cần phải khai báo

<item name="android:windowActionBar">true</item>

trong của bạn styles.xml. Nó dường như falsecó thể là mặc định. Bạn cũng cần phải có API 11 trở lên.

Thông tin chi tiết có thể được tìm thấy trong các tài liệu ở đây . Cụ thể, trích dẫn:

Mẹo: Nếu bạn có chủ đề hoạt động tùy chỉnh mà bạn muốn xóa thanh hành động, hãy đặt thuộc tính kiểu android: windowActionBar thành false. Tuy nhiên, nếu bạn loại bỏ thanh hành động bằng một chủ đề, thì cửa sổ sẽ hoàn toàn không cho phép thanh hành động, vì vậy bạn không thể thêm nó sau khi gọi điện thoại getActionBar () sẽ trả về null.


11

Tôi đã có cùng một vấn đề và một trong những giải pháp là sử dụng setContentView()trước khi gọi getActionBar().

Nhưng có một điều khác đã khắc phục vấn đề. Tôi đã chỉ định chủ đề cho các ứng dụng được @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>

Tôi nghĩ rằng bất kỳ chủ đề, <item name="android:windowActionBar">true</item>trong đó, có thể được sử dụng.


Cảm ơn, nó làm việc cho tôi. Trong trường hợp của tôi, phương thức getActionBar () cũng trả về null và tôi có thể giải quyết nó thay đổi kiểu chủ đề thành Theme.Holo.Light. Với một số chủ đề khác (ví dụ Theme.AppCompat), có vẻ như ActionBar không hoạt động, vì vậy giá trị của nó là null.
harrakiss

10

Lý do chính cho điều đó là sử dụng các chủ đề không hỗ trợ ActionBar:

Trong tệp kê khai, thêm phần sau vào hoạt động mục tiêu hoặc thành phần ứng dụng của bạn (nếu bạn muốn thống nhất chủ đề trên toàn bộ ứng dụng)

Ví dụ về các chủ đề hỗ trợ thanh hành động "Theme.AppCompat.Light"hoặc "Theme.Holo.Light"...

android:theme="@android:style/Theme.Holo.Light"

Tốt hơn là đặt tất cả các kiểu vào styles.xmlvà sử dụng nó ở mọi nơi bằng cách sử dụng "@style/themName"kiểu trước đó sẽ là

android:theme="@style/AppTheme"

và Styles.xml sẽ có các mục sau:

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

Gợi ý:

  • Có một số chủ đề không thể được sử dụng trong SDK cũ như "@android:style/Theme.Holo.Light.DarkActionBar"không được hỗ trợ trước SDK phiên bản 14.
  • Để cho phép ứng dụng của bạn hỗ trợ phiên bản SDK cụ thể tối thiểu, bạn có thể thêm phần dưới đây vào <app>phần tử:

    <uses-sdk android:minSdkVersion="14" />
  • Để chỉ định phiên bản SDK tối thiểu trong AndroidStudio, bạn có thể sử dụng tệp Gradle của ứng dụng.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

nhưng tôi phải làm gì để hỗ trợ API cấp 9-13, trong trường hợp tôi sử dụng Theme.Holo.Light.DarkActionBar
Sid

8

Tôi gặp vấn đề này. Tôi đã kiểm tra số phiên bản và chỉ bật thanh hành động nếu nó lớn hơn hoặc bằng Honeycomb, nhưng nó đã trả về null. Tôi đã tìm thấy lý do và nguyên nhân gốc là tôi đã vô hiệu hóa kiểu Holo Theme trong style.xml trong thư mục value-v11.


Tôi đã giải quyết vấn đề của mình bằng cách sử dụng Holo Theme làm chủ đề chính của AppTheme.
Bharat Dodeja

7

đi tới AndroidManifest.xml và thay thế

android: theme = "@ style / AppTheme"

by 

android: theme = "@ android: style / Theme.Holo.Light.DarkActionBar"



4

Trong trường hợp của tôi, tôi đã có mã này trong mã không hoạt động:

@Override
protected void onCreate(Bundle savedInstanceState) {
    context = getApplicationContext();

    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

Sau đó, tôi chơi theo thứ tự của mã:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    context = getApplicationContext();
}

Va no đa hoạt động!

Kết luận: requestWindowFeature sẽ là điều đầu tiên bạn gọi trong phương thức onCreate.


3

Tôi gặp vấn đề tương tự. Nó đã được giải quyết bằng cách sử dụng chủ đề ứng dụng trong tệp XML

Trước

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

Sau

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

2

Một điều tôi muốn thêm vào vì tôi vừa gặp phải điều này, nếu bạn đang cố gắng getActionBar () trên một Activity có cha mẹ, nó sẽ trả về null. Tôi đang cố gắng cấu trúc lại mã trong đó Activity của tôi được chứa trong Activitygroup và mất một vài phút để tôi đi "oh duh" sau khi xem nguồn gốc của cách ActionBar được tạo trong nguồn.


bạn có thể gửi giải pháp của bạn cho các nhóm hoạt động?
Anthea

Giải pháp của tôi từ những gì tôi nhớ là tôi đã cấu trúc lại mã của mình để không sử dụng bất kỳ Nhóm hoạt động nào. Xin lỗi tôi không có đoạn mã :(
C Nick

Đây không thực sự là một solutio; thêm một bình luận. Nhưng rất hữu ích!
Kato

1

Tôi giải quyết nó bằng những thay đổi này:

  1. thay đổi trong tối thiểu android:theme="@android:style/Theme.Holo.Light" >
  2. thêm vào lớp extends ActionBarActivity
  3. thêm nhập vào lớp import android.support.v7.app.ActionBarActivity

1

Để thêm vào các câu trả lời khác:

Hãy chắc chắn rằng bạn gọi setActionBar()hoặc setSupportActionBar()trong onCreate()phương thức của bạn trước khi gọi getActionBar():

Xác định một số Thanh công cụ trong tệp Activity.xml của bạn, sau đó trong onCreate ():

Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

Tôi biết rằng tôi đến bữa tiệc muộn (và mới với Android) về câu hỏi này nhưng tôi thấy thông tin ở đây rất hữu ích và nghĩ rằng tôi nên thêm những phát hiện về nỗ lực của riêng mình để khiến ActionBar hoạt động như tôi muốn trong trường hợp những người khác như tôi đến tim sự giup đơ.

Tôi có một widget là một cửa sổ nổi không có tiêu đề cửa sổ. Tôi sử dụng một chủ đề phong cách để thực hiện android:windowIsFloating, android:backgroundDimEnabledandroid:windowNoTitle. Tiện ích hoạt động tốt cho đến khi tôi muốn thêm một nút gọi là máy nhắn tin phân đoạn với một số trang phân đoạn danh sách và sử dụng ActionBar. Nó sẽ sụp đổ trên hoạt động máy nhắn tin với một ngoại lệ con trỏ null. Tôi đã thu hẹp nó xuống ActionBar là null. Theo kết quả của những người trước đây đã đóng góp cho chủ đề này, tôi đã xóa chủ đề của mình khỏi tệp kê khai và ActionBar hoạt động tốt nhưng bây giờ cửa sổ của tôi đã trôi nổi (nó là toàn màn hình) và nó có tiêu đề trang mà tôi không muốn.

Nghiên cứu sâu hơn đã đưa tôi đến Hướng dẫn đào tạo API về Chủ đề và Phong cách dẫn tôi đến một giải pháp. Tôi phát hiện ra rằng tôi có thể thêm chủ đề tùy chỉnh của mình vào các hoạt động riêng lẻ trong tệp kê khai trong khi trước khi tôi áp dụng nó vào ứng dụng. Tất cả các cửa sổ của tôi bây giờ có sự xuất hiện mong muốn.


0

Hãy thử mở rộng lớp Activity của bạn từ ActionBarActivity. Điều này đã giải quyết nó cho tôi. Làm một cái gì đó như sau:

public class MyActivity extends ActionBarActivity
{
  . . .

Trong trường hợp của tôi, lớp chỉ mở rộng từ Activity.


0

Điều này cũng có thể giúp một số người.

Trong trường hợp của tôi, đó là vì tôi đã không xác định một bối cảnh trong menu.xml

Thử cái này:

<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">

Thay vì điều này:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

0

Chỉ cần kiểm tra việc thực hiện mã nguồn bằng cách nhấp vào lệnh:

    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); Đã khắc phục sự cố của tôi khi tôi thấy requestWindowFeature (Window.FEATURE_ACTION_BAR) không thành công; mã là mã nguồn mở sử dụng nó !!


0

android.support.v7.app.ActionBar actionBar = getSupportActionBar();

hoạt động khá nhanh


3
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500

0

Trong trường hợp của tôi, tôi chỉ cần gia hạn AppCompatActivitythay vìActivity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

Lớp ví dụ hoạt động đầy đủ:

nhập android.os.Bundle nhập 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)
    } }

Trên các phiên bản

    minSdkVersion 22
    targetSdkVersion 29
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.