2014-10-30 89 views
0

我有一個實現了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);,所以應該沒問題吧?

回答

2

ActionBarActivity有​​在onCreate之後被調用的方法。嘗試從DrawerActivity.onCreateDrawerActivity.onPostCreate移動這個代碼:

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

,改變你的TestActivity.onCreate到:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 
} 
+0

謝謝!這似乎工作。我仍然不知道爲什麼我的方法不起作用。幾個月前當我使用'Android.support.v4.app.ActionBarDrawerToggle'時,這種方法工作正常。也許他們在v7中改變了一些導致這個錯誤的東西。 – Chris 2014-10-30 10:57:47

0

onCreate中的DrawerActivity其中是您的setContentView(R.layout.activity_drawer); ?

UPDATE 對不起,我完全誤解了,但你的方法是完全錯誤的。 如果你想在每一個延伸DrawerActivity做的唯一的事活動drawerlatout是離開這個部分空:

<!-- The main content view --> 
<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

,並創建你的DrawerActivity這樣一個抽象的方法:

public abstract Fragment getDefaultFragment(); 

並在您的DrawerActivity onCreate中使用它來替換@ + id/content_frame的內容。 但是activity_test必須是DrawerActivity的內容。