【问题标题】:SlidingMenu tutorial : getActionBar().setDisplayHomeAsUpEnabled(true); throws NullPointerException on new activity creationSlidingMenu 教程:getActionBar().setDisplayHomeAsUpEnabled(true);在创建新活动时抛出 NullPointerException
【发布时间】:2015-06-11 00:18:12
【问题描述】:

我正在尝试做这个教程:http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

就是在app里面做一个滑动菜单。

幸运的是,

getActionBar().setDisplayHomeAsUpEnabled(true);

正在抛出空指针异常。

我是 android 的初学者,我已经阅读了一些解决方案,但似乎没有一个对我来说可以正常工作,并且应用程序在到达这部分代码时仍然崩溃。

我读到了以下问题: getActionBar().setDisplayHomeAsUpEnabled(true) throws NullPointerException, getActionBar().setDisplayHomeAsUpEnabled(true); throws NullPointerException on new activity creation (Google - Basic Tutorial), getActionBar().setDisplayHomeAsUpEnabled(true); nullpointer in preferenceActivity

有人可以帮我解决这个问题吗?显然它处理操作栏,但我不知道究竟是什么......

这真的很有帮助,谢谢!

这是显示菜单的 MainActivity 的代码, 在它下面我为您提供错误日志 :

包 com.example.invite.myapplication.activities;

import com.example.invite.myapplication.adapter.NavDrawerListAdapter;
import com.example.invite.myapplication.model.NavDrawerItem;
import com.example.invite.myapplication.R;

import com.example.invite.myapplication.frags.*;


import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;×

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

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

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
        // What's hot, We  will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));


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

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

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

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

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

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

这里是错误日志:

06-11 02:12:24.364 25134-25134/com.example.invite.myapplication E/AndroidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.invite.myapplication/com.example.invite.myapplication.activities.MainActivity}: java.lang.NullPointerException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 在 android.app.ActivityThread.access$700(ActivityThread.java:159) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5419) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.NullPointerException 在 com.example.invite.myapplication.activities.MainActivity.onCreate(MainActivity.java:91) 在 android.app.Activity.performCreate(Activity.java:5372) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 在 android.app.ActivityThread.access$700(ActivityThread.java:159) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5419) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 在 dalvik.system.NativeStart.main(Native Method)

这里是“styles.xml”

<!--
    Base application theme, dependent on API level. This theme is replaced
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
    <!--
        Theme customizations available in newer API levels can go in
        res/values-vXX/styles.xml, while customizations related to
        backward-compatibility can go here.
    -->
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

<style name = "NoActionBar" parent = "@android:style/Theme.Holo.Light">
    <!-- <item name = "android:windowActionBar">false</item> -->
    <!-- <item name = "android:windowNoTitle">true</item> -->
</style>

解决方案:#(希望它也适用于您)。

终于简单了。

只需添加:

requestWindowFeature(Window.FEATURE_ACTION_BAR);

在 SetContentView(View ..) 之前。

据我了解,这种强制 Activity 请求 用于操作栏“请操作操作栏!(?)”。

并在清单中设置 min sdk 11 和 target 17

这是最终帮助我的答案: https://stackoverflow.com/a/10031400

【问题讨论】:

  • 您是否尝试过在链接问题的答案中使用代码? stackoverflow.com/a/27078529/4409409
  • 是的,也许不正确......但我尝试了stackoverflow.com/a/27078529/3907178stackoverflow.com/a/26444771/3907178 并没有工作
  • 您应该改用 getSupportActionBar(),并使用 ActionBarActivity 扩展您的类。
  • @AnggrayudiH,我试过了,但是当我这样做时,应用程序甚至在到达代码的第一行之前就崩溃了(+:ActionBarActivity 已被弃用,这并不意味着我们应该避免使用它?)
  • 然后扩展 AppCompatActivity。

标签: java android android-fragments android-actionbar slidingmenu


【解决方案1】:

在 OnCreate() 中声明此代码 getActionBar().setDisplayHomeAsUpEnabled(true); 后,您还必须在 OnOptionItemSelected() 中声明一些代码,如下所示:

        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();

            if (id == android.R.id.home) {

                Intent i = new Intent(MainListActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            }
            return super.onOptionsItemSelected(item);
        }

希望对你有帮助:D

【讨论】:

    【解决方案2】:

    试着这样跑

    private ActionBar actionBar;
    
     @Override
        protected void onCreate(Bundle savedInstanceState) {
    
      actionBar = getActionBar();
            if(actionBar!=null) {
               actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setHomeButtonEnabled(true);
            }
    
    }
    

    【讨论】:

      【解决方案3】:

      我刚刚找到了解决办法。

      终于简单了。

      只需添加:

      requestWindowFeature(Window.FEATURE_ACTION_BAR);

      在 SetContentView(View ..) 之前。

      并在清单中设置 min sdk 11 和 target 17

      这是最终帮助我的答案:https://stackoverflow.com/a/10031400

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        相关资源
        最近更新 更多