2015-06-06 32 views
10

强文本我得到运行时在此的NullPointerException:的NullPointerException:与ActionBar.setDisplayHomeAsUpEnabled(布尔值)”上的空对象引用

引起:显示java.lang.NullPointerException:尝试调用虚拟方法上的空对象引用

代码从mainActivity '空隙android.app.ActionBar.setDisplayHomeAsUpEnabled(布尔值)' :

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

有问题的代码行是:

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

我使用:样式名称= “AppTheme” 父= “Theme.AppCompat.Light.DarkActionBar”

我已经使用了getSupportActionBar()但我还没有找到任何解决方案

+0

其因为getActionBar();返回null。 – Kartheek

+0

是你的活动扩展ActionBarActivity? –

+0

@Vasilisfoo编辑并粘贴完整的代码来找出问题所在。 – strike

回答

24

问题的原因是使用MainActivity extend Activity与支持主题style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"。这是不相容的东西。 你需要哪个min sdk?

在您的代码中有MainActivity extends Activity,您不需要AppCompatTheme。如果您正在使用Theme.AppCompat.Light.DarkActionBar使用name="AppTheme" parent="android:Theme.Light

,你应该延长您ActivityAppCompatActivity,并使用getSupportActionBar()

相反的:

public class MainActivity extends Activity { 

使用:

public class MainActivity extends AppCompatActivity { 

,而是作者:

getActionBar().setTitle(mTitles); 

使用:

getSupportActionBar().setTitle(mTitles); 
+0

易于理解,谢谢+1 –

1

assert getActionBar() != null;放在mActionBar = getActionBar();

+0

添加空检查几乎无法解决问题? – JakeSteam

3

此问题可能是由您的主题引起的。再次检查,并确保它与父母Theme.AppCompat.Light.DarkActionBar

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

如果你的活动来延长AppCompatActivityActionBarActivity,叫getSupportActionBar()

+0

我有使用getSupportActionBar()'的空指针问题。我的问题是通过在我的styles.xml中添加' true''来解决的。 – Erik

2
  1. 可以更改style.xml文件。 例如: <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- Customize your theme here. --> </style>
0

就我而言,我忘了初始化我的工具栏,所以,使用前getSupportActionBar,我不得不这样做:

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
相关问题