简体   繁体   English

通过扩展BaseActivity在不同的活动中使用导航抽屉

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM