Monday, 22 September 2014

How to use navigation drawer in webview

By- Nitesh Kumar Mishra
In most of the android applications like Facebook, Google plus , Youtube, amazon kindle , true caller .. etc you have seen a side menu which appears on click of an icon on top left corner or by dragging on to the screen from left to right , so here in this tutorial we shall see how to create the sliding menu for you android application .





Now go to File-New -Android Application Project and give name as Navigation Drawer..

MainActivity.java 


package com.example.navigationdrawer;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends Activity {

String[] menutitles;
TypedArray menuIcons;
String[] pageUrl;

// nav drawer title
private CharSequence mDrawerTitle;
private CharSequence mTitle;

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private List<Row> rowItems;
private CustomAdapter adapter;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTitle = mDrawerTitle = getTitle();

menutitles = getResources().getStringArray(R.array.titles);
menuIcons = getResources().obtainTypedArray(R.array.icons);
pageUrl = getResources().getStringArray(R.array.pageurl);

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

rowItems = new ArrayList<Row>();

for (int i = 0; i < menutitles.length; i++) {
Row items = new Row(menutitles[i], menuIcons.getResourceId(
i, -1), pageUrl[i]);
rowItems.add(items);
}

menuIcons.recycle();

adapter = new CustomAdapter(getApplicationContext(), rowItems);

mDrawerList.setAdapter(adapter);

mDrawerList.setOnItemClickListener(new SlideitemListener());

// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.app_name,
R.string.app_name) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}

public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);

if (savedInstanceState == null) {
// on first time display view for first nav item
updateDisplay(0);

}
}

class SlideitemListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
updateDisplay(position);
}

}

private void updateDisplay(int position) {

String url = rowItems.get(position).getPageUrl();

Fragment fragment = new WebActivity();

Bundle bundle = new Bundle();
bundle.putString("url", url);

fragment.setArguments(bundle);

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();

setTitle(menutitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);

}

@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// toggle nav drawer on selecting action bar app icon/title
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action bar actions click
switch (item.getItemId()) {
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}

/***
* 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);
}

/**
* 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);
}


}

CustomAdapter.java

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.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter {

Context context;
List<Row> rowItem;

CustomAdapter(Context context, List<Row> rowItem) {
this.context = context;
this.rowItem = rowItem;
}

private class ViewHolder {
ImageView icon;
TextView title;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;
convertView = null;
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listitem, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.title = (TextView) convertView.findViewById(R.id.title);

Row row_pos = rowItem.get(position);
// setting the image resource and title
holder.icon.setImageResource(row_pos.getIcon());
holder.title.setText(row_pos.getTitle());
convertView.setTag(holder);

}
return convertView;

}

@Override
public int getCount() {
return rowItem.size();
}

@Override
public Object getItem(int position) {
return rowItem.get(position);
}

@Override
public long getItemId(int position) {
return rowItem.indexOf(getItem(position));
}


}

Row.java


public class Row {
private String title;
private int icon;
private String pageUrl;

public Row(String title, int icon, String pageUrl) {
this.title = title;
this.icon = icon;
this.pageUrl = pageUrl;
}

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

public String getPageUrl() {
return pageUrl;
}

public void setPageUrl(String pageUrl) {
this.pageUrl = pageUrl;
}


}

WebActivity.java

import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebActivity extends Fragment {

ProgressDialog mProgress;
WebView webview;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.web, container,
false);

Bundle bundle = getArguments();

String url = bundle.getString("url");

webview = (WebView) rootView.findViewById(R.id.webview1);

WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);

mProgress = ProgressDialog.show(getActivity(), "Loading",
"Please wait for a moment...");
webview.loadUrl(url);

webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);
return true;
}

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (mProgress.isShowing()) {
mProgress.dismiss();
}
}
});

return rootView;
}
}

Now in your xml files first go to 
res-values-string.xml and made following changes

string.xml



<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Navigation Drawer</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
<string name="imgdesc">imgdesc</string>
    <!-- Title -->
    <string-array name="titles">
        <item>SysWAY Technologies</item>
     
 <item>Facebook</item>
        <item>Twitter</item>
        <item>Google Plus</item>
        <item>Yahoo</item>
        <item>LinkedIn</item>
        <item>Blogger</item>
        <item>Wordpress</item>
    </string-array>
    <!-- Page Url -->
    <string-array name="pageurl">
        <item>http://www.swtinfo..com</item>
        <item>http://www.facebook.com</item>
        <item>https://twitter.com</item>
        <item>https://plus.google.com</item>
        <item>http://www.yahoo.com</item>
        <item>http://www.linkedin.com</item>
        <item>http://www.blogger.com</item>
        <item>http://www.wordpress.com</item>
    </string-array>
    <!-- Icons -->
    <array name="icons">
        <item>@drawable/facebook</item>
        <item>@drawable/facebook</item>
        <item>@drawable/twitter</item>
        <item>@drawable/googleplus</item>
        <item>@drawable/yahoo</item>
        <item>@drawable/linkedin</item>
        <item>@drawable/blogger</item>
        <item>@drawable/wordpress</item>
    </array>

</resources>

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="match_parent"
    android:layout_height="match_parent" >

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>
    <!-- The navigation drawer list -->

    <ListView
        android:id="@+id/slider_list"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ffffff"
        android:choiceMode="singleChoice"
        android:divider="#dddddd"
        android:dividerHeight="1dp" />

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

listitem.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="48dp"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/imgdesc" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="7dp"
        android:layout_toRightOf="@id/icon"
        android:gravity="center_vertical"
        android:textColor="#000000"
        android:textSize="20sp" />

</RelativeLayout>

web.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="match_parent" >

    <WebView
        android:id="@+id/webview1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true" />

</RelativeLayout>

In your manifest dont forget to use internet permission

<uses-permission android:name="android.permission.INTERNET" />


If you like this post then pls comment so that i could write more on android topics..





2 comments:

Anonymous said...

Nice Post

Anonymous said...

good one