Dalam
modul ini kita akan mempelajari bagaimana mengelola fragment
menggunakan navigasi drawer. Nantinya menu navigasi drawer diakses dengan cara
menggeser di sisi kiri layar (sliding menu). Hasil akhir yang diharapkan seperti gambar
di bawah ini.
3. Tambahkan beberapa atribut string dan nama ikon dalam strings.xml, sehingga
seperti berikut:
<resources>
<string name="app_name">Slider Menu</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="drawer_open">Slider Menu Opened</string>
<string name="drawer_close">Slider Menu Closed</string>
<!-- Nav Drawer Menu Items -->
<string-array name="nav_drawer_items">
<item>Home</item>
<item>Find People</item>
<item>Photos</item>
<item>Communities</item>
<item>Pages</item>
<item>What\'s Hot</item>
</string-array>
<!-- Nav Drawer List Item Icons -->
<!-- Keep them in order as the titles are in -->
<array name="nav_drawer_icons">
<item>@drawable/ic_home</item>
<item>@drawable/ic_people</item>
<item>@drawable/ic_photos</item>
<item>@drawable/ic_communities</item>
<item>@drawable/ic_pages</item>
<item>@drawable/ic_whats_hot</item>
</array>
<!-- Content Description -->
<string name="desc_list_item_icon">Item Icon</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>
4. Tambahkan aset warna dengan membuat file Values XML File dalam direktori
res/values. Sesuaikan isinya seperti berikut.
<resources>
<color name="list_item_title">#fff</color>
<color name="list_background">#303030</color>
<color name="list_background_pressed">#992416</color>
<color name="list_divider">#272727</color>
<color name="counter_text_bg">#626262</color>
<color name="counter_text_color">#c5c4c4</color>
</resources>
5. Untuk menggunakan navigasi drawer diperlukan penambahan library tambahan
yaitu support-v4 dan support-v7. Untuk menambahkan library tersebut, klik
File Project Structure App Dependencies + Library
Dependency pilih library support-v4 Ok. Lakukan langkah yang sama
untuk menambahkan support-v7.
6. Buka file layout utama (activity_main.xml) dan sesuaikan isinya seperti kode di
bawah ini. FrameLayout digunakan untuk menggantikan konten utama
menggunakan Fragments.
<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="start"
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>
7. Saat ini anda sudah membuat wadah untuk menempatkan navigasi drawer dan
fragment beserta sumber daya yang dibutuhkan. Debug aplikasi yang sudah
dibuah untuk memastikan tidak ada kesalahan.
android:state_activated="true"/>
</selector>
4. Setelah membuat tampilan untuk setiap item menu. Kita memerlukan file layout
yang mendefinisikan setiap baris menu. Buatlah file layout dengan nama
drawer_list_item.xml dalam direktori /res/layout/. Dalam file ini kita meletakkan
ikon, judul pada menu navigasi drawer.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/list_selector">
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/desc_list_item_icon"
android:src="@drawable/ic_home" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/icon"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingRight="40dp"
android:textAppearance="?
android:attr/textAppearanceListItemSmall"
android:textColor="@color/list_item_title" />
<TextView
android:id="@+id/counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
android:textColor="@color/counter_text_color" />
</RelativeLayout>
5. Setiap item menu terdiri dari tiga elemen yaitu ikon, judul dan counter. Untuk
menampilkan ketiga elemen tersebut perlu dibuat sebuah kelas model. Buatlah
package baru dengan nama model di dalam direktori
java/com.example.ds.slidingmenu. Dalam package model, buatlah kelas baru
dengan nama NavDrawerItem. Sesuaikan isinya seperti kode di bawah ini. Jika
anda tidak menginginkan menampilkan counter, maka anda dapat mengisinya
false.
package com.example.ds.slidingmenu.model;
public class NavDrawerItem {
private String title;
private int icon;
private String count = "0";
// boolean to set visiblity of the counter
private boolean isCounterVisible = false;
public NavDrawerItem() {
}
public NavDrawerItem(String title, int icon) {
this.title = title;
this.icon = icon;
}
public NavDrawerItem(String title, int icon, boolean isCounterVisible, String
count) {
this.title = title;
this.icon = icon;
this.isCounterVisible = isCounterVisible;
this.count = count;
}
public String getTitle() {
return this.title;
}
android.app.Activity;
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.ImageView;
android.widget.TextView;
java.util.ArrayList;
import com.example.ds.slidingmenu.R;
import com.example.ds.slidingmenu.model.NavDrawerItem;
/**
* Created by ds on 6/2/15.
*/
public class NavDrawerListAdapter extends BaseAdapter {
private Context context;
private ArrayList<NavDrawerItem> navDrawerItems;
public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem>
navDrawerItems){
this.context = context;
this.navDrawerItems = navDrawerItems;
}
@Override
public int getCount() {
return navDrawerItems.size();
}
@Override
public Object getItem(int position) {
return navDrawerItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.drawer_list_item, null);
}
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
TextView txtCount = (TextView) convertView.findViewById(R.id.counter);
imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
txtTitle.setText(navDrawerItems.get(position).getTitle());
// displaying count
// check whether it set visible or not
if(navDrawerItems.get(position).getCounterVisibility()){
txtCount.setText(navDrawerItems.get(position).getCount());
}else{
android.app.Activity;
android.content.res.Configuration;
android.content.res.TypedArray;
android.os.Bundle;
android.support.v4.widget.DrawerLayout;
android.support.v7.app.ActionBarDrawerToggle;
android.util.Log;
android.view.Menu;
android.view.MenuItem;
android.view.View;
android.widget.AdapterView;
android.widget.ListView;
java.util.ArrayList;
import com.example.ds.slidingmenu.adapter.NavDrawerListAdapter;
import com.example.ds.slidingmenu.model.NavDrawerItem;
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
}
}
/***
* Called when invalidateOptionsMenu() is triggered
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// if nav drawer is opened, hide the action items
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
8. Saat ini anda sudah membuat navigasi drawer dengan sebuah listview. Jalankan
aplikasi yang sudah dibuat, untuk memastikan langkah yang dikerjakan sudah
benar. Anda dapat membuka navigasi drawer dengan meng-klik pada ikon di
action bar atau dengan menggeser pada sisi kiri layar. Akan tetapi anda belum
dapat memilih menu dari daftar yang ditampilkan.
android.app.Fragment;
android.os.Bundle;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new FindPeopleFragment();
break;
case 2:
fragment = new PhotosFragment();
break;
case 3:
fragment = new CommunityFragment();
break;
case 4:
fragment = new PagesFragment();
break;
case 5:
fragment = new WhatsHotFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_container, fragment);
fragmentTransaction.commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
public void onFragmentInteraction(Uri uri){
//you can leave it empty
}
}
4. Sekarang jalankan aplikasi dan uji event klik pada listview. Anda akan
mendapatkan tampilan fragment sesuai dengan meu yang anda pilih.