getActionBar () ส่งคืนค่าว่าง


176

ฉันมีปัญหาแปลก ๆ ฉันกำลังสร้างแอปกับ targetdk 13

ในวิธีการ onCreate ของกิจกรรมหลักของฉันฉันโทรgetActionBar()เพื่อตั้งค่าแถบการกระทำของฉัน วิธีนี้ใช้งานได้ดีเมื่อทำงานบนเครื่องจำลอง Android 3.2 แต่เมื่อใช้ Android 3.0 และ 3.1 getActionBar()วิธีการคืนค่าเป็นโมฆะ

ฉันพบว่ามันแปลกมากและฉันไม่สามารถเห็นเหตุผลว่าทำไมมันถึงทำเช่นนั้น นี่เป็นข้อบกพร่องของอีมูเลเตอร์หรือมีสิ่งที่ฉันต้องทำเพื่อให้แน่ใจว่าแอปพลิเคชันของฉันมีแอ็คชั่นบาร์หรือไม่?

การแก้ไข: ฉันคิดว่าฉันพบวิธีแก้ปัญหาสำหรับปัญหานี้แล้ว ฉันไม่ได้ใช้ setContentView เพื่อกำหนดเค้าโครงสำหรับกิจกรรม แต่ฉันใช้fragmentTransaction.add(android.R.id.content, mFragment, mTag)เพื่อเพิ่มส่วนย่อยให้กับกิจกรรม สิ่งนี้ใช้ได้ดีใน 3.2 แต่ในเวอร์ชันรวงผึ้งก่อนหน้านี้แถบการกระทำนั้นไม่ได้ถูกตั้งค่าหากคุณไม่ใช้ setContentView ในonCreate()วิธีการ ดังนั้นฉันจึงแก้ไขโดยใช้setContentView()วิธีในวิธีการของฉันonCreate()และเพียงแค่จัดหามันด้วยเค้าโครงที่มี FrameLayout ว่างเปล่า ฉันยังคงสามารถใช้fragmentTransaction.add(android.R.id.content, mFragment, mTag)วิธีการเช่นเดียวกับเมื่อก่อน

มันไม่ใช่การแก้ไขที่สวยที่สุด แต่ใช้งานได้


ในขณะที่คุณตอบกระทู้อื่นคุณต้องมีธีม Holo อย่าสมมติว่าคุณระบุธีม holo ในโฟลเดอร์ res v13 เท่านั้นหรือ ขออภัยหากเสียงนั้นชัดเจนเกินไป
PJL

ไม่นั่นเป็นความคิดแรกของฉันด้วย แต่ก็ไม่เป็นเช่นนั้น ขอบคุณสำหรับการตอบกลับของคุณ
Christian Skogsberg

คำตอบ:


226

สามารถใช้getSupportActionBar()แทนgetActionBar()วิธีการ


จากทั้งหมดนี่มันทำเพื่อฉัน!
msysmilu

16
ขอบคุณฉันใช้ "android.support.v7.app.ActionBarActivity" ดังนั้นนี่จึงเป็นประโยชน์สำหรับฉัน
velval

1
หลังจาก 2 ชั่วโมงของการค้นหา! การเปลี่ยนเป็น getSupportActionBar () และ android.support.v7.app.ActionBarActivity ในที่สุดก็แก้ไขได้สำหรับฉัน
FacePalm

นี่คือวิธีการแก้ไขปัญหา
zygimantus

46

หากคุณใช้ห้องสมุดสนับสนุน

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

ภายในandroid.support.v7.app: ActionBarActivityเลิกใช้ใช้android.support.v7.app.AppCompatActivityแทน
A. Petrov

35

คุณต้องกำหนดประเภทหน้าต่างเป็นแถบเครื่องมือก่อนที่กิจกรรมจะแสดงมุมมอง

ใช้

requestWindowFeature(Window.FEATURE_ACTION_BAR);

ก่อนเรียกเมธอด setContentView ()


ถ้า getSupportActionBar () ใช้งานไม่ได้แสดงว่ามันใช้งานได้อย่างมีเสน่ห์
Ashwin Balani

35
  1. หากคุณใช้android.support.v7.app.AppCompatActivity

    HomeActivity ระดับสาธารณะขยาย AppCompatActivity {

จากนั้นคุณควรใช้android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar();
  1. หากคุณใช้android.support.v4.app.FragmentActivity

    ชั้นเรียนสาธารณะกิจกรรมทางสังคมช่วยขยาย FragmentActivity {

จากนั้นคุณควรใช้android.app.ActionBar

    ActionBar ab = getActionBar();
  1. หากคุณใช้ android.support.v7.app.ActionBarActivity

    HomeActivity ระดับสาธารณะขยาย ActionBarActivity {

คุณควรใช้ android.support.v7.app.ActionBar

   ActionBar ab = getSupportActionBar();

คำตอบที่ดีโหม่งความสับสน !!
sud007

31

ฉันประสบปัญหาข้างต้นซึ่งgetActionBar()เมธอดส่งคืน null ฉันถูกเรียกgetActionBar()หลังจากการตั้งค่าและยังคงกลับมาของมันsetContentView()null

ฉันแก้ไขปัญหาโดยการตั้งค่าเวอร์ชัน min-sdk ในไฟล์ Android Manifest ที่หายไปตั้งแต่แรก <uses-sdk android:minSdkVersion="11" />


4
สิ่งนี้ช่วยฉันได้มากเวลา! ทุกคนที่ใช้แอพตัวอย่าง Bluetooth Chat ใน Android SDK จำเป็นต้องใช้โปรแกรมแก้ไขนี้ แอปพลิเคชันของแอปไม่สนใจที่จะรวมเนมสเปซ "android:" ในแท็ก minSdkVersion และดังนั้นจึงไม่ได้ลงทะเบียน การเพิ่มเนมสเปซแก้ไขข้อผิดพลาดโดยไม่พบแถบการกระทำ เลอะเทอะ Google!
Nick

จริงๆแล้วคุณอาจต้องระบุ targetSdkVersion คุณสามารถรันด้วย minSdkVersion ที่ต่ำกว่าหากคุณกำลังใช้ไลบรารีที่เข้ากันได้ แต่ targetSdkVersion จะกำหนดพฤติกรรม
วิลเลียม

ยิ่งใหญ่ !! นี่คือสิ่งที่ฉันกำลังมองหา
swiftBoy

<uses-sdk android: minSdkVersion = "11" /> แก้ไขปัญหาของฉันขอบคุณ
Majid

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

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

แล้วก็

extends AppCompatActivity

จากนั้นใช้

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

แก้ไขปัญหาของฉันในตัวอย่างลิ้นชักการนำทางของ Google
Weishi Zeng

วิธีแก้ปัญหาที่ดี แต่สำหรับผู้ที่จะนำไปใช้งานส่วนใหญ่จะได้รับข้อผิดพลาดจากความเข้ากันได้ หากคุณทำเช่นนั้นตรวจสอบให้แน่ใจว่าคุณตรวจสอบการนำเข้า sa android.support.v4.app.FragmentTransaction แทนที่จะเป็นเพียง android.app.FragmentTransaction และ android.support.v7.app.ActionBar แทน android.app.ActionBar
Serj Ardovic

18

คำตอบนี้มาสาย แต่อาจเป็นประโยชน์กับทุกคนที่มาจาก Google: คุณอาจต้องประกาศ

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

styles.xmlในของคุณ ดูเหมือนว่าfalseจะเป็นค่าเริ่มต้น คุณต้องใช้ API 11 หรือสูงกว่า

รายละเอียดเพิ่มเติมสามารถพบได้ในเอกสารที่นี่ อ้างเฉพาะ:

เคล็ดลับ: หากคุณมีธีมกิจกรรมที่กำหนดเองซึ่งคุณต้องการลบแถบการกระทำให้ตั้งค่าคุณสมบัติสไตล์ android: windowActionBar เป็น false อย่างไรก็ตามหากคุณลบแถบการกระทำโดยใช้ชุดรูปแบบหน้าต่างจะไม่อนุญาตให้มีแถบการกระทำเลยดังนั้นคุณจึงไม่สามารถเพิ่มได้ในภายหลัง - การเรียกใช้ getActionBar () จะส่งคืนค่าว่าง


11

ฉันมีปัญหาเดียวกันและหนึ่งในวิธีแก้ไขปัญหาคือใช้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>อยู่ในนั้นสามารถใช้ได้


ขอบคุณมันใช้งานได้สำหรับฉัน ในกรณีของฉันเมธอด getActionBar () ก็คืนค่าเป็นโมฆะและฉันสามารถแก้ไขได้โดยเปลี่ยนสไตล์ของธีมเป็น Theme.Holo.Light ด้วยธีมอื่น ๆ (เช่น Theme.AppCompat) ดูเหมือนว่า ActionBar จะไม่ทำงานดังนั้นค่าของมันจึงเป็นโมฆะ
harrakiss

10

สาเหตุหลักที่ใช้ชุดรูปแบบที่ไม่สนับสนุน ActionBar:

ในไฟล์ Manifest ให้เพิ่มสิ่งต่อไปนี้ในกิจกรรมเป้าหมายหรือองค์ประกอบแอปพลิเคชันของคุณ (หากคุณต้องการรวมธีมไว้เหนือแอปพลิเคชันทั้งหมด)

ตัวอย่างของชุดรูปแบบที่สนับสนุนแถบการกระทำ "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"ไม่รองรับก่อน SDKs เวอร์ชัน 14
  • ในการอนุญาตให้แอปของคุณรองรับ SDK รุ่นขั้นต่ำคุณสามารถเพิ่ม<app>องค์ประกอบต่อไปนี้ภายใต้องค์ประกอบ:

    <uses-sdk android:minSdkVersion="14" />
  • ในการระบุเวอร์ชั่น SDK ขั้นต่ำใน AndroidStudio คุณสามารถทำได้โดยใช้ไฟล์ Gradle ของแอป

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }

แต่สิ่งที่ฉันจะทำอย่างไรเพื่อให้การสนับสนุน API ระดับ 9-13 ใส่หีบผมใช้ Theme.Holo.Light.DarkActionBar
ซิด

8

ฉันพบปัญหานี้ ฉันกำลังตรวจสอบหมายเลขเวอร์ชันและเปิดใช้งานแถบการทำงานเฉพาะเมื่อมีขนาดใหญ่กว่าหรือเท่ากับ Honeycomb แต่กลับมาเป็นค่าว่าง ฉันพบเหตุผลและสาเหตุที่ทำให้ฉันปิดการใช้งานรูปแบบ Holo Theme ใน style.xml ภายใต้โฟลเดอร์ values-v11


ฉันได้รับการแก้ไขปัญหาโดยใช้ Holo Theme เป็นธีมหลักของ AppTheme ของฉัน
Bharat Dodeja

7

ไปที่ AndroidManifest.xml แล้วแทนที่

หุ่นยนต์: ชุดรูปแบบ = "@ สไตล์ / AppTheme"

by 

หุ่นยนต์: ชุดรูปแบบ = "@ หุ่นยนต์: แบบ / Theme.Holo.Light.DarkActionBar"



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


3

ฉันมีปัญหาเดียวกัน แก้ไขโดยการกำหนดธีมแอพใน styles.xml

ก่อน

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

หลังจาก

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

2

สิ่งหนึ่งที่ฉันต้องการเพิ่มเนื่องจากฉันเพิ่งพบสิ่งนี้หากคุณพยายามที่จะ getActionBar () ในกิจกรรมที่มีพ่อแม่มันจะคืนค่าว่าง ฉันกำลังพยายามสร้างรหัสที่มีกิจกรรมของฉันอยู่ในกลุ่มกิจกรรมและใช้เวลาไม่กี่นาทีสำหรับฉันที่จะไป "oh duh" หลังจากดูแหล่งที่มาของวิธีการที่ ActionBar สร้างขึ้นในแหล่งที่มา


คุณสามารถโพสต์โซลูชันสำหรับกลุ่มกิจกรรมได้หรือไม่
Anthea

โซลูชันของฉันจากสิ่งที่ฉันจำได้คือฉันสร้างรหัสของฉันใหม่เพื่อไม่ใช้กลุ่มกิจกรรมใด ๆ ขออภัยฉันไม่มีตัวอย่างโค้ด :(
C Nick

นี่ไม่ใช่ตัวแก้ปัญหาจริงๆ มีความคิดเห็นเพิ่มเติม แต่มีประโยชน์มาก!
Kato

1

ฉันแก้ไขโดยการเปลี่ยนแปลงนี้:

  1. เปลี่ยนเป็น minifest android:theme="@android:style/Theme.Holo.Light" >
  2. เพิ่มในชั้นเรียน extends ActionBarActivity
  3. เพิ่มการนำเข้าสู่ชั้นเรียน import android.support.v7.app.ActionBarActivity

1

วิธีเพิ่มคำตอบอื่น ๆ :

ให้แน่ใจว่าคุณโทรsetActionBar()หรือsetSupportActionBar()ในonCreate()วิธีการของคุณก่อนที่จะโทรgetActionBar():

กำหนด Toolbar บางส่วนใน activity.xml ของคุณจากนั้นใน onCreate ():

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

0

ฉันรู้ว่าฉันมางานปาร์ตี้ล่าช้า (และใหม่สำหรับ Android) ในคำถามนี้ แต่ฉันพบข้อมูลที่นี่มีประโยชน์มากและคิดว่าฉันควรจะเพิ่มผลการวิจัยของความพยายามของตัวเองด้วยการให้ ActionBar ทำงานตามที่ฉันต้องการในกรณีที่คนอื่น ๆ มองหาความช่วยเหลือ

ฉันมีวิดเจ็ตซึ่งเป็นหน้าต่างลอยที่ไม่มีชื่อหน้าต่าง ผมใช้ชุดรูปแบบในการดำเนินการandroid:windowIsFloating, android:backgroundDimEnabledและandroid:windowNoTitleและวิดเจ็ตทำงานได้ดีจนกระทั่งฉันต้องการเพิ่มปุ่มที่เรียกว่าเพจเจอร์แฟรกเมนต์ที่มีเพจแฟรกเมนต์หลายรายการและใช้ ActionBar มันจะผิดพลาดในกิจกรรมเพจเจอร์ที่มีข้อยกเว้นตัวชี้โมฆะ ฉัน จำกัด ให้แคบลงไปสู่แถบเครื่องมือที่ว่างเปล่า จากการค้นพบของคนก่อนหน้าซึ่งมีส่วนร่วมในหัวข้อนี้ฉันได้ลบชุดรูปแบบของฉันออกจากไฟล์ Manifest และ ActionBar ทำงานได้ดี แต่ตอนนี้หน้าต่างของฉันลอยไปนานกว่า (เป็นแบบเต็มหน้าจอ) และมีชื่อหน้า

การวิจัยเพิ่มเติมพาฉันไปที่คู่มือฝึกอบรมสไตล์และธีม APIซึ่งนำฉันไปสู่โซลูชัน ฉันค้นพบว่าฉันสามารถเพิ่มธีมที่กำหนดเองของฉันให้กับแต่ละกิจกรรมในไฟล์รายการได้ก่อนที่ฉันจะนำไปใช้กับแอปพลิเคชัน หน้าต่างทั้งหมดของฉันตอนนี้มีลักษณะที่ต้องการ


0

ลองขยายคลาสกิจกรรมของคุณจาก ActionBarActivity วิธีนี้แก้ไขได้สำหรับฉัน ทำสิ่งต่อไปนี้:

public class MyActivity extends ActionBarActivity
{
  . . .

ในกรณีของฉันห้องเรียนขยายจากกิจกรรมเท่านั้น


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

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) ล้มเหลว รหัสเปิดแหล่งที่มาใช้มัน !!


0

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

ทำงานได้อย่างรวดเร็ว


3
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Nic3500

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.