2016-04-14 23 views
0

我想擴展AppCompatActivity集中代碼以共享代碼,例如, DrawerLayout如何擴展AppCompatActivity以集中代碼,例如DrawerLayout?

但是,我遇到NullPointerException。這裏是我的代碼:

MasterActivity

public class MasterActivity extends AppCompatActivity { 
    public static final String TAG = "MasterActivity"; 
    private DrawerLayout mDrawerLayout; 
    private ActionBarDrawerToggle mDrawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    protected void setupDrawer() { 
     // Drawer 
     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open_drawer, R.string.close_drawer) { 
      @Override 
      public void onDrawerOpened(View drawerView) { 

      } 

      @Override 
      public void onDrawerClosed(View drawerView) { 

      } 
     }; 
     mDrawerLayout.addDrawerListener(mDrawerToggle); 
    } 
} 

ChildActivity

public class ChildActivity extends MasterActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_child); 
     setupDrawer(); 
    } 
} 

activity_child.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/drawer_layout" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".ChildActivity"> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <!-- Main Content --> 

    </LinearLayout> 

    <LinearLayout android:id="@+id/llv_left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:orientation="vertical" 
     android:background="#888" > 

     <!-- Drawer Content --> 

    </LinearLayout> 
</android.support.v4.widget.DrawerLayout> 

的NPE出現在:

mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

的錯誤信息是:

嘗試調用虛擬方法 '無效android.support.v4.widget.DrawerLayout.setDrawerShadow(INT,INT)' 上的空對象引用

顯然變量mDrawerLayout爲空,因爲findViewById()無法從佈局XML中找到它。 R.id.drawer_layout位於R.layout.activity_child。如果ChildActivity延伸AppCompatActivity,NPE不會出現。

我該如何解決?

+0

您可以發佈'activity_child.xml'? –

+0

添加到問題中,謝謝 – Raptor

+1

如果'MasterActivity'主持'DrawerLayout'並將其提供給它的子類,則應該在'MasterActivity'中設置內容'View'並設置'DrawerLayout'。在你的子類中,在'onCreate()'中的'super'調用之後,將你的子類的'View'擴充到主內容'LinearLayout'中。 –

回答

1

如何

protected void setupDrawer(View v) { 
    mDrawerLayout = (DrawerLayout)v.findViewById(R.id.drawer_layout); 
    ... 

,然後在ChildActivity

setContentView(R.layout.activity_child); 
setupDrawer(findViewById(android.R.id.content));//use root view 
+0

以上評論中Mike提出的解決方案和充氣解決方案之間有什麼區別?哪個表現更好? – Raptor