Wednesday, May 11, 2016

Customized Row with SQLite & Edit , Delete Functionality --- Mini App

" Jai Saraswati Maa" 
Hi ... Dear All ..Today I am uploading a superb example of Customized List View with Edit & Delete Functionality on each Row - Reflecting with SQLite DataBase.

***** Please refer  first my previous post 

Registration & Login Simple One  


http://androidclue4u.blogspot.in/2016/04/registration-login-simple-one.html


**** It's Just a Mini App you can add such functionality with your App.
**** Please have a patience.

FirstName i am taken as userName for login Purpose.

Please check.
I am using Android Studio 1.5.1
Minimun SDK API 19
Target SDK API 23
Please Like us & put your valuable suggestions in comment box.

A. Output Screen Will be like ---
1.       First Screen on Which you have all options ... Please Register First 


2      Registration   Form   
      

3    Login Screen 
   


4    View All Saved data in a List with Buttons 
    


5   If you click on Edit so you can change First Name & Last Name  only ....
  





B.  All xml files are 
1.   activity_main.xml   

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

<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="com.exam.ravi.customlistwithbutton.MainActivity">

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Login"

        android:id="@+id/logBut"

        android:onClick="logUser"

        android:layout_alignParentTop="true"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="54dp" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="New User"

        android:id="@+id/newuserBut"

        android:onClick="registerUser"

        android:layout_below="@+id/logBut"

        android:layout_alignEnd="@+id/logBut"

        android:layout_marginTop="75dp" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="ViewAll"

        android:id="@+id/button2"

        android:layout_below="@+id/newuserBut"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="65dp"

        android:onClick="viewAll" />
</RelativeLayout>

2. loglay.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">

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/logUser"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true"

        android:layout_marginTop="54dp"

        android:hint="UserName"

        android:layout_alignParentEnd="true" />

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/logPass"        android:layout_below="@+id/logUser"

        android:layout_alignParentStart="true"

        android:layout_marginTop="40dp"

        android:hint="Password"

        android:inputType="textPassword"

        android:layout_alignEnd="@+id/logUser" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Login Me"

        android:id="@+id/button"

        android:layout_centerVertical="true"

        android:layout_centerHorizontal="true"

        android:onClick="loginUser" />
</RelativeLayout>

3. reguser.xml
<?xml version="1.0" encoding="utf-8"?>

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

    android:orientation="vertical" android:layout_width="match_parent"

    android:layout_height="match_parent">

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/fName"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true"

        android:layout_marginTop="58dp"

        android:hint="First Name"

        android:layout_alignParentEnd="true" />

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/lName"

        android:layout_below="@+id/fName"

        android:layout_alignParentStart="true"

        android:layout_marginTop="42dp"

        android:hint="Last Name"        android:layout_alignParentEnd="true" />

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:inputType="textPassword"

        android:ems="10"        android:id="@+id/userPass"

        android:layout_centerVertical="true"

        android:hint=" Password "        android:layout_alignParentStart="true"

        android:layout_alignParentEnd="true" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Register"

        android:id="@+id/regist"

        android:layout_below="@+id/userPass"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="50dp"

        android:onClick="regMe"/>
</RelativeLayout>

4. single_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="match_parent">
<LinearLayout    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"    >
   <LinearLayout       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:orientation="vertical"

       android:layout_weight="2">
    <TextView        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textAppearance="?android:attr/textAppearanceLarge"

        android:text="Large Text"

        android:id="@+id/textFname"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true" />

    <TextView        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textAppearance="?android:attr/textAppearanceLarge"

        android:text="Large Text"

        android:id="@+id/textLname"

        android:layout_below="@+id/textView"

        android:layout_alignParentStart="true" />
   </LinearLayout>
      <LinearLayout

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:orientation="horizontal">
          <Button           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:layout_weight="1"

           android:text="Delete"

           android:id="@+id/rowDel"/>
          <Button              android:layout_width="wrap_content"

              android:layout_height="wrap_content"

              android:layout_weight="1"

              android:text="Edit"              android:id="@+id/rowEdit"/>

      </LinearLayout>
</LinearLayout>
</RelativeLayout>

5. viewalllay.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">

    <ListView        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/listView"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true" />
</RelativeLayout>

6. edit_lay.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">
    <EditText

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/fChname"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true"

        android:layout_marginTop="58dp"

        android:hint="First Name"        android:layout_alignParentEnd="true" />

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/lChname"

        android:hint="Last Name"

        android:layout_below="@+id/fChname"

        android:layout_alignParentStart="true"

        android:layout_marginTop="60dp"

        android:layout_alignParentEnd="true" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Change"

        android:id="@+id/chButton"

        android:layout_below="@+id/lChname"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="77dp" />
</RelativeLayout>
C. Java Code 
1.   MainActivity.java is as 
package com.exam.ravi.customlistwithbutton;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends AppCompatActivity {

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

    }
   public void logUser(View view)
    {
        startActivity(new Intent(this, Login.class));
    }


    public void  registerUser(View view)
      {
        startActivity(new Intent(this,RegUser.class));
      }
    public void  viewAll(View view)
    {
        startActivity(new Intent(this,ViewAll.class));
    }
}

2. Login.java 

package com.exam.ravi.customlistwithbutton;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class Login  extends AppCompatActivity {
    EditText EdLogUser, EdLogPass;
    String user, pass;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loglay);
        EdLogUser = (EditText) findViewById(R.id.logUser);
        EdLogPass = (EditText) findViewById(R.id.logPass);
    }

    public void loginUser(View view) {
        user = EdLogUser.getText().toString();
        pass = EdLogPass.getText().toString();
        MyHelp myHelp = new MyHelp(this);
        Cursor crob = myHelp.getInfo(myHelp);
        crob.moveToFirst();
        boolean logstatus = false;
        String NAME = "";
        do {
            if ((user.equals(crob.getString(0))) && (pass.equals(crob.getString(1)))) 
            {
                logstatus = true;
                NAME = crob.getString(0);
            }
        } while (crob.moveToNext());
        if (logstatus) {
         Toast.makeText(getBaseContext(), "Login Success .. . \n Welcome " + NAME, 
                           Toast.LENGTH_LONG).show();
           finish();
        } else {
        Toast.makeText(getBaseContext(), "Login Failed \n Please Check your detail",
                         Toast.LENGTH_LONG).show();
         finish();
        }
    }
}

3. RegUser.java  
package com.exam.ravi.customlistwithbutton;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class RegUser extends AppCompatActivity
{
   EditText EdFname,EdLname,EdPass;
    String sFname,sLname,sPass;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.reguser);
        EdFname = (EditText) findViewById(R.id.fName);
        EdLname = (EditText) findViewById(R.id.lName);
        EdPass = (EditText) findViewById(R.id.userPass);
    }
    public void regMe(View view)
    {
        sFname = EdFname.getText().toString();
        sLname = EdLname.getText().toString();
        sPass = EdPass.getText().toString();
        MyHelp myob = new MyHelp(this);
        myob.putInfo(myob, sFname, sLname,sPass);
        Toast.makeText(RegUser.this, "Registered Successfully....",
                                    Toast.LENGTH_SHORT).show();
        finish();

    }
}
4. ViewAll.java 
package com.exam.ravi.customlistwithbutton;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import java.util.ArrayList;

public class ViewAll  extends AppCompatActivity {
    ArrayList<DisInfo> showData;
    MyAdapter adapter;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewalllay);
        MyHelp myHelper = new MyHelp(this);
        showData= myHelper.getAllRows(myHelper);
        adapter= new MyAdapter(this,R.layout.single_row,showData);
        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);

    }
}

5. DisInfo.java 
package com.exam.ravi.customlistwithbutton;

/** * Created by Ravi on 4/28/2016. */public class DisInfo {
    String dis_fname;
    String dis_lname;
    String dis_pass;

    public String getDis_fname() {
        return dis_fname;
    }

    public void setDis_fname(String dis_fname) {
        this.dis_fname = dis_fname;
    }

    public String getDis_lname() {
        return dis_lname;
    }

    public void setDis_lname(String dis_lname) {
        this.dis_lname = dis_lname;
    }

    public String getDis_pass() {
        return dis_pass;
    }

    public void setDis_pass(String dis_pass) {
        this.dis_pass = dis_pass;
    }
}

6. Edit_Act.java   
package com.exam.ravi.customlistwithbutton;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Edit_Act  extends AppCompatActivity {

    Context context =this;
    EditText EdFName,EdLName,EdPass;
    String getFName,getLName,pass;
    Button change;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit_lay);
        EdFName = (EditText) findViewById(R.id.fChname);
        EdLName = (EditText) findViewById(R.id.lChname);
        Intent iget = getIntent();
        getFName = iget.getStringExtra("tit");
        getLName = iget.getStringExtra("des");
        pass = iget.getStringExtra("pass");
        EdFName.setText(getFName);
        EdLName.setText(getLName);
        change = (Button) findViewById(R.id.chButton);
        change.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v) {
                MyHelp myob = new MyHelp(context);
                myob.updateInfo(myob,pass,EdFName.getText().toString(),
                                   EdLName.getText().toString());
                Intent intent = new Intent(Edit_Act.this, ViewAll.class);
                startActivity(intent);
                finish();
            }
        });


    }
}

7. MyAdapter.java 

package com.exam.ravi.customlistwithbutton;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

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


public class MyAdapter extends ArrayAdapter<DisInfo> {

    Context context;
    String ret_fname,ret_lname,ret_pass;
    String newUser;
    int layoutResourceId;
    ArrayList<DisInfo> data = new ArrayList<DisInfo>();

    public MyAdapter(Context context, int layoutResourceId, ArrayList<DisInfo> data) 
    {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override

    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        Holder holder = null;
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new Holder();
            holder.txtTitle = (TextView)row.findViewById(R.id.textFname);
            holder.txtDesc = (TextView)row.findViewById(R.id.textLname);
            holder.butDel = (Button) row.findViewById(R.id.rowDel);
            holder.butEdit = (Button) row.findViewById(R.id.rowEdit);
            row.setTag(holder);
        }
        else        {
            holder = (Holder)row.getTag();
        }
        DisInfo picture = data.get(position);
        ret_fname = picture.dis_fname;
        ret_lname = picture.dis_lname;
        ret_pass = picture.dis_pass;
        holder.txtTitle.setText(ret_fname);
        holder.txtDesc.setText(ret_lname);
        holder.butDel.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v) {
                DisInfo picture = data.get(position);
                ret_fname = picture.dis_fname;
                ret_pass = picture.dis_pass;
                MyHelp myob = new MyHelp(context);
                myob.deleteUser(myob, ret_fname, ret_pass);
                Intent intent = new Intent(context, MainActivity.class);
                context.startActivity(intent);
            }
        });

        holder.butEdit.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v)
            {
                Intent iob = new Intent(context,Edit_Act.class);
                DisInfo picture = data.get(position);
                ret_fname = picture.dis_fname;
                ret_lname = picture.dis_lname;
                ret_pass = picture.dis_pass;
                iob.putExtra("tit", ret_fname);
                iob.putExtra("des",ret_lname);
                iob.putExtra("pass",ret_pass);
                context.startActivity(iob);
            }
        });
        return  row;
    }
    static class Holder
    {
        TextView txtTitle;
        TextView txtDesc;
        Button butDel,butEdit;

    }
}

8. MyHelp.java

package com.exam.ravi.customlistwithbutton;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

import java.util.ArrayList;


public class MyHelp  extends SQLiteOpenHelper {
    public static final String KEY_ID="_id";
    private static final String DB_NAME="cont.db";
    private static final String TAB_NAME="info";
    private static final int DB_VER=1;
    private static final  String CREATE_QUERY = "create table " + TAB_NAME + " ( " +
      KEY_ID +" integer primary key autoincrement, " +
     UserInfo.F_NAME + " text not null, " + UserInfo.L_NAME + " text not null, " +
                    UserInfo.PASS + " text not null);";

    Context ctx;
    public MyHelp(Context context)
    {
        super(context,DB_NAME,null,DB_VER);
        ctx=context;
    }
    @Override    public void onCreate(SQLiteDatabase sdb) {

        sdb.execSQL(CREATE_QUERY);
        Log.d("rrrr", "oncreate");
    }

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
       {
        db.execSQL("DROP TABLE IF EXISTS " + TAB_NAME);
        Log.d("rrrr", "onupgrade");
        onCreate(db);

    }
    public  void putInfo(MyHelp mob,String fname,String lname,String pass)
    {
        SQLiteDatabase SQ= mob.getWritableDatabase();
        ContentValues CV=new ContentValues();
        CV.put(UserInfo.F_NAME, fname);
        CV.put(UserInfo.L_NAME, lname);
        CV.put(UserInfo.PASS, pass);
        SQ.insert(TAB_NAME, null, CV);
    }
    public Cursor getInfo(MyHelp mob)
    {
        SQLiteDatabase SQ= mob.getWritableDatabase();
        String cols[]={UserInfo.F_NAME,UserInfo.PASS};
        Cursor CR= SQ.query(TAB_NAME,cols,null,null,null,null,null); 
        return  CR;
    }

    public void deleteUser(MyHelp mob,String username,String userpass)
    {
     String selection = UserInfo.F_NAME + " LIKE ? AND " + UserInfo.PASS + " LIKE ?";
        String args[]={username,userpass};
        SQLiteDatabase SQ = mob.getWritableDatabase();
        SQ.delete(TAB_NAME,selection,args);

    }
    public void updateInfo(MyHelp mob,String pass,
                                    String newuserFname,String newuserLname)
    {
        SQLiteDatabase SQ = mob.getWritableDatabase();
        String selection = UserInfo.PASS + " LIKE ? ";
        String args[]={pass};
        ContentValues CV = new ContentValues();
        CV.put(UserInfo.F_NAME,newuserFname);
        CV.put(UserInfo.L_NAME,newuserLname);
        SQ.update(TAB_NAME, CV, selection, args);

    }
    public ArrayList<DisInfo> getAllRows(MyHelp mob)
    {
        ArrayList<DisInfo> data = new ArrayList<DisInfo>();
        SQLiteDatabase SQ = mob.getReadableDatabase();
        String col[] = {UserInfo.F_NAME,UserInfo.L_NAME,UserInfo.PASS};
        Cursor cob = SQ.query(TAB_NAME,col,null,null,null,null,null);
        if(cob!=null)
        {
            cob.moveToFirst();
            do {
                DisInfo displayData = new DisInfo();
                displayData.setDis_fname(cob.getString(0));
                displayData.setDis_lname(cob.getString(1));
                displayData.setDis_pass(cob.getString(2));
                data.add(displayData);
            }while(cob.moveToNext());
        }
        Toast.makeText(ctx, "Retrieved", Toast.LENGTH_LONG).show();

        return data;
    }
}

9. UserInfo.java 
package com.exam.ravi.customlistwithbutton;


public class UserInfo {
     public static final String F_NAME = "f_name";
    public static final  String L_NAME = "l_name";
    public static final  String PASS = "pass";
} 

Tuesday, May 10, 2016

Swap Tabs / ViewPagers in Android

" Jai Saraswati Maa" 
Hi ... Dear All ..Today I am uploading a superb example of  Swap Tabs using View Pagers.
This example you can add with your app to give a look like our Phone Dial App.
I am using Android Studio 1.5.1
Minimun SDK API 19
Target SDK API 23
Please Like us & put your valuable suggestions in comment box.
***** Add Dependency in build.gradle file 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'

    compile 'com.android.support:appcompat-v7:23.3.0'

    compile 'com.android.support:design:23.3.0'

    compile 'com.android.support:support-v4:23.3.0'}

A. ***** Create your own toolbar 
 My toolbar_lay.xml is as and add this with MainActivity Layout file 

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.Toolbar

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

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent" android:layout_height="wrap_content"

    android:background="?attr/colorPrimary"

    android:minHeight="?attr/actionBarSize"

    android:fitsSystemWindows="true"

    android:id="@+id/toolBar"

    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"    >
</android.support.v7.widget.Toolbar>

B. Output screen will be like this
a.     

b.    
    

c.
    

C. MainActivity.java is as 
1. Java Code 
package com.exam.ravi.swipetabsex1;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;

public class MainActivity extends AppCompatActivity {
    Toolbar toolbar;
    TabLayout tabLayout;
    ViewPager viewPager;
    PagerAdapter pagerAdapter;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
        tabLayout = (TabLayout) findViewById(R.id.tabLay);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        pagerAdapter = new PagerAdapter(getSupportFragmentManager());
        pagerAdapter.addFrag(new Fragment1(), "Ravi");
        pagerAdapter.addFrag(new Fragment2(), "Kumar");
        pagerAdapter.addFrag(new Fragment3(), "Godara");
        viewPager.setAdapter(pagerAdapter);
        tabLayout.setupWithViewPager(viewPager);
    }
}

2. Its Layout file activity_main.xml is as 

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

<RelativeLayout    xmlns:app="http://schemas.android.com/apk/res-auto"

    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"

    tools:context="com.exam.ravi.swipetabsex1.MainActivity">
<android.support.design.widget.AppBarLayout

    android:layout_height="wrap_content"

    android:layout_width="match_parent"

    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >
    <include        android:layout_height="wrap_content"

        android:layout_width="match_parent"

        layout="@layout/toolbar_lay"        ></include>
    <android.support.design.widget.TabLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/tabLay"

        app:tabMode="fixed"        app:tabGravity="fill">
    </android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>
    <android.support.v4.view.ViewPager

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:id="@+id/viewpager">

    </android.support.v4.view.ViewPager>
</RelativeLayout>

D. View Pager Adapter is as PagerAdapter.java

package com.exam.ravi.swipetabsex1;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.ArrayList;
public class PagerAdapter extends FragmentPagerAdapter {

    ArrayList<Fragment> fragments = new ArrayList<>();
    ArrayList<String> tabTitles = new ArrayList<>();
    public void addFrag(Fragment fragments,String title)
    {
        this.fragments.add(fragments);
        this.tabTitles.add(title);
    }
    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override    public Fragment getItem(int position) {
        return fragments.get(position);
    }

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

    @Override    public CharSequence getPageTitle(int position) {
        return tabTitles.get(position);
    }
}

E. Fragments attached with tabs are as 
1. First Fragment Fragment1.java is as 

package com.exam.ravi.swipetabsex1;


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


/** * A simple {@link Fragment} subclass. */public class Fragment1 extends Fragment {


    public Fragment1() {
        // Required empty public constructor    }


    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_fragment1, container, false);
    }

}

2. Second Fragment is as Fragment2.java 

package com.exam.ravi.swipetabsex1;


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


/** * A simple {@link Fragment} subclass. */public class Fragment2 extends Fragment {


    public Fragment2() {
        // Required empty public constructor    }


    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_fragment2, container, false);
    }

}

3. Fragment Third is as 

package com.exam.ravi.swipetabsex1;


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


/** * A simple {@link Fragment} subclass. */public class Fragment3 extends Fragment {


    public Fragment3() {
        // Required empty public constructor    }


    @Override


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        return inflater.inflate(R.layout.fragment_fragment3, container, false);
    }

}

4. Fragment1 Layout file is as 
<FrameLayout 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"

    tools:context="com.exam.ravi.swipetabsex1.Fragment1">

      <TextView
        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:text="His Blog is androidclue4u.blodspot.in"

        android:gravity="center"

        android:textSize="30sp"/>

</FrameLayout>

5. Fragment2 Layout file is as 
<FrameLayout 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"

    tools:context="com.exam.ravi.swipetabsex1.Fragment2">

    <TextView        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:text="He is a Android Trainer"

        android:textSize="30sp"

        android:gravity="center"/>

</FrameLayout>

6. Fragment3 Layout file is as 

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

    tools:context="com.exam.ravi.swipetabsex1.Fragment3">

    <TextView        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:text="He is a i-Phone Trainer"

        android:textSize="30sp"

        android:gravity="center"/>

</FrameLayout>
  





Friday, May 6, 2016

Android Instrumentation Testing

" Jai Saraswati Maa" 
Hi ... Dear All ..Today I am uploading a superb example of Android Instrumentation Test.
It will l test your code with your emulator or physical device.
In MainActivity i am inserting simple text in edit text and on button click i will display text inserted into TextView.
Its also known as Activity Test. 
I am using Android Studio 1.5.1
Minimun SDK API 19
Target SDK API 23
Please Like us & put your valuable suggestions in comment box.
Just Read Carefully ........ There is some configuration tips required.
**** Nothing added in manifest file or build gradle file so don't worry its very easy.
********* See when you run this test your application runs and disappear.
A.  Layout will be like ....


  
B.    xml code   activity_main.xml

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

<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="com.exam.ravi.junittestex1.MainActivity">

    <EditText        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:id="@+id/editText"

        android:layout_alignParentTop="true"

        android:layout_alignParentStart="true"

        android:layout_alignParentEnd="true" />

    <Button        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Click Me"

        android:id="@+id/button"        android:layout_below="@+id/editText"

        android:layout_centerHorizontal="true"

        android:layout_marginTop="42dp"

        android:onClick="clickButton" />

    <TextView        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textAppearance="?android:attr/textAppearanceLarge"

        android:text="Large Text"

        android:id="@+id/textView"

        android:layout_centerVertical="true"

        android:layout_centerHorizontal="true" />
</RelativeLayout>

C.  Java code  MainActivity.java is as 

package com.exam.ravi.junittestex1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void clickButton(View view) {
        EditText editText =
                (EditText) findViewById(R.id.editText);

        String name = editText.getText().toString();
        String setData = String.format("Hello, %s!", name);

        TextView textView =
                (TextView) findViewById(R.id.textView);

        textView.setText(setData);
    }
}

*************  Now Test Procedure started .....

1.  Create a Java Class under androidTest Package to test your MainActivity
****** i had created MainActTest which is as 

package com.exam.ravi.junittestex1;

import android.test.ActivityInstrumentationTestCase2;
import android.test.TouchUtils;
import android.widget.Button;
import android.widget.TextView;

public class MainActTest extends ActivityInstrumentationTestCase2<MainActivity> {
    public MainActTest() {
        super(MainActivity.class);
    }

    public void testActivityExists() {
        MainActivity activity = getActivity();
        assertNotNull(activity);
    }
    public void testApply() {
        MainActivity activity = getActivity();
        getInstrumentation().waitForIdleSync();
        getInstrumentation().sendStringSync("Ravi");
        Button button =
                (Button) activity.findViewById(R.id.button);

        TouchUtils.clickView(this, button);
        TextView message = (TextView) activity.findViewById(R.id.textView);
        String actualText = message.getText().toString();
        assertEquals("Hello, Ravi!", actualText);

    }
} 
2.  How configure ......
step 1. Select Android Instrumentation Tests in Build Variant  as  

step 2. configure your AndroidTest Package using Edit Configuration with Run 


step 3 Run your Test 
3.1   Successful ..... when inserted and expected are same Text .... 


3.2   Failed ....  when inserted and expected are not same  Text .... 

   




Android Testing - JUnit Test

" Jai Saraswati Maa" 
Hi ... Dear All ..Today I am uploading a superb example of JUnit test.
JUnit test will test your code on JVM basis.
I had created one simple class NumAdder with a method addNumber which returns only addition of two numbers..

I am using Android Studio 1.5.1
Minimun SDK API 19
Target SDK API 23
Please Like us & put your valuable suggestions in comment box.
Just Read Carefully ........ There is some configuration tips required.
**** No layout file required for this example.
**** Nothing added in manifest file or build gradle file so don't worry its very easy.

A. My Java class look like this -  in my package

package com.exam.ravi.junittestex1;

public class NumAdder
{
 public static  int addNumber(int first,int second)
 {
     return first+second;
 }
}

B. My Test class .... i am using default created class by AndroidStudio
which is ExampleUnitTest.java  in test folder(with same package name).

package com.exam.ravi.junittestex1;

import org.junit.Test;
import static org.junit.Assert.*;
public class ExampleUnitTest {
    @Test    public void addition_isCorrect() throws Exception
    {
        int result = NumAdder.addNumber(2,3);
        assertEquals(5, result);
    }
}

C. How configure ..... 


step 1. please select option Unit Tests in build variant see below 
        



step 2. Edit Run configuration  like 

step 3. Run ExampleUnitTest and see the result 

1. successful ------ see It's Green  
 

2. Fail ---- Please change expected result and actual result in ExampleUnitTest