Android - 抽屉布局 - 关闭抽屉会导致空指针异常

时间:2014-10-31 00:11:07

标签: java android drawerlayout

我无法在Android中关闭抽屉布局。每当我调用drawer.closeDrawers()或drawer.closeDrawers(list)时,我都会遇到空指针异常。

这是我的MainActivity.java代码。

// Sliding drawer menu
private DrawerLayout drawer;
// Drawer list
private ListView drawerList;
...
...
...
// List of menu options
final String[] menu = new String[]{
        "Item 1",
        "Item 2",
        "Item 3",
        "Item 4",
        "Item 5"
};
// Initialize the drawer menu layout
drawer = (DrawerLayout) findViewById(R.layout.activity_main);
// Initialize the drawer list
drawerList = (ListView) findViewById(R.id.list_slidermenu);
// Drawer list adapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menu);
// Set the adapter for the list
drawerList.setAdapter(adapter);
// Set the background selector for each menu item
drawerList.setSelector(android.R.color.holo_blue_dark);
// On click listener for the list
drawerList.setOnItemClickListener(new OnItemClickListener() {
    // When a menu item is clicked
    public void onItemClick(AdapterView<?> e, View v, int position, long id) {
        // Close the drawer
        drawer.closeDrawers(); // Causes a Null Pointer Exception
    }
});

这是我的activity_main.xml代码。

<!-- Left sided swipe in Drawer layout -->
<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" >

<!-- Framelayout to display Fragments -->
<FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- Google maps fragment -->
    <fragment
        android:id="@+id/google_map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </fragment>
</FrameLayout>

<!-- Listview to display slider menu -->
<ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#F0F0F0"/>

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

这是我的错误堆栈跟踪。

10-30 20:29:21.956: E/AndroidRuntime(1959): FATAL EXCEPTION: main
10-30 20:29:21.956: E/AndroidRuntime(1959): Process: com.dziz.umbcparkingpal, PID: 1959
10-30 20:29:21.956: E/AndroidRuntime(1959): java.lang.NullPointerException
10-30 20:29:21.956: E/AndroidRuntime(1959):     at com.dziz.umbcparkingpal.MainActivity$1.onItemClick(MainActivity.java:108)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.widget.AdapterView.performItemClick(AdapterView.java:301)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.widget.AbsListView$3.run(AbsListView.java:3645)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.os.Handler.handleCallback(Handler.java:733)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.os.Handler.dispatchMessage(Handler.java:95)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.os.Looper.loop(Looper.java:136)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at android.app.ActivityThread.main(ActivityThread.java:5097)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at java.lang.reflect.Method.invokeNative(Native Method)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at java.lang.reflect.Method.invoke(Method.java:515)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-30 20:29:21.956: E/AndroidRuntime(1959):     at dalvik.system.NativeStart.main(Native Method)

有谁可以告诉我我正在做什么导致这个空指针异常?

5 个答案:

答案 0 :(得分:1)

设置抽屉,

drawer= (DrawerLayout) findViewById(R.id.DrawerLayout);

答案 1 :(得分:0)

在从其中检索视图之前,您需要对布局进行充气:

LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
View drawer = inflater.inflate(R.layout.activity_main, null);

然后你可以获取视图:

drawerList = (ListView) drawer.findViewById(R.id.list_slidermenu);

答案 2 :(得分:0)

我有同样的问题并通过调用它来解决它:

 DrawerLayout drawerLayout = (DrawerLayout) ((MainActivity) getActivity()).findViewById(R.id.drawer_layout);
 drawerLayout.closeDrawers();

在片段内。 MainActivity是放置drawer_layout的活动。

还要确保在调用closeDrawers()之前获得对drawerLayout的引用,因为在我的情况下,在我的片段的onCreateView()的开头调用findViewById()时,我仍然有一个NullPointer。

因此,在您的情况下,请从onItemClicked()方法中调用findViewById()。

希望这有帮助。

答案 3 :(得分:0)

我使用了抽屉,它完全没有任何错误。这是我的代码的一部分。我认为这对你有所帮助。

<强> HomeActivity.java

    public class HomeActivity extends Activity {
    DrawerLayout mDrawerLayout;
    ListView mDrawerList;
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;
    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;


    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.d("Activity :", getClass().getName().toString());

            initDrawer(savedInstanceState);

    }

    private void initDrawer(Bundle savedInstanceState) {
            mTitle = mDrawerTitle = getTitle();

            navMenuTitles = getResources().getStringArray(
                    R.array.student_nav_drawer_items);
            navMenuIcons = getResources().obtainTypedArray(
                    R.array.student_nav_drawer_icons);

            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerList = (ListView) findViewById(R.id.left_drawer);

            navDrawerItems = new ArrayList<NavDrawerItem>();


            mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

            adapter = new NavDrawerListAdapter(getApplicationContext(),
                    navDrawerItems);
            mDrawerList.setAdapter(adapter);

            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);
            getActionBar().setIcon(android.R.color.transparent);
            getActionBar().setDisplayShowCustomEnabled(true);
            getActionBar().setCustomView(R.layout.custom_titlebar);

            tvTitle = (TextView) findViewById(R.id.tv_title);
            tvTitle.setText(getString(R.string.title_activity_home));

            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.slider_icon, R.string.app_name, R.string.app_name

            ) {
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu();
                }

                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu();
                }
            };
            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null) {
                selectItem(0);

            }
        }

private void selectItem(int position) {

        switch (position) {
        case 0:

            break;
        case 1:

            break;
        case 2:

            break;

        case 3:


            break;
        default:


            break;
        }

        mDrawerLayout.closeDrawer(mDrawerList);
    }

<强> activity_main.xml中

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </RelativeLayout>

    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#FFFFFF"
        android:choiceMode="singleChoice"
        android:divider="#444"
        android:dividerHeight="1dp"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:textAppearance="?android:attr/textAppearanceListItemSmall" />

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

答案 4 :(得分:0)

  

如果(mDrawerLayout.isDrawerOpen(mRecyclerDrawer)){                               mDrawerLayout.closeDrawer(列表视图);                           } else {                               mDrawerLayout.openDrawer(列表视图);                           }