[英]Using Navigation Drawer in different Activities by extending BaseActivity
I'm trying to let my HomeActivity
extend BaseActivity
(as suggested here ) so I can have the same Navigation Drawer in every Activity I want. 我试图让我的HomeActivity
扩展BaseActivity
(如此处所示 ),这样我就可以在我想要的每个Activity中使用相同的Navigation Drawer。 But I get a NullPointerException
in the onCreate method of my HomeActivity. 但是我在HomeActivity的onCreate方法中得到了NullPointerException
。 This is the code of BaseActivity: 这是BaseActivity的代码:
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class BaseActivity extends Activity
{
public DrawerLayout drawerLayout;
public ListView drawerList;
private String[] drawerListEntries;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState)
{
drawerListEntries = new String[] {"Bla bla", "Profile", "Home"};
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_navigation_drawer, 0, 0)
{
public void onDrawerClosed(View view)
{
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView)
{
getActionBar().setTitle(R.string.hello_world);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
//layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.drawer_list);
// View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
// drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, drawerListEntries));
// View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
// R.layout.drawer_list_footer, null, false);
// drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
//map.drawerClickEvent(pos);
String selectedValue = (String) drawerList.getAdapter().getItem(pos);
Toast.makeText(getBaseContext(), selectedValue, Toast.LENGTH_SHORT).show();
}
});
}
@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);
}
}
And this is the code of HomeActivity which extends BaseActivity: 这是扩展BaseActivity的HomeActivity代码:
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.facebook.Session;
public class HomeActivity extends BaseActivity {
TextView greeting;
Button orderButton, deliverButton, logout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.home, menu);
//return super.onCreateOptionsMenu(menu);
return true;
}
}
I get a NullPointerException in: 我在下面得到一个NullPointerException:
super.onCreate(savedInstanceState); // HomeActivity
and when I click on that, it goes to: 当我点击它时,它会转到:
drawerLayout.setDrawerListener(drawerToggle); // BaseActivity
Does anyone know how I can fix this? 有谁知道我怎么解决这个问题?
Update: 更新:
drawer_list.xml: drawer_list.xml:
<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" >
<ListView
android:id="@+id/drawer_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="10dp"
android:layout_marginTop="5dp"
android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
android:divider="#CCCCCC"
android:dividerHeight="1dp"
android:paddingLeft="2dp" />
</android.support.v4.widget.DrawerLayout>
and drawer_list_item.xml: 和drawer_list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/drawer_list_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="12dp"
android:textSize="24sp"
android:layout_gravity="left"
android:textColor="@color/belize_hole"
android:fontFamily="sans-serif-light">
</TextView>
</LinearLayout>
Same issue in a few posts. 几个帖子中的问题相同。 I am new to android but solved it this way. 我是android的新手但是这样解决了。 Would love to hear if there is a better "right" way to do it. 如果有更好的“正确”方式,我们愿意听到。 (yes, without fragments but I know I need to learn them eventually). (是的,没有片段,但我知道我最终需要学习它们)。
The problem appears that the base class is not aware of the layout. 问题似乎是基类不知道布局。 Not sure how or why it worked for others without having to do something like this.. but I am new to Android. 不知道如何或为什么它为其他人工作而不必做这样的事情..但我是Android新手。
I was getting the same error and solved by passing my layout to the base via onCreate. 我得到了同样的错误,并通过onCreate将我的布局传递给基础解决了。
So in the base, I modified onCreate to be like this: 所以在基础上,我修改onCreate是这样的:
protected void onCreate(Bundle savedInstanceState, int resLayoutID)
{
super.onCreate(savedInstanceState);
setContentView(resLayoutID);
Then, from my new activity, I have this: 然后,从我的新活动,我有这个:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.my_activity);
This code in my base now works instead of staying null: 我的基础中的代码现在可以工作而不是保持为null:
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerList = (ListView) findViewById(R.id.left_drawer);
btw, this result was suggested to me by a friend and it worked for me. 顺便说一句,这个结果是朋友向我推荐的,它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.