অ্যান্ড্রয়েড ইনটেন্ট লেখাটিতে আমরা জেনেছি ইন্টেন্ট কি, কিভাবে একটা একটিভিটি থেকে আরেকটা অ্যাক্টিভিটি ওপেন করা যায়, এবং দেখেছি কিভাবে একটা অ্যাক্টিভিটি ত্থেকে আরেকটা অ্যাক্টিভিটিতে ডেটা পাস করা যায়। ঐখানে ডেটা বলছে আমরা সিম্পল স্ট্রিং পাস করেছি। যখন আমাদের অনেকগুলো ডেটা এক সাথে পাস করতে হবে, যেমন অ্যারে লিস্ট বা যে কোন অবজেক্ট লিস্ট, তখন কিভাবে ডেটা পাস করব? এই লেখাতে প্রথমে দেখব কিভাবে অ্যারে লিস্ট পাস করা যায়। এবং এরপর দেখব কিভাবে অবজেক্ট লিস্ট পাস করা যায়।
অ্যান্ড্রয়েড ইন্টেন্ট পুট অ্যারে লিস্ট
আমরা অ্যান্ড্রয়েড স্টুডিওতে একটা প্রজেক্ট তৈরি করে নিব। এরপর নতুন আরেকটা অ্যাক্টিভিটি যুক্ত করব যেমন 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"); } } } }
ভাইয়া একটু হেল্প লাগবে,… আমি চাচ্ছি ক্যামেরা দিয়ে পিক ওঠানোর আগে প্রোগ্রামেটিক্যালি একদম 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);
এই রকম ভাবে।। কিন্তু পারতেছি না… 🙁