我有一個實現了ActionBarDrawerToggle的DrawerActivity。我想讓我的主類繼承這個類(當然還有更多的類),所以我不必在每一個活動中都實現抽屜切換。繼承自DrawerActivity(ActionBarDrawerToggle)
我在這行得到一個NullPointerException
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name);
錯誤日誌:
10-30 11:08:14.703: E/AndroidRuntime(6831): FATAL EXCEPTION: main
10-30 11:08:14.703: E/AndroidRuntime(6831): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.app.android/net.app.android.TestActivity}: java.lang.NullPointerException
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread.access$700(ActivityThread.java:134)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.os.Handler.dispatchMessage(Handler.java:99)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.os.Looper.loop(Looper.java:137)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread.main(ActivityThread.java:4867)
10-30 11:08:14.703: E/AndroidRuntime(6831): at java.lang.reflect.Method.invokeNative(Native Method)
10-30 11:08:14.703: E/AndroidRuntime(6831): at java.lang.reflect.Method.invoke(Method.java:511)
10-30 11:08:14.703: E/AndroidRuntime(6831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
10-30 11:08:14.703: E/AndroidRuntime(6831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
10-30 11:08:14.703: E/AndroidRuntime(6831): at dalvik.system.NativeStart.main(Native Method)
10-30 11:08:14.703: E/AndroidRuntime(6831): Caused by: java.lang.NullPointerException
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.internal.app.WindowDecorActionBar.getDecorToolbar(WindowDecorActionBar.java:248)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.internal.app.WindowDecorActionBar.init(WindowDecorActionBar.java:201)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.internal.app.WindowDecorActionBar.<init>(WindowDecorActionBar.java:176)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarActivityDelegateBase.createSupportActionBar(ActionBarActivityDelegateBase.java:156)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarActivityDelegate.getSupportActionBar(ActionBarActivityDelegate.java:123)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarActivityDelegate.getActionBarThemedContext(ActionBarActivityDelegate.java:251)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl.getActionBarThemedContext(ActionBarActivityDelegate.java:279)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:222)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.support.v7.app.ActionBarDrawerToggle.<init>(ActionBarDrawerToggle.java:150)
10-30 11:08:14.703: E/AndroidRuntime(6831): at net.app.android.DrawerActivity.onCreate(DrawerActivity.java:19)
10-30 11:08:14.703: E/AndroidRuntime(6831): at net.app.android.TestActivity.onCreate(TestActivity.java:12)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.Activity.performCreate(Activity.java:5047)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
10-30 11:08:14.703: E/AndroidRuntime(6831): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
10-30 11:08:14.703: E/AndroidRuntime(6831): ... 11 more
DrawerActivity
public class DrawerActivity extends ActionBarActivity {
DrawerLayout drawerLayout;
ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name);
drawerLayout.setDrawerListener(drawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
測試活動
public class TestActivity extends DrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_test);
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.test, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
activity_test
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/helloWorld"
android:text="Hello World"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
<include layout="@layout/activity_drawer"/>
</android.support.v4.widget.DrawerLayout>
activity_drawer
<?xml version="1.0" encoding="utf-8"?>
<!-- The navigation drawer -->
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/left_drawer"
android:layout_width="220dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#a6a6a6"/>
編輯 當我把setContentView(R.layout.activity_test);
到我DrawerActivity並將其設置爲發射活動,一切工作正常。怎麼可能?我在之前在我的TestActivity中調用setContentView(R.layout.activity_test);
,所以應該沒問題吧?
謝謝!這似乎工作。我仍然不知道爲什麼我的方法不起作用。幾個月前當我使用'Android.support.v4.app.ActionBarDrawerToggle'時,這種方法工作正常。也許他們在v7中改變了一些導致這個錯誤的東西。 – Chris 2014-10-30 10:57:47