2015-06-06 12 views
10

mocny tekst otrzymuję ten NullPointerException na starcie:NullPointerException: z ActionBar.setDisplayHomeAsUpEnabled (Boolean)”na null odniesienia obiektu

spowodowane: java.lang.NullPointerException: Próba wywołania metody wirtualne 'nieważny android.app.ActionBar.setDisplayHomeAsUpEnabled (logiczna)' o zerowym odniesienia kodu wynikowego

z główną działalność:

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); 
    } 
} 

linie kodu, które mają problemy to:

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

używam: nazwa style = "AppTheme" rodzic = "Theme.AppCompat.Light.DarkActionBar"

I użyłem funkcji getSupportActionBar(), ale nie zainstalowałem żadnego rozwiązania

+0

jego ponieważ getActionBar(); zwraca zero. – Kartheek

+0

is ur Activity extended ActionBarActivity? –

+0

@Vasilisfoo Edytuj i wklej pełny kod, aby znaleźć problem. – strike

Odpowiedz

24

Przyczyną problemu jest użycie MainActivity extend Activity z motywem pomocy style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar". To niezgodne rzeczy. Który min. Sdk potrzebujesz?

W swoim kodzie posiadającym MainActivity extends Activity nie potrzebujesz AppCompatTheme. Użyj name="AppTheme" parent="android:Theme.Light "

Jeśli używasz Theme.AppCompat.Light.DarkActionBar, należy przedłużyć Activity z AppCompatActivity i używać getSupportActionBar()

zamiast:.

public class MainActivity extends Activity { 

zastosowanie:

public class MainActivity extends AppCompatActivity { 

i zamiast z:

getActionBar().setTitle(mTitles); 

zastosowanie:

getSupportActionBar().setTitle(mTitles); 
+0

Łatwo zrozumieć dzięki +1 –

1

Po wstawieniu assert getActionBar() != null; po mActionBar = getActionBar();

+0

Dodanie czeku zerowego prawie nie rozwiązuje problemu? – JakeSteam

3

Ten problem może być spowodowany przez Twój motyw. Sprawdź ponownie i upewnij się, że jest to rodzic z Theme.AppCompat.Light.DarkActionBar.

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

Jeśli aktywność rozciąga AppCompatActivity lub ActionBarActivity, zadzwoń getSupportActionBar().

+0

Miałem problem z pustym wskaźnikiem za pomocą 'getSupportActionBar()'. Mój problem został rozwiązany przez dodanie '' item name = "windowActionBar"> true 'in my styles.xml. – Erik

2
  1. Można zmienić plik style.xml. na przykład: <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- Customize your theme here. --> </style>
0

W moim przypadku, zapomniałem init mój pasek, więc przed użyciem getSupportActionBar, musiałem to zrobić:

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
Powiązane problemy