2012-04-05 9 views
24

Chiamando getActionBar restituisce null. Questo è stato segnalato di frequente, quindi mi sono assicurato di includere le soluzioni che altri hanno utilizzato: My minSdkVersion=11, ho una barra del titolo e sto chiamando getActionBar dopo setContentView. Inoltre, la mia attività non è un'attività per bambini.getActionBar restituisce null

setContentView(R.layout.main); 

// experiment with the ActionBar 
ActionBar actionBar = getActionBar(); 
actionBar.hide(); 

il dispositivo è un Samsung Galaxy Tab 10.1 con sistema operativo Android 3.2

Grazie in anticipo per eventuali idee o suggerimenti!

+0

Vedi anche: http://stackoverflow.com/questions/6867076/getactionbar-returns-null – Harvey

risposta

60

Sembra che sia necessario richiedere una barra delle azioni (! = Barra del titolo) tramite un tema o tramite il codice riportato di seguito.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The Action Bar is a window feature. The feature must be requested 
    // before setting a content view. Normally this is set automatically 
    // by your Activity's theme in your manifest. The provided system 
    // theme Theme.WithActionBar enables this for you. Use it as you would 
    // use Theme.NoTitleBar. You can add an Action Bar to your own themes 
    // by adding the element <item name="android:windowActionBar">true</item> 
    // to your style definition. 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 

    setContentView(R.layout.main); 

    // experiment with the ActionBar 
    ActionBar actionBar = getActionBar(); 
    actionBar.hide(); 
} 

Codice da [here]

+0

Grazie. Pensavo di avere già una barra delle azioni, ma quello che avevo in realtà era una "barra di sistema" – user316117

8

bar azione ha bisogno di tema o attività con il titolo app per essere lì. Assicurati di non aver stilizzato la tua applicazione o attività come Theme.NOTITLE.

<application 
    android:name="com.xxx.yyy.Application" 
    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 this in your code 
     android:windowSoftInputMode="adjustResize|stateHidden" > 
1

La vera risposta dovrebbe essere combinazione di entrambi @zapl e @Himanshu Virmani

Per Android Manifest:

<application 
    android:name="com.xxx.yyy.Application" 
    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 this in your code 
     android:windowSoftInputMode="adjustResize|stateHidden" > 

Per attività:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The Action Bar is a window feature. The feature must be requested 
    // before setting a content view. Normally this is set automatically 
    // by your Activity's theme in your manifest. The provided system 
    // theme Theme.WithActionBar enables this for you. Use it as you would 
    // use Theme.NoTitleBar. You can add an Action Bar to your own themes 
    // by adding the element <item name="android:windowActionBar">true</item> 
    // to your style definition. 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 
    setContentView(R.layout.activity_main); 
    // Hide the status bar for Android 4.1 and higher 
    View decorView = getWindow().getDecorView(); 
    // Hide the status bar. 
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; 
    decorView.setSystemUiVisibility(uiOptions); 
    // Remember that you should never show the action bar if the 
    // status bar is hidden, so hide that too if necessary. 
    ActionBar actionBar = getActionBar(); 
    actionBar.hide(); 
} 
+0

Per me la risposta era spostare la chiamata di funzione request sopra il setContentView, grazie! – Rickard

2

Se si crea un progetto di applicazione per API14 o superiore, ci sarà una cartella values-14. Assicurarsi che esista la cartella e ha un file styles.xml con:

<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 
     <!-- API 14 theme customizations can go here. --> 
</style> 

ho ottenuto questo errore perché ho creato un nuovo progetto e non volevo eventuali valori cartelle aggiuntive nel mio progetto, quindi ho solo tenuto la cartella dei valori e rimosse le cartelle values-v11 e values-v14. Ma a quanto pare il tema predefinito per API14 e sopra richiede un ActionBar nel suo tag XML padre se si desidera utilizzare ActionBar. Quindi ho pensato che avrei potuto farlo in modo errato! Spero che questo aiuti qualcuno. È più probabile che tu risolva i tuoi problemi con le risposte sopra.

4

Stavo cercando di ottenere ActionBar da un frammento all'interno di ActionBarActivity utilizzando la libreria di supporto. Ho dovuto fare questo:

ActionBarActivity actionBarActivity = (ActionBarActivity)getActivity(); 
ActionBar actionBar = actionBarActivity.getSupportActionBar(); 

La mia prossima missione è capire come rendere questo generico. Ad esempio, questo codice si sente sporco perché richiede al mio frammento di sapere sia che viene utilizzato da ActionBarActivity che utilizzando la libreria di supporto. Penso che dovrebbe essere un metodo che controlla lo getActivity().getActionBar() prima seguito dal codice sopra che cattura ClassCastException se l'attività parent è non ActionBarActivity.

+0

Solo questa risposta funziona per me. Anche se pensassi di estendere ActionBarActivity, getActionBar() restituisce null :( – Vivek

11

Sembra che ci siano diverse condizioni che devono essere soddisfatte affinché funzioni. Quello che mi ha lasciato per lungo tempo è stato questo:

Assicurati che la tua attività estenda Attività (NON ActionBarActivity).

public class MagicActivity extends Activity 

Assicurarsi che il file manifest ha qualcosa come

<application 
    ... 
    android:theme="@android:style/Theme.Holo" > 

e assicurarsi che il layout di attività ha

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    .... 
    android:theme="@android:style/Theme.WithActionBar" > 

-Mark

1

Assicurati di estendere ACTIONBARACTIVITY e non ATTIVITA ' Questo dovrebbe risolvere il tuo problema

9

mi sembrava di risolvere tutti i miei errori commutando getActionBar() con getSupportActionBar(). Avevo provato diversi temi, aggiungendo getWindow(). RequestFeature (Window.FEATURE_ACTION_BAR);, assicurati che setContentView (vista) fosse il primo e tutte le altre cose viste prima.

+0

Funziona perfettamente! Grazie – user2235615

1

basta cambiare due cose 1) manifest modificare android: theme = "@ Android: Stile/Theme.Holo">

2) file di Frammento aggiungere android: theme = "@ Android: Stile/Theme.WithActionBar"

1

Modificare l'ordine di richiesta del sistema:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 

    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main); 

    // experiment with the ActionBar 
    ActionBar actionBar = getActionBar(); 
    actionBar.hide(); 
} 
0

nel caso in cui si sta sviluppando un app che si rivolge sdk> = 14, e si sta estendendo AppCompat per sostenere tema Materiale in Versio precedente anche ns. Quando si desidera nascondere gli elementi dalla barra delle azioni come il pulsante Indietro è necessario effettuare questa operazione: Nella propria attività (non nella classe frammento) Se si utilizzerà getActionBar() restituirà null. come nel tema Appsupport, getSupportAcionBar() restituirà la barra delle azioni.

Ecco il link se volete seguire da DevByte

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_detail); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 




} 
3

Questo risolto il mio problema:

android.support.v7.app.ActionBar ab = getSupportActionBar(); 
0

forse lo stile della vostra attività si basa NoActionBar

Problemi correlati