如何在android中创建自定义导航抽屉

cha*_*ura 51 android android-listview navigation-drawer

嗨,我正在尝试创建类似于gmail app导航抽屉的导航抽屉.我关注开发者网站,但它只指定了基本实现.但我需要根据我的规格自定义导航.

  1. 我需要添加一个标题来对Drawer中的列表项进行分类
  2. 我需要一个单选按钮来选择我的一些选项

我怎样才能做到这一点?

JJD*_*JJD 60

Android自定义导航抽屉教程(通过archive.org)包含基本自定义项目.后者展示了如何设置导航抽屉,如屏幕截图所示:

NavigationDrawerCustom

项目源代码(通过archive.org)可供下载.


这也是导航抽屉 - Live-O项目......

导航抽屉 -  Live-O

项目源代码可在GitHub上获得.


MaterialDrawer库的目标是提供最简便的实现导航抽屉为您的应用程序.它提供了大量开箱即用的自定义功能,还包括一个易于使用的标题,可用作AccountSwitcher.

MaterialDrawer库演示


请注意,Android Studio同时具有一个模板项目,用于创建导航抽屉活动,如屏幕截图所示.

导航抽屉活动

存储库会跟踪对模板所做的更改.


Ans*_*wal 31

我使用下面的布局,并能够在导航视图中实现自定义布局.

<android.support.design.widget.NavigationView
        android:id="@+id/navi_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start|top"
        android:background="@color/navigation_view_bg_color"
        app:theme="@style/NavDrawerTextStyle">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <include layout="@layout/drawer_header" />

            <include layout="@layout/navigation_drawer_menu" />
        </LinearLayout>
</android.support.design.widget.NavigationView> 
Run Code Online (Sandbox Code Playgroud)


Man*_*era 12

对我来说更简单的解决方案是:

注意事项:

  • 此解决方案需要Android Studio提供的自动生成的导航抽屉活动.
  • DrawerItem,CustomDrawerAdapter和布局custom_drawer_item.xml均取自本教程.

1.创建此类以包装自定义抽屉项:

public class DrawerItem {

  String ItemName;
  int imgResID;

  public DrawerItem(String itemName, int imgResID) {
        super();
        ItemName = itemName;
        this.imgResID = imgResID;
  }

  public String getItemName() {
        return ItemName;
  }
  public void setItemName(String itemName) {
        ItemName = itemName;
  }
  public int getImgResID() {
        return imgResID;
  }
  public void setImgResID(int imgResID) {
        this.imgResID = imgResID;
  }
}
Run Code Online (Sandbox Code Playgroud)

2.为抽屉项创建自定义布局(custom_drawer_item.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<LinearLayout
    android:id="@+id/itemLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:orientation="vertical"
    android:layout_marginTop="0dp"
    android:background="?android:attr/activatedBackgroundIndicator">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="55dp">

        <ImageView
            android:id="@+id/drawer_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/drawer_itemName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"/>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginBottom="1dp"
        android:layout_marginTop="1dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="#DADADC">
    </View>
</LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

3.创建自定义适配器:

import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {

Context context;
List<DrawerItem> drawerItemList;
int layoutResID;

public CustomDrawerAdapter(Context context, int layoutResourceID, List<DrawerItem> listItems) {
    super(context, layoutResourceID, listItems);
    this.context = context;
    this.drawerItemList = listItems;
    this.layoutResID = layoutResourceID;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    DrawerItemHolder drawerHolder;
    View view = convertView;

    if (view == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        drawerHolder = new DrawerItemHolder();

        view = inflater.inflate(layoutResID, parent, false);
        drawerHolder.ItemName = (TextView)view.findViewById(R.id.drawer_itemName);
        drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);

        view.setTag(drawerHolder);

    } else {
        drawerHolder = (DrawerItemHolder) view.getTag();
    }

    DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);

    drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
            dItem.getImgResID()));
    drawerHolder.ItemName.setText(dItem.getItemName());

    return view;
}

private static class DrawerItemHolder {
    TextView ItemName;
    ImageView icon;
}
}
Run Code Online (Sandbox Code Playgroud)

4.在自动生成的NavigationDrawerFragmentonCreateView方法中,替换自动生成的适配器:

ArrayList<DrawerItem> dataList = new ArrayList<DrawerItem>();
dataList.add(new DrawerItem(getString(R.string.title_section1), R.drawable.ic_action_1));
dataList.add(new DrawerItem(getString(R.string.title_section2), R.drawable.ic_action_2));
dataList.add(new DrawerItem(getString(R.string.title_section3), R.drawable.ic_action_3));

mDrawerListView.setAdapter(new CustomDrawerAdapter(
        getActivity(),
        R.layout.custom_drawer_item,
        dataList));
Run Code Online (Sandbox Code Playgroud)

请记住替换R.string.title_sectionNR.drawable.ic_action_N您自己的资源.


ama*_*Bit 7

一旦您知道如何实现它,您就可以轻松自定义Android Navigation抽屉.这是一个很好的教程,您可以在其中进行设置.

这将是你的mainXML的结构:

<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" />

    <!-- Listview to display slider menu -->
    <ListView
        android:id="@+id/list_slidermenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice"
        android:divider="@color/list_divider"
        android:dividerHeight="1dp"        
        android:listSelector="@drawable/list_selector"
        android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

您可以通过添加标题来自定义此列表视图.和radiobuttons.