2014-02-15 4 views
34

Привет Я пытаюсь создать навигационный ящик, похожий на gmail app navigation drawer. Я следую за сайтом разработчика, но он указывает только на базовую реализацию. Но мне нужно настроить навигацию в соответствии с моими спецификациями.Как создать пользовательский навигационный ящик в android

  1. Мне нужно добавить заголовок категоризации элемента списка в Ящике
  2. мне нужна переключатель, чтобы выбрать некоторые из моих вариантов

Как я могу это сделать?

ответ

49

Учебник Android Custom Navigation Drawer содержит в пользовательского проекта основного и. Последнее показывает, как настроить панель навигации, как показано на скриншоте:

NavigationDrawerCustom

source code of the projects доступен для загрузки.


также Navigation Drawer - Live-O проект ...

Navigation Drawer - Live-O

source code of the project доступен на GitHub.


MaterialDrawer library стремится обеспечить самый простой из возможных вариантов реализации навигационного ящика для вашего приложения. Он обеспечивает большое количество настроек в ящике, а также включает простой в использовании заголовок, который можно использовать как AccountSwitcher.

MaterialDrawer library demo


Пожалуйста, обратите внимание, что Android-студия тем временем имеет шаблон проекта в создать панель навигации активность, как показано на скриншоте.

Navigation Drawer Activity

Это repository отслеживает изменения, вносимые в шаблон.

+0

У меня схожая и странная проблема: http://stackoverflow.com/questions/24863616/background-image-and-image-view-in-navigation-drawer/: мне удалось получить рабочий ящик, но у меня есть несколько ошибок. Не знаете, как это исправить? – TheDevMan

+0

OK! Я знаю, что могу сделать это просто в андроид-студии, но как насчет того, чтобы изменить шрифт ящика для навигации? –

+0

@AmirH Пожалуйста, выберите новый вопрос в Stackoverflow. – JJD

1

Мне нужно добавить заголовок, чтобы категоризировать элемент списка в Ящиком

Настроить listView или использовать expandableListView

Мне нужен переключатель, чтобы выбрать некоторые из моих вариантов

Вы можете сделать это без изменения текущей реализации NavigationDrawer, вам просто нужно создать пользовательский адаптер для вашего listView. Вы можете добавить родительский макет как Drawer, тогда вы можете выполнять любые сложные макеты внутри этого как обычно.

+0

Пожалуйста, не используйте код тегов для текста, который не является кодом. В этом случае вы должны использовать blockquotes с символом больше, чем sign '>' like this> Это цитата. 'Посмотрите на странице справки по форматированию (http://stackoverflow.com/help/formatting) – josaphatv

5

Вы можете легко настроить ящик для навигации Android, как только вы знаете, как его реализовано. вот хороший tutorial, где вы можете настроить его.

Это будет структура вашего 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> 

Вы можете настроить этот ListView по своему вкусу, добавив заголовок. И радиолюбители.

0

Если вы используете Android Studio, он предоставляет очень простой инструмент для создания Activity с помощью навигационного ящика.

правой кнопкой мыши на вашем пакете, перейдите New | Activity | Navigation Drawer Activity

enter image description here

Вы можете назвать это BaseActivity так что любое действие, которое необходимо иметь навигационное ящик будет просто расширить его (если предположить, что активность действительно уже не распространяется другой класс). Для расширения деятельности см. this.

если вы запустите приложение, это то, что вы получите:

enter image description here

С этого момента, все, что вам нужно настроить элементы на ящик и добавить содержимое в main content view будет следовать official documentation или любой по вашему выбору.

9

Чем проще решением для меня было:

соображения:

  • Это решение требует автоматически генерируемой панель навигации активности предоставленной Android Studio.
  • Классы DrawerItem, CustomDrawerAdapter и макет custom_drawer_item.xml взяты с this tutorial.

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; 
    } 
} 

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> 

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; 
} 
} 

4. В сгенерированном NavigationDrawerFragment классе onCreateView метода, замените адаптер автоматически сформированный для этого:

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)); 

Помните заменить R.string.title_sectionN и R.drawable.ic_action_N для своих собственных ресурсов.

1

Android Навигация Ящика с помощью Активность Я просто следовал примеру: http://antonioleiva.com/navigation-view/

Вам просто нужно немного настройки:

public class MainActivity extends AppCompatActivity { 

public static final String AVATAR_URL = "http://lorempixel.com/200/200/people/1/"; 


private DrawerLayout drawerLayout; 
private View content; 
private Toolbar toolbar; 
private NavigationView navigationView; 
private ActionBarDrawerToggle drawerToggle; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dashboard); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    initToolbar(); 
    setupDrawerLayout(); 

    content = findViewById(R.id.content); 
    drawerToggle = setupDrawerToggle(); 
    final ImageView avatar = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.avatar); 
    Picasso.with(this).load(AVATAR_URL).transform(new CircleTransform()).into(avatar); 


} 


private void initToolbar() { 
    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    final ActionBar actionBar = getSupportActionBar(); 

    if (actionBar != null) { 
     actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 
private ActionBarDrawerToggle setupDrawerToggle() { 
    return new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); 
} 

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

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggles 
    drawerToggle.onConfigurationChanged(newConfig); 
} 
private void setupDrawerLayout() { 

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    navigationView = (NavigationView) findViewById(R.id.navigation_view); 

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(MenuItem menuItem) { 

      int id = menuItem.getItemId(); 

      switch (id) { 
       case R.id.drawer_home: 
        Intent i = new Intent(getApplicationContext(), MainActivity.class); 
        startActivity(i); 
        finish(); 
        break; 
       case R.id.drawer_favorite: 
        Intent j = new Intent(getApplicationContext(), SecondActivity.class); 
        startActivity(j); 
        finish(); 
        break; 

      } 


     return true; 
    } 
}); 

} Вот XML Layout

<android.support.v4.widget.DrawerLayout 
android:id="@+id/drawer_layout" 
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:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".MainActivity"> 

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 



    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      app:layout_scrollFlags="scroll|enterAlways|snap" /> 

    </android.support.design.widget.AppBarLayout> 



</FrameLayout> 

<android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/drawer_header" 
    app:menu="@menu/drawer"/> 

Добавить drawer.xml в меню

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

<group 
    android:checkableBehavior="single"> 

    <item 
     android:id="@+id/drawer_home" 
     android:checked="true" 
     android:icon="@drawable/ic_home_black_24dp" 
     android:title="@string/home"/> 

    <item 
     android:id="@+id/drawer_favourite" 
     android:icon="@drawable/ic_favorite_black_24dp" 
     android:title="@string/favourite"/> 
    ... 

    <item 
     android:id="@+id/drawer_settings" 
     android:icon="@drawable/ic_settings_black_24dp" 
     android:title="@string/settings"/> 

</group> 

Чтобы открыть и закрыть ящик добавить эти значения в string.xml

<string name="drawer_open">Open</string> 
<string name="drawer_close">Close</string> 

drawer.xml

enter code here 

<ImageView 
    android:id="@+id/avatar" 
    android:layout_width="64dp" 
    android:layout_height="64dp" 
    android:layout_margin="@dimen/spacing_large" 
    android:elevation="4dp" 
    tools:src="@drawable/ic_launcher"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/email" 
    android:layout_marginLeft="@dimen/spacing_large" 
    android:layout_marginStart="@dimen/spacing_large" 
    android:text="Username" 
    android:textAppearance="@style/TextAppearance.AppCompat.Body2"/> 
<TextView 
    android:id="@+id/email" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginLeft="@dimen/spacing_large" 
    android:layout_marginStart="@dimen/spacing_large" 
    android:layout_marginBottom="@dimen/spacing_large" 
    android:text="[email protected]" 
    android:textAppearance="@style/TextAppearance.AppCompat.Body1"/> 

11

Я использовал ниже макет и смог выполнить пользовательский макет в режиме навигации.

<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> 
0

MainActivity.java

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener { 

private static final String Database_Path = "p_db/toko"; 
private static final String Database_Path_Sales = "p_db/sales"; 
private DatabaseReference mDatabaseReference; 
private String verified = "0"; 
private Timer timer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); 
    mToolbar.setTitle(""); 
    setSupportActionBar(mToolbar); 

    FragmentDrawer drawerFragment = (FragmentDrawer) 
      getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); 
    drawerFragment.setDrawerListener(this); 

    final TextView userEmail = (TextView)findViewById(R.id.userEmail); 
    if(FirebaseAuth.getInstance().getCurrentUser() != null){ 
     try { 
      userEmail.setText("Hai, " + FirebaseAuth.getInstance().getCurrentUser().getDisplayName()); 
      if(userEmail.getText().toString().contains("To")) { 
       getInfoToko(FirebaseAuth.getInstance().getCurrentUser().getEmail()); 
      }else if(userEmail.getText().toString().contains("Sales")){ 
       getInfoSales(FirebaseAuth.getInstance().getCurrentUser().getEmail()); 
      } 
     }catch (NullPointerException e){ 
      e.printStackTrace(); 
     } 
    }else{ 
     userEmail.setText(""); 
    } 
} 

@Override 
public void onDrawerItemSelected(View view, int position) { 
    displayView(position); 
} 

private void displayView(int position) { 
    if(FirebaseAuth.getInstance().getCurrentUser() != null) { 
     if(FirebaseAuth.getInstance().getCurrentUser().getDisplayName().contains("To")) { 
      switch (position) { 
       case 0: 
        if (verified.contains("1")) { 
         Intent ii = new Intent(this, UploadActivity.class); 
         startActivity(ii); 
        } else { 
         AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this, R.style.AppCompatAlertDialogStyle); 
         alertDialogBuilder 
           .setTitle("Title") 
           .setMessage("Message") 
           .setCancelable(false) 
           .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
            public void onClick(DialogInterface dialog, int id) { 
             dialog.dismiss(); 
            } 
           }); 
         final AlertDialog alertDialog = alertDialogBuilder.create(); 
         alertDialog.show(); 

         TextView pesan = (TextView) alertDialog.findViewById(android.R.id.message); 
         pesan.setTextSize(15); 

         Button b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
         b.setTextColor(getResources().getColor(R.color.colorPrimary)); 
        } 
        break; 
       case 1: 
        Intent iii = new Intent(this, KatalogActivity.class); 
        startActivity(iii); 
        break; 
       case 2: 
        Intent akun = new Intent(this, AkunMenuActivity.class); 
        startActivity(akun); 
        break; 
       case 3: 
        Intent bantuan = new Intent(this, HelpActivity.class); 
        startActivity(bantuan); 
        break; 
       case 4: 
        Intent tentang = new Intent(this, TentangActivity.class); 
        startActivity(tentang); 
        break; 
       case 5: 
        logout(); 
        break; 
       default: 
        break; 
      } 
     }else if(FirebaseAuth.getInstance().getCurrentUser().getDisplayName().contains("Sales")) { 
      switch (position) { 
       case 0: 
        Intent lT = new Intent(this, DaftarTokoActivity.class); 
        startActivity(lT); 
        break; 
       case 1: 
        Intent akun = new Intent(this, AkunMenuActivity.class); 
        startActivity(akun); 
        break; 
       case 2: 
        Intent bantuan = new Intent(this, HelpActivity.class); 
        startActivity(bantuan); 
        break; 
       case 3: 
        Intent tentang = new Intent(this, TentangActivity.class); 
        startActivity(tentang); 
        break; 
       case 4: 
        logout(); 
        break; 
       default: 
        break; 
      } 
     } 
    }else{ 
     switch (position) { 
      case 0: 
       Intent i = new Intent(this, LoginActivity.class); 
       startActivity(i); 
       break; 
      case 1: 
       Intent nt = new Intent(this, NearestTokoActivity.class); 
       startActivity(nt); 
       break; 
      case 2: 
       Intent lT = new Intent(this, DaftarTokoActivity.class); 
       startActivity(lT); 
       break; 
      case 3: 
       Intent bantuan = new Intent(this, HelpActivity.class); 
       startActivity(bantuan); 
       break; 
      case 4: 
       Intent tentang = new Intent(this, TentangActivity.class); 
       startActivity(tentang); 
       break; 
      default: 
       break; 
     } 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    timer.cancel(); 
} 

private void getInfoToko(String namaToko){ 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference(Database_Path); 
    Query searchQuery = mDatabaseReference.orderByChild("info/email").equalTo(namaToko); 
    searchQuery.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Iterable<DataSnapshot> snapshotIterator = dataSnapshot.getChildren(); 
      Iterator<DataSnapshot> iterator = snapshotIterator.iterator(); 
      TokoUpload infoToko = new TokoUpload(); 
      while((iterator.hasNext())){ 
       infoToko = iterator.next().getValue(TokoUpload.class); 
      } 
      verified = infoToko.getVerified(); 
     } 
    }); 
} 

private void getInfoSales(String namaSales){ 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference(Database_Path_Sales); 
    Query searchQuery = mDatabaseReference.orderByChild("info/emailSales").equalTo(namaSales); 
    searchQuery.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      Iterable<DataSnapshot> snapshotIterator = dataSnapshot.getChildren(); 
      Iterator<DataSnapshot> iterator = snapshotIterator.iterator(); 
      SalesUpload infoSales = new SalesUpload(); 
      while((iterator.hasNext())){ 
       infoSales = iterator.next().getValue(SalesUpload.class); 
      } 
      verified = infoSales.getVerified(); 
     } 
    }); 
    } 
} 

FragmentDrawer.java

public class FragmentDrawer extends Fragment { 

private ActionBarDrawerToggle mDrawerToggle; 
private DrawerLayout mDrawerLayout; 
private View containerView; 
private static String[] titles = null; 
private static String[] titles_login = null; 
private static String[] titles_sales = null; 

private FragmentDrawerListener drawerListener; 
private static TypedArray navMenuIcons; 
private static TypedArray navMenuIcons_login; 
private static TypedArray navMenuIcons_sales; 

public FragmentDrawer() { 
} 

public void setDrawerListener(FragmentDrawerListener listener) { 
    this.drawerListener = listener; 
} 

private static List<NavDrawerItem> getData() { 
    List<NavDrawerItem> data = new ArrayList<>(); 

    if(FirebaseAuth.getInstance().getCurrentUser() != null) { 
     if(FirebaseAuth.getInstance().getCurrentUser().getDisplayName().contains("Toko")) { 
      for (int i = 0; i < titles_login.length; i++) { 
       NavDrawerItem navItem = new NavDrawerItem(); 
       navItem.setTitle(titles_login[i]); 
       navItem.setIcon(navMenuIcons_login.getResourceId(i, i)); 
       data.add(navItem); 
      } 
     }else if(FirebaseAuth.getInstance().getCurrentUser().getDisplayName().contains("Sales")) { 
      for (int i = 0; i < titles_sales.length; i++) { 
       NavDrawerItem navItem = new NavDrawerItem(); 
       navItem.setTitle(titles_sales[i]); 
       navItem.setIcon(navMenuIcons_sales.getResourceId(i, i)); 
       data.add(navItem); 
      } 
     } 
    }else { 
     for (int i = 0; i < titles.length; i++) { 
      NavDrawerItem navItem = new NavDrawerItem(); 
      navItem.setTitle(titles[i]); 
      navItem.setIcon(navMenuIcons.getResourceId(i, i)); 
      data.add(navItem); 
     } 
    } 
    return data; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels); 
    titles_login = getActivity().getResources().getStringArray(R.array.nav_drawer_labels_login); 
    titles_sales = getActivity().getResources().getStringArray(R.array.nav_drawer_sales); 
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons); 
    navMenuIcons_login = getResources().obtainTypedArray(R.array.nav_drawer_icons_login); 
    navMenuIcons_sales = getResources().obtainTypedArray(R.array.nav_drawer_icons_sales); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); 
    RecyclerView recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList); 

    NavigationDrawerAdapter adapter = new NavigationDrawerAdapter(getActivity(), getData()); 
    recyclerView.setAdapter(adapter); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
      drawerListener.onDrawerItemSelected(view, position); 
      mDrawerLayout.closeDrawer(containerView); 
     } 

     @Override 
     public void onLongClick(View view, int position) { 

     } 
    })); 

    return layout; 
} 


public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) { 
    containerView = getActivity().findViewById(fragmentId); 
    mDrawerLayout = drawerLayout; 
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) { 
     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      getActivity().invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      getActivity().invalidateOptionsMenu(); 
     } 

     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, slideOffset); 
      toolbar.setAlpha(1 - slideOffset/2); 
     } 
    }; 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 

} 

public interface ClickListener { 
    void onClick(View view, int position); 

    void onLongClick(View view, int position); 
} 

static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

    private final GestureDetector gestureDetector; 
    private final ClickListener clickListener; 

    public RecyclerTouchListener(FragmentActivity context, final RecyclerView recyclerView, final ClickListener clickListener) { 
     this.clickListener = clickListener; 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if (child != null && clickListener != null) { 
        clickListener.onLongClick(child, recyclerView.getChildPosition(child)); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 

     View child = rv.findChildViewUnder(e.getX(), e.getY()); 
     if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
      clickListener.onClick(child, rv.getChildPosition(child)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

public interface FragmentDrawerListener { 
    void onDrawerItemSelected(View view, int position); 
} 
} 

NavDrawerItem.java

public class NavDrawerItem { 
private boolean showNotify; 
private String title; 
private int icon; 


public NavDrawerItem() { 

} 

public NavDrawerItem(boolean showNotify, String title, int icon) { 
    this.showNotify = showNotify; 
    this.title = title; 
    this.icon = icon; 
} 

public boolean isShowNotify() { 
    return showNotify; 
} 

public void setShowNotify(boolean showNotify) { 
    this.showNotify = showNotify; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public int getIcon() { 
    return icon; 
} 

public void setIcon(int icon) { 
    this.icon = icon; 
} 

} 

NavigationDrawerAdapter.java

public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> { 
private List<NavDrawerItem> data = Collections.emptyList(); 
private LayoutInflater inflater; 

public NavigationDrawerAdapter(Context context, List<NavDrawerItem> data) { 
    inflater = LayoutInflater.from(context); 
    this.data = data; 
} 

public void delete(int position) { 
    data.remove(position); 
    notifyItemRemoved(position); 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.nav_drawer_row, parent, false); 
    return new MyViewHolder(view); 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    NavDrawerItem current = data.get(position); 
    holder.title.setText(current.getTitle()); 
    holder.icon.setImageResource(current.getIcon()); 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView title; 
    ImageView icon; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     title = (TextView) itemView.findViewById(R.id.title); 
     icon = (ImageView) itemView.findViewById(R.id.icon); 
    } 
} 
} 

fragment_navigation_drawer.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:background="@android:color/white"> 


<RelativeLayout 
    android:id="@+id/nav_header_container" 
    android:layout_width="match_parent" 
    android:layout_height="160dp" 
    android:layout_alignParentTop="true" 
    android:background="@drawable/backdrop_protoko"> 

    <ImageView 
     android:id="@+id/userProf" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:src="@drawable/ic_profile" 
     android:layout_centerInParent="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="20dp"/> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/userEmail" 
     android:textColor="#fff" 
     android:layout_marginTop="10dp" 
     android:textAlignment="center" 
     android:layout_below="@id/userProf" 
     android:textSize="16sp"/> 

</RelativeLayout> 


<android.support.v7.widget.RecyclerView 
    android:id="@+id/drawerList" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/nav_header_container" 
    android:layout_marginTop="15dp" /> 
</RelativeLayout> 

nav_drawer_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="?attr/selectableItemBackground" 
android:focusable="true" 
android:clickable="true"> 

<ImageView 
    android:id="@+id/icon" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="10dp" 
    android:layout_marginStart="10dp" 
    android:layout_marginEnd="5dp" 
    android:scaleType="fitXY"/> 
<TextView 
    android:paddingBottom="17dp" 
    android:id="@+id/title" 
    android:layout_toEndOf="@id/icon" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="15dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginStart="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginEnd="5dp" 
    android:textSize="14sp" 
    android:textColor="#000" /> 
</RelativeLayout> 

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="45dp" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:background="@color/colorPrimary" 
app:titleTextColor="#fff"> 

<ImageView 
    android:layout_width="90dp" 
    android:layout_height="25dp" 
    android:src="@drawable/textlogo"/> 

</android.support.v7.widget.Toolbar> 

строки.XML

<resources> 
<string name="app_name">Lat1</string> 

<string name="nav_item_masuk">Masuk</string> 
<string name="nav_item_daftar_toko">Daftar Toko</string> 
<string name="nav_item_toko">Toko Terdekat</string> 
<string name="nav_item_pasang">Pasang Promo</string> 
<string name="nav_item_katalog">Katalog Promoku</string> 
<string name="nav_item_akun">Akun Saya</string> 
<string name="nav_item_bantuan">Pusat Bantuan</string> 
<string name="nav_item_tentang">Tentang Aplikasi</string> 
<string name="nav_item_keluar">Keluar</string> 
<string name="drawer_open">Open</string> 
<string name="drawer_close">Close</string> 

<string-array name="nav_drawer_labels"> 
    <item>@string/nav_item_masuk</item> 
    <item>@string/nav_item_toko</item> 
    <item>@string/nav_item_daftar_toko</item> 
    <item>@string/nav_item_bantuan</item> 
    <item>@string/nav_item_tentang</item> 
</string-array> 

<string-array name="nav_drawer_labels_login"> 
    <item>@string/nav_item_pasang</item> 
    <item>@string/nav_item_katalog</item> 
    <item>@string/nav_item_akun</item> 
    <item>@string/nav_item_bantuan</item> 
    <item>@string/nav_item_tentang</item> 
    <item>@string/nav_item_keluar</item> 
</string-array> 

<string-array name="nav_drawer_sales"> 
    <item>@string/nav_item_daftar_toko</item> 
    <item>@string/nav_item_akun</item> 
    <item>@string/nav_item_bantuan</item> 
    <item>@string/nav_item_tentang</item> 
    <item>@string/nav_item_keluar</item> 
</string-array> 

<array name="nav_drawer_icons_login"> 
    <item>@drawable/sc_pasang</item> 
    <item>@drawable/sc_katalog</item> 
    <item>@drawable/sc_akun</item> 
    <item>@drawable/sc_bantuan</item> 
    <item>@drawable/sc_tentang</item> 
    <item>@drawable/sc_keluar</item> 
</array> 

<array name="nav_drawer_icons_sales"> 
    <item>@drawable/sc_list_toko</item> 
    <item>@drawable/sc_akun</item> 
    <item>@drawable/sc_bantuan</item> 
    <item>@drawable/sc_tentang</item> 
    <item>@drawable/sc_keluar</item> 
</array> 

<array name="nav_drawer_icons"> 
    <item>@drawable/sc_login</item> 
    <item>@drawable/sc_toko</item> 
    <item>@drawable/sc_list_toko</item> 
    <item>@drawable/sc_bantuan</item> 
    <item>@drawable/sc_tentang</item> 
</array> 

<string-array name="kategori"> 
    <item>Aneka Jenis Makanan</item> 
    <item>Aneka Jenis Minuman</item> 
    <item>Oleh-Oleh dan Cinderamata</item> 
    <item>Produk Rumah Tangga</item> 
    <item>Perlengkapan Anak</item> 
    <item>Alat Tulis Kantor</item> 
    <item>Perawatan Tubuh</item> 
    <item>Pakaian dan Aksesoris</item> 
    <item>Dapur dan Sembako</item> 
    <item>Peralatan Olahraga</item> 
    <item>Jenis Produk Lainnya</item> 
</string-array> 

<string-array name="urut"> 
    <item>Promo Terbaru</item> 
    <item>Promo Terlama</item> 
    <item>Jarak Terdekat</item> 
    <item>Harga (Rendah ke Tinggi)</item> 
    <item>Harga (Tinggi ke Rendah)</item> 
</string-array> 
</resources> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 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/drawer_layout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:clipToPadding="false"> 

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

      <android.support.design.widget.AppBarLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:layout_scrollFlags="scroll|enterAlways|snap" 
       android:clipToPadding="false"> 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" 
        android:background="@color/colorPrimary" 
        android:elevation="5dp"> 

        <include 
         android:id="@+id/toolbar" 
         layout="@layout/toolbar" /> 

       </LinearLayout> 
       <LinearLayout 
        android:layout_marginTop="5dp" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:focusable="true" 
        android:focusableInTouchMode="true"> 
        <SearchView 
         android:id="@+id/svCari" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:queryHint="Cari Promo" 
         android:background="@drawable/rounded_bg_white" 
         android:elevation="3dp" 
         android:searchIcon="@drawable/ic_search" 
         android:layout_marginLeft="10dp" 
         android:layout_marginRight="10dp" 
         android:layout_marginTop="5dp" 
         android:layout_marginBottom="5dp" 
         android:iconifiedByDefault="false"> 
        </SearchView> 
       </LinearLayout> 
       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:orientation="vertical"> 
        <android.support.design.widget.TabLayout 
         android:id="@+id/tab_layout" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_below="@+id/toolbar" 
         android:minHeight="?attr/actionBarSize" 
         app:tabIndicatorColor="#FFF" 
         app:tabSelectedTextColor="#FFF" 
         app:tabIndicatorHeight="5dp" 
         app:tabTextAppearance="@style/TabLayoutTextStyle"/> 
       </LinearLayout> 

      </android.support.design.widget.AppBarLayout> 

      <android.support.v4.view.ViewPager 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/vpTab" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 
     </LinearLayout> 
    </android.support.design.widget.CoordinatorLayout> 

    <fragment 
     android:id="@+id/fragment_navigation_drawer" 
     android:name="com.luckynuts.lat1.FragmentDrawer" 
     android:layout_width="260dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:layout="@layout/fragment_navigation_drawer" 
     tools:layout="@layout/fragment_navigation_drawer" /> 

</android.support.v4.widget.DrawerLayout> 
Смежные вопросы