2015-06-06 24 views
10

forte testo ottengo questo NullPointerException in fase di esecuzione:NullPointerException: con ActionBar.setDisplayHomeAsUpEnabled (booleano)' su un riferimento oggetto null

Causato da: java.lang.NullPointerException: Tentativo di richiamare il metodo virtuale 'vuoto android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' su un riferimento oggetto null codice

da mainActivity:

package com.example.vasilis.spangreek; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.content.res.Configuration; 
import android.content.res.TypedArray; 
import android.os.Bundle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.DisplayMetrics; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ExpandableListView; 

import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 

import adapter.ExpandableListViewAdapter; 
import model.NavDrawerItem; 


public class MainActivity extends Activity { 

    private DrawerLayout mDrawerLayout; 
    private ExpandableListView mExpandableListView; 
    private ActionBarDrawerToggle mActionBarDrawerToggle; 

    //nav drawer Title 
    private CharSequence mDrawerTitle; 

    //used to store app titles 
    private CharSequence mTitles; 

    //slide menu items 
    private String[] navMenuItems; 
    private String[] navSubMenuItems; 
    private TypedArray navMenuIcons; 

    private List<NavDrawerItem> groupList; 
    private List<NavDrawerItem> childList; 
    private Map<NavDrawerItem, List<NavDrawerItem>> mapList; 
    private ExpandableListViewAdapter mAdapter; 
    ActionBar mActionBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mTitles = mDrawerTitle = getTitle(); 

     //nav drawer icons 
     navMenuIcons = getResources().obtainTypedArray(R.array.nav_icons); 

     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 

     createGroupList(); 
     CreateChildList(); 

     // Recycle the typed array 
     navMenuIcons.recycle(); 

     mExpandableListView = (ExpandableListView)findViewById(R.id.list_slideMenu); 
     mAdapter = new ExpandableListViewAdapter(this, mapList, groupList); 
     mExpandableListView.setAdapter(mAdapter); 
     mActionBar = getActionBar(); 
     // enabling action bar app icon and behaving it as toggle button 
     mActionBar.setDisplayHomeAsUpEnabled(true); 
     mActionBar.setHomeButtonEnabled(true); 

     //toggle 
     mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.string.app_name, R.string.app_name) { 

      public void onDrawerClosed(View drawerView) { 
       mActionBar.setTitle(mDrawerTitle); 

       // calling onPrepareOptionsMenu() to hide action bar icons 
       invalidateOptionsMenu(); 
      } 


      public void onDrawerOpened(View drawerView) { 
       mActionBar.setTitle(mDrawerTitle); 
       // calling onPrepareOptionsMenu() to hide action bar icons 
       invalidateOptionsMenu(); 
      } 
     }; 

     mActionBarDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); 

     mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); 

     if(savedInstanceState == null) { 
      //displayView(0); 
     } 


    } 

    /*** 
    * Called when invalidateOptionsMenu() is triggered 
    */ 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // if nav drawer is opened, hide the action items 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mExpandableListView); 
     menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public void setTitle(CharSequence title) { 
     mTitles = title; 
     getActionBar().setTitle(mTitles); 
    } 

    /** 
    * When using the ActionBarDrawerToggle, you must call it during 
    * onPostCreate() and onConfigurationChanged()... 
    */ 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mActionBarDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggls 
     mActionBarDrawerToggle .onConfigurationChanged(newConfig); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     // toggle nav drawer on selecting action bar app icon/title 
     if (mActionBarDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     // Handle action bar actions click 
     switch (item.getItemId()) { 
      case R.id.action_settings: 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 

     } 
    } 

    private void createGroupList() { 
     //load slide menu items 
     navMenuItems = getResources().getStringArray(R.array.nav_items); 

     groupList =new ArrayList<NavDrawerItem>(); 

     for (int i = 0 ; i < navMenuItems.length ; i++) { 
      groupList.add(i , new NavDrawerItem(navMenuItems[i], navMenuIcons.getResourceId(i, -1))); 
     } 
    } 

    private void CreateChildList() { 

     mapList = new LinkedHashMap<NavDrawerItem, List<NavDrawerItem>>(); 
     navSubMenuItems = getResources().getStringArray(R.array.nav_sub_items); 
     childList = new ArrayList<>(); 



     for (NavDrawerItem item : groupList) { 
      if(item.getTitle().equalsIgnoreCase("learning Spanish")) { 
       for (int i = 0 ; i < navSubMenuItems.length ; i ++) { 
        childList.add(i, new NavDrawerItem(navSubMenuItems[i])); 
       } 
      } 

      mapList.put(item,childList); 
     } 

    } 

    private void setGroupIndicatorToRight() { 
     /* Get the screen width */ 
     DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     int width = dm.widthPixels; 

     mExpandableListView.setIndicatorBounds(width - getDipsFromPixel(35), width 
       - getDipsFromPixel(5)); 
    } 

    // Convert pixel to dip 
    public int getDipsFromPixel(float pixels) { 
     // Get the screen's density scale 
     final float scale = getResources().getDisplayMetrics().density; 
     // Convert the dps to pixels, based on density scale 
     return (int) (pixels * scale + 0.5f); 
    } 
} 

le righe di codice che hanno il problema sono:

mActionBar = getActionBar(); 
    // enabling action bar app icon and behaving it as toggle button 
    mActionBar.setDisplayHomeAsUpEnabled(true); 
    mActionBar.setHomeButtonEnabled(true); 

i usano: nome style = padre "AppTheme" = "Theme.AppCompat.Light.DarkActionBar"

I ho usato getSupportActionBar() ma non ho trovato alcuna soluzione

+0

suo perché getActionBar(); sta restituendo null. – Kartheek

+0

La tua attività estende ActionBarActivity? –

+0

@Vasilisfoo Modifica e incolla il codice completo per capire il problema. – strike

risposta

24

La causa del problema è l'utilizzo di MainActivity extend Activity con il tema di supporto style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar". Sono cose incompatibili. Quale min sdk hai bisogno?

Nel codice con MainActivity extends Activity non è necessario AppCompatTheme. Utilizzare name="AppTheme" parent="android:Theme.Light "

Se si utilizza Theme.AppCompat.Light.DarkActionBar, si dovrebbe estendere il Activity da AppCompatActivity, e utilizzare getSupportActionBar()

Invece di:.

public class MainActivity extends Activity { 

uso:

public class MainActivity extends AppCompatActivity { 

invece di:

getActionBar().setTitle(mTitles); 

uso:

getSupportActionBar().setTitle(mTitles); 
+0

Facile da capire, grazie +1 –

1

Put assert getActionBar() != null; dopo mActionBar = getActionBar();

+0

L'aggiunta di un controllo null risolve a fatica il problema? – JakeSteam

3

Questo problema potrebbe essere causato dal tema. Controlla di nuovo e assicurati che sia padre con Theme.AppCompat.Light.DarkActionBar.

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">true</item> 
    ... 
</style> 

Se la vostra attività si estende AppCompatActivity o ActionBarActivity, chiamare getSupportActionBar().

+0

Ho avuto il problema del puntatore nullo usando 'getSupportActionBar()'. Il mio problema è stato risolto aggiungendo ' true' nel mio styles.xml. – Erik

2
  1. È possibile modificare il file style.xml. per Esempio: <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- Customize your theme here. --> </style>
0

Nel mio caso, ho dimenticato di init mia barra degli strumenti, quindi, prima di utilizzare getSupportActionBar, ho dovuto fare questo:

appbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(appbar); 

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
Problemi correlati