অ্যান্ড্রয়েড ইন্টেন্টে অবজেক্ট লিস্ট পাস করা

অ্যান্ড্রয়েড ইনটেন্ট লেখাটিতে আমরা জেনেছি ইন্টেন্ট কি, কিভাবে একটা একটিভিটি থেকে আরেকটা অ্যাক্টিভিটি ওপেন করা যায়, এবং দেখেছি কিভাবে একটা অ্যাক্টিভিটি ত্থেকে আরেকটা অ্যাক্টিভিটিতে ডেটা পাস করা যায়। ঐখানে ডেটা বলছে আমরা সিম্পল স্ট্রিং পাস করেছি। যখন আমাদের অনেকগুলো ডেটা এক সাথে পাস করতে হবে, যেমন অ্যারে লিস্ট বা যে কোন অবজেক্ট লিস্ট, তখন কিভাবে ডেটা পাস করব? এই লেখাতে প্রথমে দেখব কিভাবে অ্যারে লিস্ট পাস করা যায়। এবং এরপর দেখব কিভাবে অবজেক্ট লিস্ট পাস করা যায়।

অ্যান্ড্রয়েড ইন্টেন্ট পুট অ্যারে লিস্ট

আমরা অ্যান্ড্রয়েড স্টুডিওতে একটা প্রজেক্ট তৈরি করে নিব। এরপর নতুন আরেকটা অ্যাক্টিভিটি যুক্ত করব যেমন ArraylistActivity। মেইন এক্টিভিটিতে একটা বাটন তৈরি করব। ঐ বাটনে ক্লিক লিচেনার যুক্ত করব। এরপর সেখানে আমরা ArraylistActivity অ্যাক্টিভিটি  ওপেন করার জন্য ইন্টেন্ট লিখব। বা বাটন থেকে সরাসরি আমরা যে কোন মেথড কল করতে পারি onClick এর মাধ্যমে। যেমন android:onClick=”openArrayListActivity”।

লিস্ট পাস করার জন্য আমাদের আগে একটা লিস্ট তৈরি করতে হবে। সিম্পল একটা লিস্ট তৈরি করে নিব। সিম্পল স্ট্রিং পাস করার জন্য আমরা লিখতাম putExtra, লিস্ট পাস করার জন্য আমরা লিখব putStringArrayListExtra। এভাবেঃ

  Intent intent = new Intent(this, ArraylistActivity.class);
  intent.putStringArrayListExtra("name_list", (ArrayList<String>) names);
  startActivity(intent);

অন্য এক্টিভিটিতে ডেটা রিসিভ করার জন্য লিখতে হবে এভাবেঃ

ArrayList<String> names = (ArrayList<String>)bundle.getStringArrayList("name_list");

রিসিভ করে এরপর আমরা আমাদের লিস্ট যে কোন ভাবে ব্যবহার করতে পারি। activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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" tools:context="me.jakir.listinintent.MainActivity">

    <Button android:id="@+id/button" android:layout_width="368dp" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" android:onClick="openArrayListActivity" android:text="Array List Activity" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

MainActivity.java:

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

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

public class MainActivity extends AppCompatActivity   {

    List<String> names = new ArrayList<String>();

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


        names.add("Bill Gates");
        names.add("Warren Buffett");
        names.add("Jeff Bezos");
        names.add("Mark Zuckerberg");

    }

    public void openArrayListActivity(View view){
        Intent intent = new Intent(this, ArraylistActivity.class);
        intent.putStringArrayListExtra("name_list", (ArrayList<String>) names);
        startActivity(intent);

    }
}

activity_arraylist.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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" tools:context="me.jakir.listinintent.ArraylistActivity">

    <TextView android:id="@+id/nameList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

ArrayListActivity.java

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

import java.util.ArrayList;

public class ArraylistActivity extends AppCompatActivity {

    TextView tvNameList;

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

        tvNameList = (TextView) findViewById(R.id.nameList);


        Bundle bundle = getIntent().getExtras();

        if(bundle!=null){
           ArrayList<String> names = (ArrayList<String>)bundle.getStringArrayList("name_list");


            for(String name: names){
                tvNameList.append(name + "\n");
            }

        }


    }
}

উপরের উদাহরণে আমরা লিস্ট হিসেবে একটা স্ট্রিং অ্যারে পাস করেছি। আমরা চাইলে ইন্টিজার অ্যারেও পাস করতে পারি। তার জন্য লিখতে হবে putIntegerArrayListExtra… আর রিসিভ করার জন্য লিখতে হবে getIntegerArrayList। এবার আমরা দেখব কিভাবে একটা অবজেক্ট লিস্ট পাস করা যায়। অবজেক্ট লিস্ট পাস করতে হলে তাকে আগে সিরিয়ালাইজ করে নিতে হয়। আর সিরিয়ালাইজ করার জন্য দুইটা পদ্ধতি আমরা ব্যবহার করতে পারি। একটা হচ্ছে Serializable আরেকটা Parcelable। আমরা এখানে দেখব কিভাবে Serializable নিয়ে কাজ করা যায়। তার জন্য প্রথমে আমরা একটা মডেল তৈরি করে নিব। যেমন Name.java:

import java.io.Serializable;

public class Name implements Serializable {
    String name;
    String email;

    public Name(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

Serializable নিয়ে কাজ করার জন্য আমাদের মডেলে Serializable ইমপ্লিমেন্ট করতে হবে। এবার আমরা Name এর একটা লিস্ট তৈরি করে নিব। যেমনঃ


List<Name> nameObjectList =  new ArrayList<Name>();;

Name name1 = new Name("Bill Gates", "[email protected]");;
nameObjectList.add(name1);

Name name2 = new Name("Warren Buffett", "[email protected]");;
nameObjectList.add(name2);

ইন্টেন্টে ডেটা যোগ করার জন্যঃ

 
Intent intent = new Intent(this, ObjectListActivity.class);
intent.putExtra("nameObjectList", (Serializable) nameObjectList);
startActivity(intent);

 

ডেটা রিসিভ করব এভাবেঃ

List<Name> names = (List<Name>) bundle.getSerializable("nameObjectList");

activity_main.java:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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" tools:context="me.jakir.listinintent.MainActivity">

    <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:onClick="openArrayListActivity" android:text="Array List Activity" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />

    <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" android:onClick="openObjectListActivity" android:text="Obect List Activity" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/button" />
</android.support.constraint.ConstraintLayout>

সম্পূর্ন MainActivity.java

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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements Serializable {

    List<String> names = new ArrayList<String>();

    List<Name> nameObjectList =  new ArrayList<Name>();;



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

        // creating array list
        names.add("Bill Gates");
        names.add("Warren Buffett");
        names.add("Jeff Bezos");
        names.add("Mark Zuckerberg");

        // Creating custom object list

        Name name1 = new Name("Bill Gates", "[email protected]");;
        nameObjectList.add(name1);
        Name name2 = new Name("Warren Buffett", "[email protected]");;
        nameObjectList.add(name2);

    }

    public void openArrayListActivity(View view){
        Intent intent = new Intent(this, ArraylistActivity.class);
        intent.putStringArrayListExtra("name_list", (ArrayList<String>) names);
        startActivity(intent);

    }


    public void openObjectListActivity(View view){
        Intent intent = new Intent(this, ObjectListActivity.class);
        intent.putExtra("nameObjectList", (Serializable) nameObjectList);
        startActivity(intent);

    }
}

activity_object_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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" tools:context="me.jakir.listinintent.ObjectListActivity">

    <TextView android:id="@+id/objectList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

ObjectListActivity.java:

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

import java.io.Serializable;
import java.util.List;

public class ObjectListActivity extends AppCompatActivity implements Serializable {

    TextView tvNameList;

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

        tvNameList = (TextView) findViewById(R.id.objectList);


        Bundle bundle = getIntent().getExtras();
        if(bundle!=null){

            List<Name> names = (List<Name>) bundle.getSerializable("nameObjectList");

            for(Name name: names){
                tvNameList.append(name.getName() + " " + name.getEmail() + "\n");
            }

        }

    }
}

সোর্স কোড পাওয়া যাবে গিটহাবে।

অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্ট নিয়ে ৭০+ আর্টিকেল। 

1 thought on “অ্যান্ড্রয়েড ইন্টেন্টে অবজেক্ট লিস্ট পাস করা”

  1. ভাইয়া একটু হেল্প লাগবে,… আমি চাচ্ছি ক্যামেরা দিয়ে পিক ওঠানোর আগে প্রোগ্রামেটিক্যালি একদম Lowest megapixel টা সিলেক্ট করে তারপর ইমেইজ টা ক্যাপচার করে ফাইলে সেইভ করতে…আমার কোড টা দিচ্ছি। একটু দেখবেন দয়া করে…ধন্যবাদ ভাইয়া।

    static final int REQUEST_TAKE_PHOTO = 1;

    private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there’s a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
    photoFile = createImageFile();
    } catch (IOException ex) {
    // Error occurred while creating the File

    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
    Uri photoURI = FileProvider.getUriForFile(this,
    “com.example.android.fileprovider”,
    photoFile);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
    startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
    }
    }
    }

    String mCurrentPhotoPath;

    private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat(“yyyyMMdd_HHmmss”).format(new Date());
    String imageFileName = “JPEG_” + timeStamp + “_”;
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
    imageFileName, /* prefix */
    “.jpg”, /* suffix */
    storageDir /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
    }

    আমি চাচ্ছি ক্যামেরা ওপেন হওয়ার আগে একদম লো-মেগ্যাপিক্সেল টা auto select করতে…

    Camera camera = null;
    Camera.Parameters parameters;
    camera.getParameters().setPictureSize(300, 400);

    এই রকম ভাবে।। কিন্তু পারতেছি না… 🙁

    Reply

Leave a Reply