将导航抽屉添加到自定义工具栏

时间:2016-01-17 15:53:20

标签: android navigation navigation-drawer android-toolbar

我制作了自定义工具栏及其从右到左。它看起来像这样:

我想在单击右侧图标时出现导航抽屉。但是当我将导航抽屉添加到应用程序时,它会崩溃。我尝试过很多东西并且搜索了很多东西,但它没有用。 如果有人帮助我,那就太棒了。

这是我的代码:

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.playpersia.mycustomizedtoolbar.MainActivity"
  >

  <include
    layout="@layout/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/toolbar"/>


  <android.support.v4.widget.DrawerLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="end"
    android:fitsSystemWindows="true"
    android:id="@+id/right_drawer">

   <!-- Main layout -->
   <FrameLayout
    android:id="@+id/main_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

 <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:text="Hello"/>

  </FrameLayout>


    <!-- Nav drawer -->
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right|end" >

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/header_drawer"
            android:src="@drawable/my_image" />

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:id="@+id/list_view"
            android:entries="@array/pages" />
    </LinearLayout>

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

 </LinearLayout>

right_drawer.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="end"
android:fitsSystemWindows="true"
android:id="@+id/right_drawer"
>
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/header_drawer"
        android:src="@drawable/my_image" />
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:id="@+id/list_view"
        android:entries="@array/pages" />

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

MainActivity.java

 package com.playpersia.mycustomizedtoolbar;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.zip.Inflater;

public class MainActivity extends AppCompatActivity implements  NavigationView.OnNavigationItemSelectedListener {
    private Toolbar toolbar;
    public ListView listView;
    public String[] pages;
    ArrayAdapter<String> arrayAdapter;
    public ImageView menu_icon;
    public ImageView  back_arrow;
    public boolean mSlideState;
    private DrawerLayout drawerLayout;
    public ActionBarDrawerToggle _mDrawerTg;
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        menu_icon = (ImageView) findViewById(R.id.menu_icon);
        back_arrow = (ImageView) findViewById(R.id.back_button);
        drawerLayout =(DrawerLayout) findViewById(R.id.right_drawer);
        pages =getResources().getStringArray(R.array.pages);
        _mDrawerTg =new ActionBarDrawerToggle(this, drawerLayout,
                null, R.string.drawer_open, R.string.drawer_close){
            public void onDrawerClosed(View view){
                mSlideState=false;
            }
            public void onDrawerOpened (View drawerView){
                super.onDrawerOpened(drawerView);
                mSlideState=true;
            }        };

       listView = (ListView) findViewById(R.id.list_view);

        listView.setAdapter(new ArrayAdapter<String>(this,R.layout.drawer_list_item,pages));

        drawerLayout.setDrawerListener(_mDrawerTg);
        _mDrawerTg.syncState();
        menu_icon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mSlideState){
                    drawerLayout.closeDrawer(GravityCompat.END);
                }else{
                    drawerLayout.openDrawer(GravityCompat.END);                }            }        });    }


    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        _mDrawerTg.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        _mDrawerTg.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (_mDrawerTg.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }
}

更新 logcat的:

01-18 12:34:25.386 29949-29949/com.playpersia.mycustomizedtoolbar  
E/AndroidRuntime: FATAL EXCEPTION: main Process:
com.playpersia.mycustomizedtoolbar, PID: 29949 java.lang.RuntimeException: 
Unable to start activityComponentInfo{com.playpersia.mycustomizedtoolbar/com.playpersia.mycustomizedtool   
 bar.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual
 method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on    a null object reference at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)at
 android.app.ActivityThread.access$800(ActivityThread.java:156)at    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)at
android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)at   com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method   'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null   object reference at com.playpersia.mycustomizedtoolbar.MainActivity.onCreate(MainActivity.java:53)
at android.app.Activity.performCreate(Activity.java:5990)
at    android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
at android.app.ActivityThread.access$800(ActivityThread.java:156) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:211) 
at android.app.ActivityThread.main(ActivityThread.java:5373) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 

更新2

现在,当我点击抽屉打开的右侧图标时,我有了这个工具栏。关闭, right side drawer

2 个答案:

答案 0 :(得分:1)

  

引起:java.lang。 NullPointerException :尝试调用虚拟   方法&#39;无效   android.widget.ListView.setAdapter(android.widget.ListAdapter)&#39;在...上   null对象引用   com.playpersia.mycustomizedtoolbar.MainActivity.onCreate(MainActivity.java:53)

onCreate方法中,您的listView对象为空。

您需要添加

listView = (ListView) findViewById(R.id.list_view);

之前

listView.setAdapter(new ArrayAdapter<String (this,R.layout.drawer_list_item,pages));

<强>更新

将您的activity_main.xml更改为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/toolbar"/>

    <android.support.v4.widget.DrawerLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:openDrawer="end"
        android:fitsSystemWindows="true"
        android:id="@+id/right_drawer">

        <!-- Main layout -->
        <FrameLayout
            android:id="@+id/main_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/toolbar"
                android:text="Hello"/>

        </FrameLayout>

        <!-- Nav drawer -->
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="left|start" >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/header_drawer"
                android:src="@drawable/my_image" />

            <ListView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:id="@+id/list_view"
                android:entries="@array/pages" />
        </LinearLayout>

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

</LinearLayout>

答案 1 :(得分:0)

这应该是您的MainLayout,因为您使用的是DrawerLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/right_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Your contents, for example, CoordinatorLayout with material design -->

    <!-- And after main Contents, here you can use NavigationDrawer also -->

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

而不是评论代码,请使用您的内容。

你做错了,看看:

http://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout

  

要添加导航抽屉,请使用a声明您的用户界面   DrawerLayout对象作为布局的根视图。在 - 的里面   DrawerLayout,添加一个包含主要内容的视图   屏幕(隐藏抽屉时的主要布局)和另一个   包含导航抽屉内容的视图。

     

例如,以下布局使用带有两个子项的DrawerLayout   views:一个包含主要内容的FrameLayout(由一个填充   在运行时分段)和导航抽屉的ListView。

示例:

<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">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        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="#111"/>
</android.support.v4.widget.DrawerLayout>

您可能需要查看本课程实施的材料设计指南

https://www.google.com/design/spec/patterns/navigation-drawer.html