Rabu, 25 Desember 2013

Tutorial : Fragment on Android

My definition about fragment on Android is add another view in current view but have different activity.
 for example :



step 1 :
create new project, with :
Application Name : FragmentExample
Project Name : FragmentExample
Package Name : com.example.fragmentexample

Minimum required SDK : API 14: Android 4.0 (IceCream Sandwich)

step 2 :
Create class DetailsFragmentActivity.java

step 3 :

Create new page. (right click on folder res -> layout, select New -> Others. Select Android Activity then next, and give name DetailsActivity, then finish). You can design page to give difference each page.

step 4 :
In activity_main.xml, add fragment element.

step 5 :
Create new class to activity of fragment (DetailsFragmentAcitvity.java)

Code :
activity_main.xml

<LinearLayout 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"
    android:background="#55000000"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <fragment
        android:id="@+id/fragmentLayout"
        android:name="com.example.fragmentexample.DetailsFragmentActivity"
        android:layout_width="fill_parent"
        android:layout_height="300dp"
        android:layout_marginTop="50dp" />

</LinearLayout>
activity_details.xml

 <RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="#55FF0000"
    tools:context=".DetailsActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
DetailsActivity.java (code for activity_details.xml when this is the page or standalone)

 package com.example.fragmentexample;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class DetailsActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.details, menu);
        return true;
    }

}


DetailsFragmentActivity.java (code for activity_details.xml when this is the fragment)

package com.example.fragmentexample;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class DetailsFragmentActivity extends Fragment {
  
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_details, container, false);
        return v;
    }
  
}



MainActivity.java (code for activity_main.xml)

package com.example.fragmentexample;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        DetailsFragmentActivity DetailAct = (DetailsFragmentActivity) getFragmentManager()
                .findFragmentById(R.id.fragmentLayout);
        if (DetailAct == null) {
            DetailAct = new DetailsFragmentActivity();
            getFragmentManager().beginTransaction()
                    .replace(R.id.fragmentLayout, DetailAct).commit();
        } else {

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
Happy Code !!!

Selasa, 24 Desember 2013

Tutorial : How to parsing XML on Android (standard)

For example data :

Package Name : com.example.xmllesson

Note : you will not see this result on your UI, you can see this result if you debug this code on MainActivity.java (there are have sign to you debug)











data xml to parsing : (in MainActivity, you will find method Dummy, so you dont need to copy this)

<friends>
    <friend id="0001">
        <name>
            <first>first_1</first>
            <middle>middle_1</middle>
            <last>last_1</last>
        </name>
        <photo url="http://www.example.com/friend1.jpg"/>
        <address>Friend Address 1</address>
    </friend>
   
    <friend id="0002">
        <name>
            <first>first_2</first>
            <middle>middle_2</middle>
            <last>last_2</last>
        </name>
        <photo url="http://www.example.com/friend2.jpg"/>
        <address>Friend Address 2</address>
    </friend>
</friends>


XMLDOMParser.java

package com.example.xmllesson;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class XMLDOMParser {

    public Document getDocument(InputStream inputStream) {
        Document document = null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = factory.newDocumentBuilder();
            InputSource inputSource = new InputSource(inputStream);
            document = db.parse(inputSource);
        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
        return document;
    }

    public String getValue(Element item, String name) {
        NodeList nodes = item.getElementsByTagName(name);
        return this.getTextNodeValue(nodes.item(0));
    }

    public String getTextNodeValue(Node node) {
        Node child;
        if (node != null) {
            if (node.hasChildNodes()) {
                child = node.getFirstChild();
                while(child != null) {
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        return child.getNodeValue();
                    }
                    child = child.getNextSibling();
                }
            }
        }
        return "";
    }
}


FriendModel.java

package com.example.xmllesson;

public class FriendModel {
   
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getFullname() {
        String fullname = "";
        if(!getFirst().equals(null))
            fullname = getFirst();
        if(!getMiddle().equals(null))
            fullname = fullname + " " + getMiddle();
        if(!getLast().equals(null))
            fullname = fullname + " " + getLast();
        return fullname;
    }

    public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getMiddle() {
        return middle;
    }
    public void setMiddle(String middle) {
        this.middle = middle;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }
    public String getPhoto() {
        return photo;
    }
    public void setPhoto(String photo) {
        this.photo = photo;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    private String id;
    private String first;
    private String middle;
    private String last;
    private String photo;
    private String address;


ParserXML.java

package com.example.xmllesson;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


public class ParserXML {
    private static final String NODE_FRIEND = "friend";
    private static final String ATTR_ID = "id";
    private static final String NODE_NAME = "name";
    private static final String NODE_FIRST = "first";
    private static final String NODE_MIDDLE = "middle";
    private static final String NODE_LAST = "last";
    private static final String NODE_PHOTO = "photo";
    private static final String ATTR_URL = "url";
    private static final String NODE_ADDRESS = "address";
    private static XMLDOMParser parser;
   
    public static ArrayList<FriendModel> Desrialize(String xmlString)
    {
        ArrayList<FriendModel> listFriend = new ArrayList<FriendModel>();
        parser = new XMLDOMParser();
        InputStream stream = new ByteArrayInputStream(xmlString.getBytes());
        Document doc = parser.getDocument(stream);
        NodeList nodeList = doc.getElementsByTagName(NODE_FRIEND);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element e = (Element) nodeList.item(i);
            FriendModel friend = new FriendModel();
           
            //<friend id="0001"> we will get : id = 0001
            friend.setId(e.getAttribute(ATTR_ID));
           
            //<first>first_1</first> we will get : first_1
            friend.setFirst(getTextNodeValueInNode(e, NODE_NAME, NODE_FIRST));
           
            //<middle>middle_1</middle> we will get : middle_1
            friend.setMiddle(getTextNodeValueInNode(e, NODE_NAME, NODE_MIDDLE));
           
            //<last>last_1</last> we will get : last_1
            friend.setLast(getTextNodeValueInNode(e, NODE_NAME, NODE_LAST));
           
            //<photo url="http://www.example.com/friend1.jpg"/> we will get : http://www.example.com/friend1.jpg
            friend.setPhoto(getAttributeInNodeItem(e, NODE_PHOTO, ATTR_URL));
           
            //<address>Friend Address 1</address> we will get : Friend Address 1
            friend.setAddress(parser.getValue(e, NODE_ADDRESS));
           
           
            listFriend.add(friend);
        }
        return listFriend;
    }

    private static String getTextNodeValueInNode(Element item, String nodeName, String subNodeName)
    {
        NodeList childs = item.getElementsByTagName(nodeName);
        Element element = (Element)childs.item(0);
        return parser.getValue(element, subNodeName);
    }
   
    private static String getAttributeInNodeItem(Element item, String name, String attrName)
    {
        NodeList childs = item.getElementsByTagName(name);
        return ((Element) childs.item(0))
                .getAttribute(attrName);
    }
}


MainActivity.java

package com.example.xmllesson;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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

        //debug here
        ArrayList<FriendModel> result = ParserXML.Desrialize(Dummy());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private String Dummy() {
        return "<friends>" + "    <friend id=\"0001\">" + "        <name>"
                + "            <first>first_1</first>" + "            <middle>middle_1</middle>"
                + "            <last>last_1</last>" + "        </name>"
                + "        <photo url=\"http://www.example.com/friend1.jpg\"/>"
                + "        <address>Friend Address 1</address>" + "    </friend>" + "    "
                + "    <friend id=\"0002\">" + "        <name>"
                + "            <first>first_2</first>" + "            <middle>middle_2</middle>"
                + "            <last>last_2</last>" + "        </name>"
                + "        <photo url=\"http://www.example.com/friend2.jpg\"/>"
                + "        <address>Friend Address 2</address>" + "    </friend>"
                + "</friends>";
    }
}




So, keep learning anything and keep spirit ^_^

Minggu, 22 Desember 2013

Tutorial - Make Androidhive Apps

You can download GSON Library here.

Example :

Source JSON from http://api.androidhive.info/contacts/

Application Name : Androidhive
Project Name : Androidhive
Package Name : com.lesson.androidhive

There are have 3 model data :

For DownloadString.java, you can see here.

PhoneModel.java

package com.lesson.androidhive.models;
public class PhoneModel {
    public String mobile;
    public String home;
    public String office;
}


ContactModel.java

package com.lesson.androidhive.models;
public class ContactModel {
    public String id;
    public String name;
    public String email;
    public String address;
    public String gender;
    public PhoneModel phone;
}


ResponseModel.java

package com.lesson.androidhive.models;
public class ResponseModel {
     public List<ContactModel> contacts;
}


ValueString.java

package com.lesson.androidhive.controls;

public class ValueString {
    public static final String MAIN_URL = "http://api.androidhive.info/contacts/";
}


item_person.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:background="#33FF0000"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="@string/example_id"
        android:textIsSelectable="false"
        android:textSize="12sp" />
   
    <TextView
        android:id="@+id/tv_name"
        android:layout_marginLeft="20dp"
        android:layout_below="@+id/tv_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="@string/example_id"
        android:textIsSelectable="false"
        android:textSize="12sp" />
   
    <TextView
        android:id="@+id/tv_email"
        android:layout_marginLeft="20dp"
        android:layout_below="@+id/tv_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="@string/example_id"
        android:textIsSelectable="false"
        android:textSize="12sp" />

</RelativeLayout>



activity_main.xml

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/postListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>



ContactAdapter.java 

package com.lesson.androidhive.adapters;

import java.util.List;
import com.lesson.androidhive.models.ContactModel;
import com.lesson.androidhive.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ContactAdapter extends ArrayAdapter<ContactModel> {
    private Context _context;
    private int _resource;
    private List<ContactModel> _contacts;
    public ContactAdapter(Context context, int resource,
            List<ContactModel> contacts) {
        super(context, resource, contacts);
        _context = context;
        _resource = resource;
        _contacts = contacts;
    }
   
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ContactHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = LayoutInflater.from(_context);

            row = inflater.inflate(_resource, parent, false);
            holder = new ContactHolder(row);
            row.setTag(holder);
        } else {
            holder = (ContactHolder) row.getTag();
        }

        holder.populateFrom(_contacts.get(position));

        return (row);
    }

   
    public static class ContactHolder {
        private TextView _tvID;
        private TextView _tvName;
        private TextView _tvEmail;
       
        ContactHolder(View row)
        {
            _tvID = (TextView)row.findViewById(R.id.tv_id);
            _tvName = (TextView)row.findViewById(R.id.tv_name);
            _tvEmail = (TextView)row.findViewById(R.id.tv_email);
        }
       
        void populateFrom(ContactModel contact)
        {
            _tvID.setText(contact.id);
            _tvName.setText(contact.name);
            _tvEmail.setText(contact.email);
        }
    }
}


MainActivity.java

package com.lesson.androidhive;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.lesson.androidhive.adapters.ContactAdapter;
import com.lesson.androidhive.controls.ValueString;
import com.lesson.androidhive.models.ResponseModel;
import com.lesson.androidhive.util.DownloadString;
import com.lesson.androidhive.util.DownloadString.DownloadProperties;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

    private ContactAdapter _contactAdapter;
    private ListView _lvContact;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
        _lvContact = (ListView)findViewById(R.id.postListView);
      
        DownloadString downloadString = new DownloadString();
        downloadString.setListener(new DownloadProperties() {
         
            @Override
            public void OnStart() {
                // TODO Auto-generated method stub
            }
         
            @Override
            public void OnProgress(int progress) {
                // TODO Auto-generated method stub
            }
         
            @Override
            public void OnCompleted(String result) {
                OnCompletedDownload(result);
            }
        });
        downloadString.execute(ValueString.MAIN_URL);

    }
  
    private void OnCompletedDownload(String result)
    {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("M/d/yy hh:mm a");
        Gson gson = gsonBuilder.create();
        ResponseModel contacts = gson.fromJson(result, ResponseModel.class);
        _contactAdapter = new ContactAdapter(getBaseContext(), R.layout.item_person, contacts.contacts);
        _lvContact.setAdapter(_contactAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}


AndroidManifest.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lesson.androidhive"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lesson.androidhive.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>





Using GSON to Deserialize JSON - Android

You can download GSON Library here.

Example :

Source JSON from http://api.androidhive.info/contacts/

There are have 3 model data :

PhoneModel.java

public class PhoneModel {
    public String mobile;
    public String home;
    public String office;
}


ContactModel.java

public class ContactModel {
    public String id;
    public String name;
    public String email;
    public String address;
    public String gender;
    public PhoneModel phone;
}


ResponseModel.java

public class ResponseModel {
     public List<ContactModel> contacts;
}


MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        DownloadString downloadString = new DownloadString();
        downloadString.setListener(new DownloadProperties() {
           
            @Override
            public void OnStart() {
                // TODO Auto-generated method stub
            }
           
            @Override
            public void OnProgress(int progress) {
                // TODO Auto-generated method stub
            }
           
            @Override
            public void OnCompleted(String result) {
                GsonBuilder gsonBuilder = new GsonBuilder();
                gsonBuilder.setDateFormat("M/d/yy hh:mm a");
                Gson gson = gsonBuilder.create();
                ResponseModel contacts = gson.fromJson(result, ResponseModel.class);
                //contacts is result JSON
            }
        });
        downloadString.execute("http://api.androidhive.info/contacts/");
       
    }



Sabtu, 14 Desember 2013

Download HTML Code menggunakan class turunan ASyncTask pada Android

Untuk men-download sebuah content dari halaman URL membutuhkan waktu koneksi. Jika koneksi internet pada device tidak terlalu cepat, maka akan dibutuhkan beberapa waktu. Sehingga, jika tidak menggunakan ASyncTask, maka akan menyebabkan nge-frezee-nya tampilan/halaman (tidak dapat digunakan). Maka dibutuhkan sebuah background service untuk menangani masalah ini.
Pada contoh berikut, digunakan sebuah class downloadstring.java, sehingga jika ada class lain yang akan men-download string dari URL lain, tinggal panggil.

public class DownloadString extends AsyncTask<String, Integer, String> {
    public DownloadString()
    {
       
    }


    public interface DownloadProperties {
        void OnStart();

        void OnProgress(int progress);

        void OnCompleted(String result);
    }

    private DownloadProperties _properties;

    public void setListener(DownloadProperties listener) {
        _properties = listener;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (_properties != null)
            _properties.OnStart();
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        publishProgress(0);
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(params[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..
        } catch (IOException e) {
            //TODO Handle problems..
        }
        return responseString;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if (_properties != null)
            _properties.OnProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (_properties != null)
            _properties.OnCompleted(result);
    }

}

Untuk penggunaannya :

DownloadString connection = new DownloadString();
        connection.setListener(new DownloadProperties() {

            @Override
            public void OnStart() {
                // TODO Auto-generated method stub

            }

            @Override
            public void OnProgress(int progress) {
                // TODO Auto-generated method stub

            }

            @Override
            public void OnCompleted(String results) {
                // TODO Auto-generated method stub
            }

                tv.setText(result);
            }
        });
        connection.execute("http://www.google.com");