【发布时间】: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/3907178 和stackoverflow.com/a/26444771/3907178 并没有工作
-
您应该改用 getSupportActionBar(),并使用 ActionBarActivity 扩展您的类。
-
@AnggrayudiH,我试过了,但是当我这样做时,应用程序甚至在到达代码的第一行之前就崩溃了(+:ActionBarActivity 已被弃用,这并不意味着我们应该避免使用它?)
-
然后扩展 AppCompatActivity。
标签: java android android-fragments android-actionbar slidingmenu