2016-04-14 3 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型)' を呼び出すため

試みnullオブジェクト参照

は、レイアウトXMLから変数mDrawerLayoutが見つからないことが明らかです。 R.id.drawer_layoutR.layout.activity_childにあります。 ChildActivityAppCompatActivityの場合、NPEは表示されません。

どうすれば解決できますか?

+0

には 'activity_child.xml'を投稿することができますか? –

+0

質問に追加しました – Raptor

+1

'MasterActivity'が' DrawerLayout'をホストしてそのサブクラスに提供することを意図している場合は、 'View'コンテンツを設定し、' MasterActivity'に '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によって提案されたこのソリューションとinflateソリューションの違いは何ですか?より良いパフォーマンスを発揮しますか? – Raptor

関連する問題