2015-06-06 15 views
10

văn bản mạnh mẽ tôi nhận được NullPointerException này trên runtime:NullPointerException: với ActionBar.setDisplayHomeAsUpEnabled (boolean)' trên một tài liệu tham khảo đối tượng null

Nguyên nhân: java.lang.NullPointerException: Cố gắng để gọi phương thức ảo 'khoảng trống android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' về một tham chiếu đối tượng null

mã từ 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); 
    } 
} 

các dòng mã mà có vấn đề là:

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

tôi sử dụng: Tên style = "AppTheme" mẹ = "Theme.AppCompat.Light.DarkActionBar"

tôi đã sử dụng getSupportActionBar() nhưng tôi chưa giải quyết bất kỳ giải pháp nào

+0

của nó vì getActionBar(); đang trả về null. – Kartheek

+0

là ur Hoạt động mở rộng ActionBarActivity? –

+0

@Vasilisfoo Chỉnh sửa và dán mã hoàn chỉnh để tìm ra sự cố. – strike

Trả lời

24

Nguyên nhân gây ra sự cố của bạn đang sử dụng MainActivity extend Activity với chủ đề hỗ trợ style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar". Đó là những thứ không tương thích. Bạn cần sdk tối thiểu nào?

Trong mã của bạn có MainActivity extends Activity bạn không cần AppCompatTheme. Sử dụng name="AppTheme" parent="android:Theme.Light "

Nếu bạn đang sử dụng Theme.AppCompat.Light.DarkActionBar, bạn nên mở rộng của bạn Activity từ AppCompatActivity, và sử dụng getSupportActionBar()

Thay vì:.

public class MainActivity extends Activity { 

sử dụng:

public class MainActivity extends AppCompatActivity { 

và thay vào đó của:

getActionBar().setTitle(mTitles); 

sử dụng:

getSupportActionBar().setTitle(mTitles); 
+0

Dễ hiểu nhờ +1 –

1

Đặt assert getActionBar() != null; sau mActionBar = getActionBar();

+0

Thêm một kiểm tra null hầu như không khắc phục được sự cố? – JakeSteam

3

Sự cố này có thể do chủ đề của bạn gây ra. Hãy kiểm tra lại lần nữa và đảm bảo rằng nó là cha mẹ với Theme.AppCompat.Light.DarkActionBar.

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

Nếu hoạt động của bạn kéo dài AppCompatActivity hoặc ActionBarActivity, gọi getSupportActionBar().

+0

Tôi đã có vấn đề con trỏ null bằng cách sử dụng 'getSupportActionBar()'. Sự cố của tôi đã được khắc phục bằng cách thêm ' true' vào tệp styles.xml của tôi. – Erik

2
  1. Bạn có thể thay đổi tập tin style.xml. cho Ví dụ: <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- Customize your theme here. --> </style>
0

Trong trường hợp của tôi, tôi quên init Toolbar tôi, vì vậy, trước khi sử dụng getSupportActionBar, tôi đã phải làm điều này:

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
Các vấn đề liên quan