sharedPrefences
আমাদের অ্যাপে সবচেয়ে দরকারী জিনিসটা হল ডাঁটা 😊 অ্যাপ তৈরিতেও সবচেয়ে কঠিন কাজ হয়ে দাঁড়ায় ডাটা নিয়ন্ত্রন করা 😊
এই পর্বে আমরা দেখবো, ধরি আমাদের অ্যাপের ভিতর খুব অল্প পরিমান ডাটা থাকবে । তখন সেই ডাটাগুলোকে কিভাবে নিয়ন্ত্রন করবো কিভাবে ডাটা ফোনের ভিতর স্টোরেজ করবো আবার ফোন থেকে অ্যাপের ভিতর কিভাবে নিয়ে আসবো সেটিই শিখবো আজ 😊
তো চলুন প্রথমেই কিছু একটা লেআউট ডিজাইন করে ফেলি ইউজার এর কাছ থেকে ডাটা নেয়ার জন্য -
activity_main.xml -
ট্যাগগুলো সম্পর্কে আমরা আগেই জেনে আসছি তাই এখন আর লেআউট ডিজাইন নিয়ে কথা বলতে হবে নাহ আশা করি । এই ডিজাইনে আমাদের লেআউট-টি যেরকম দেখতে হবে -
EditText এর মাধ্যমে ইউজার থেকে একটা ম্যাসেজ ইনপুট নিবো । সিকবারের মাধ্যমে ইউজার ফন্টের সাইজ ছোট বড় করতে পারবে । এরপর ইউজার চাইলে ফন্টের কোন একটা কালার সিলেক্ট করে রং বদলাতে পারবে । এই ডাটাটুকু আমরা আমাদের ফোনে সেভ করে রাখবো যাতে অ্যাপ থেকে বের হওয়ার পর ইউজার যদি আবার অ্যাপ ওপেন করে তাহলে যাতে পুরানো সেভ করা ডাটা সে দেখতে পারে । যদি ইউজার Clear all বাটন প্রেস করে তাহলে ডাটাগুলোও মুছে যাবে 😊
আমরা যখন ইউজার এর কাছ থেকে কোন ভ্যালু ইনপুট হিসেবে নিয়ে সেটি ফোনে পাঠবো , সেক্ষেত্রে ডায়রেক্ট ভ্যালু পাঠানো যাবে নাহ । ভ্যালু পাঠাতে হয় কি-ভ্যালু পেয়ার এর মাধ্যমে । অর্থাৎ প্রতিটি ভ্যালুর জন্য আমরা একটি নাম দিয়ে রাখবো । এরপর যখন ফোন থেকে অ্যাপে ডাটা নিয়ে আসবো তখনও সেই নাম ধরে ডাক দিলেই ডাটা চলে আসবে 😊 ডাটা গুলো রাখবো একটি ফাইলের ভিতরে 😊
তো চলুন স্ট্রিং এ একটি ফাইল নাম ও যে ৩ টি ডাটা সেভ করবো সেই ডাটাগুলোর জন্য একটি করে নাম দিয়ে রাখি ।
string.xml -
আমরা আজকের অ্যাপে কিছু কালার ইউজ করবো । তো আমাদের অ্যাপে আমরা যেসব কালার ইউজ করবো সবগুলো কালারস ফাইলের ভিতর রেখে দিয়ে ইউজ করবো ।
colors.xml -
এবার ব্যাকগ্রাউন্ডের কোড করা যাক 😊
MainActivity.java -
আমাদের লেআউট এ যে ভিউগুলো ইউজ করেছি সেগুলো নিয়ে কাজ করার জন্য সেই সব ক্লাসের ইন্সট্যান্স তৈরি করলাম ।
ফন্ট সাইজ float হয় সর্বদা তাই ফন্ট সাইজ নিয়ে কাজ করার জন্য float ভ্যারিয়েবল এবং কালার এর জন্য String ভ্যারিয়েবল তৈরি করলাম ।
ভিউ দুটির আইডির সাথে ইন্সট্যান্স এর সংযোগ ঘটিয়ে দিলাম 😊
এবার প্রথমেই seekbar এর কাজটা করবো । সিকবার এর মাধ্যমে ফন্টের সাইজ ছট-বড় করার জন্য যে ম্যাথডটি ইউজ করতে হয় সেটি হল setOnSeekBarChangeListener -
এই ম্যাথডের ভিতর ৩ টি ম্যাথড আছে । প্রথম ম্যাথডটি seekbar এর মাধ্যমে চেঞ্জ করার সময় কাজ করে । ২য় ম্যাথডটি ইউজার যখন seekbar টাচ করে তখন কাজ করবে এবং ৩য় ম্যাথডটি ইউজার যখন seekbar নিয়ে কাজ শেষ করে তখন কাজ করবে ।
১ম ম্যাথডের মাধ্যমে আমরা seekbar এর মান এর একটা ভ্যালু পাই । এখানে ভ্যালু বাড়ার সময় int আকারে ভ্যালু বৃদ্ধি পাচ্ছে কিন্তু seekbar টেনে শেষ করার পর যে ভ্যালুটা পাবো সেটা float আকারে পাই , তাই উপরে float ভ্যারিয়েবল নিয়েছি যাতে seekbar টেনে শেষ করার পর যে মানটা পাবো সেটা সেই ভ্যারিয়েবল এ রাখতে পারি ।
আগেই বলেছিলাম ৩য় ম্যাথড কাজ করে যখন কাজ শেষ , তো seekbar টেনে শেষ করার পর seekbar এর বর্তমান অবস্থার সাইজের মানটা font_size ভ্যারিয়েবল এর ভিতরে রাখলাম ।
এবার কালার নিয়ে কাজ করা যাক -
কালার চেঞ্জ করার জন্য আমরা রেডিও বাটন ইউজ করেছি । রেডিও বাটন নিয়ে কাজ করার সময় আমরা জেনে আসছি প্রতিটা বাটনে একই ম্যাথড এর নাম ইউজ করতে হয় , কারন বাটনগুলো যে একই গ্রুপের ভিউ সো যেটায় ক্লিক করবে সাথে সাথে যেন শুধু সেটারই কাজ করে ।
আগের ম্যাথডের নিচে রেডিও বাটনের অনক্লিক ম্যাথডে দেয়া ম্যাথড টা লিখলাম -
সুইচ কেসের মাধ্যমে ইউজার এর দেয়া নির্দেশটা নিলাম , যে সে কোন বাটনে ক্লিক করেছে । এরপর প্রতি বাটনের পরিপ্রেক্ষিতে সে অনুযায়ী ইউজার এর দেয়া ম্যাসেজের কালার চেঞ্জ করে দিলাম setTextColor ম্যাথডের মাধ্যমে । কালারটা যেহেতু আমাদের colors.xml এ ডিক্লার করা আছে তাই getResources().getColor এর মাধ্যমে সেখান থেকে কালারটা কল করা হইছে 😊
সর্বশেষে আমরা যে কালারটা সিলেক্ট করেছি সেটা font_color ভ্যারিয়েবল এর ভিতরে চলে যাবে ।
তাহলে font_color এবং font_size সহ ইউজার থেকে ইনপুটও পেলাম যা message ভিউ তে আছে এবার এই ভ্যালু তিনটি Save Message বাটনে প্রেস করার মাধ্যমে ফোন মেমোরি তে নিয়ে যাবো । সে জন্য Save Message বাটনে আমরা যে অনক্লিক ম্যাথডটি ইউজ করেছি সেটির ম্যাথড MainActivity.java তে উপরের কোডের নিচে লিখে নিন 😊
আমরা যেহেতু SharedPreferences এর মাধ্যমে ভ্যালুগুলো পাঠাবো তাই প্রথমেই SharedPreferences এর অব্জেক্ট তৈরি করলাম যার সাথে getSharedPreferences ম্যাথডের মাধ্যমে ফোনে একটি ফাইল তৈরি করলাম । আমরা যেহেতু এই MainActivity থেকে ডাটা নিতেছি তাই এক্টিভিটির নাম দিয়ে দিছি । ফাইল নামটা আমাদের অ্যাপ প্রোজেক্টের strings.xml এর ভিতর থাকায় সেখান থেকে কল করলাম এবং সেকেন্ড প্যারামিটারটি হল ফাইলটি কোন টাইপের হবে । MODE_PRIVATE দেয়ার ফলে শুধুমাত্র এই অ্যাপটিই ফাইলের ডাঁটা নিয়ে কাজ করতে পারবে , যদি আমরা পাবলিক রাখতাম তাহলে অন্য অ্যাপগুলোও চাইলে আমাদের ডাটা এক্সেস করতে পারতো ।
SharedPreferences এর ফাইলের ভিতরে ডাটা ডুকানোর জন্য Editor ক্লাসের অব্জেক্ট তৈরি করতে হবে এবং সেটি SharedPreferences এর সাথে সংযোগ করেই editor অব্জেক্ট তৈরি করলাম ।
এরপর আমাদের হাতে আসা ভ্যালু ৩টি পাঠিয়ে দিলাম । যেহেতু আমাদের ফন্ট সাইজ float আকারে তাই putFloat আবার string ডাঁটাগুলোর জন্য putString ম্যাথডগুলো নিলাম যেগুলোর ভিতর প্যারামিটার হিসেবে ২ টি ভ্যালু দিতে হবে । প্রথম ভ্যালুটি হচ্ছে key নাম যেটা আমরা স্ট্রিং রিসোর্স এর ভিতর ডিক্লার করেছি আর দ্বিতীয়টি হচ্ছে ভ্যালু যা আমরা ভ্যারিয়েবল থেকে পাচ্ছি । ম্যাসেজটা আমরা ডায়রেক্ট EditText ভিউ থেকে ডায়রেক্ট নিতেছি যা String হিসেবে স্টোর করে রাখবো, তাই toString() ম্যাথড দ্বারা সেটি string এ কনভার্ট করলাম ।
শেষে editor.commit দ্বারা সকল ইনফরমেশনগুলো সেভ করে দিলাম 😊😊😊
এখন যদি আমরা Save Message বাটনে প্রেস করি তাহলে ডাটাগুলো ফোন মেমোরি তে সেভ হয়ে গেল । এবার দ্বিতীয় বাটনের কাজ করা যাক । আমরা যখন Clear all বাটনে প্রেস করবো তখন ডাটা গুলো ফোন মেমোরি থেকেও ডিলেট হয়ে যাবে ।
বাটনে Clear all লেখা থাকলেও অনক্লিক ম্যাথডে clearMessage লিখেছিলাম তাই সেই নামেই ভিউ তৈরি করতে হবে 😊
ডাঁটা সেভ করার কোড হয়ে গেল, মুছার কোডও হয়ে গেল । এবার ডাঁটা ফোন মেমোরি থেকে অ্যাপের ভিতর নিয়ে আসার কোড লিখতে হবে 😊
ইউজার যখন প্রতিবার অ্যাপ ওপেন করবে তখনই আমাদের চেক করতে হবে মেমোরি তে কোন ডাঁটা সেভ করা আছে কিনা তাহলে সেটি আমরা দেখিয়ে দিব । তাই এই কোডগুলো একদম উপরে লেখা যাক । setOnSeekBarChangeListener এর উপরে -
যেহেতু SharedPreferences নিয়ে কাজ করছি তাই আবারো তার অব্জেক্ট তৈরি করলাম । আমরা যখনই কাজ করবো তখনই SharedPreferences এর অব্জেক্ট তৈরি করে কাজ করতে হবে । এখানে একই নামে অব্জেক্ট তৈরি করতেছি কারন এর আগে যে অব্জেক্ট দুইটি তৈরি করেছি সে দুইটি এক একটি ম্যাথডের ভিতরে কিন্তু তৈরি করেছি যেটি শুধু ওই ম্যাথডের ভিতরেই কাজ করবে ।
এরপর SharedPreferences অব্জেক্ট দ্বারা message এর ভিতর key নাম ধরে কল করলাম । এখানে getString() ম্যাথডের ভিতর প্যারামিটার হিসেবে দুইটি ভ্যালু দিতে হবে । প্রথমটা key নাম এবং দ্বিতীয়টা ডিফ্লট ভ্যালু । যদি key নামে key তে কোন ভ্যালু নাহ থাকে তাহলে অ্যাপে আমরা যা শো করাতে চাই সেটি ডিফল্ট ভ্যালুতে প্যারামিটার হিসেবে দিয়ে দিব । ম্যাসজে আমরা ফাকা একটি ভ্যালু দিয়ে দিলাম । ফন্ট সাইজ এবং ফন্ট কালার এর ক্ষেত্রেও একই নিয়ম ফলো করা হইছে এবং ভ্যালুগুলো একটি ভ্যারিয়েবল এর ভিতর রাখা হইছে যাতে সেখান থেকে আমরা এগুলো কন্ট্রোল করতে পারি
যদি ম্যাথডের মাধ্যমে ডায়রেক্ট সাইজ বসিয়ে দেয়া হয় তবে সেক্ষেত্রে ঝামেলা হবে তাই ভ্যারিয়েবল এর ভিতরে রেখে কাজ করবো আমরা । মেমোরির ভিতরে কোন ডাঁটা থেকে থাকলে ভ্যারিয়েবল এর ভিতরে যে মানগুলো আমরা পাবো সে অনুযায়ী এবার ম্যাসেজটি সাজাবো ।
প্রথমে ফন্ট সাইজ টা দেই এবং যতটুকু ফন্ট সাজ আসবে সেইমানে seekbar এর কার্সর টাও থাকবে -
setTextSize ম্যাথড দ্বারা ফন্ট সাইজ টা বসিয়ে দিলাম । আমরা যখন মেমোরি থেকে ফন্ট এর সাইজ কল করেছি তখন ডিফল্ট ভ্যালু হিসেবে ২০ দিয়েছিলাম । তো এখানে একটা কন্ডিশন দিয়ে দিলাম , যদি ডিফল্ট ভ্যালু আসা মানে আমার কোন লেখা সেভ করা নাই , তাই ডিফল্ট ভ্যালু নাহ আসলে অন্য যে মানটা আসবে seekbar এর কার্সর টাও সেখানে থাকবে ।
এবার আমরা সেভ করা ডাঁটা অনুযায়ী টেক্স এর কালার চেঞ্জ করবো । তো সেজন্য if-else এর কন্ডিশন দিয়ে বসিয়ে দিলেই হয়ে গেল -
font_color ভ্যারিয়েবল এ কালারটা চেক করলাম । এরপর setTextColor ম্যাথডটা সে অনুযায়ী কালার রিসোর্স এ থাকা কালার বসিয়ে দিলাম ।
এবার অ্যাপটি রান করে চেক করুন 😊
MainActivity.java তে ফুল কোড-
😊😊😊
এই পর্বে আমরা দেখবো, ধরি আমাদের অ্যাপের ভিতর খুব অল্প পরিমান ডাটা থাকবে । তখন সেই ডাটাগুলোকে কিভাবে নিয়ন্ত্রন করবো কিভাবে ডাটা ফোনের ভিতর স্টোরেজ করবো আবার ফোন থেকে অ্যাপের ভিতর কিভাবে নিয়ে আসবো সেটিই শিখবো আজ 😊
তো চলুন প্রথমেই কিছু একটা লেআউট ডিজাইন করে ফেলি ইউজার এর কাছ থেকে ডাটা নেয়ার জন্য -
activity_main.xml -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:padding="7dp"
tools:context="com.example.user.sharedpreferences.MainActivity">
<EditText
android:id="@+id/messageBox"
android:layout_width="match_parent"
android:layout_height="230dp"
android:hint="Enter your message"
android:textSize="30sp"/>
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="7dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Select font color : "
android:textSize="23sp"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/yellow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Yellow"
android:onClick="colorChange"/>
<RadioButton
android:id="@+id/green"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Green"
android:onClick="colorChange"/>
<RadioButton
android:id="@+id/red"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Red"
android:onClick="colorChange"/>
</RadioGroup>
<Button
android:id="@+id/save_messgae_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save Message"
android:onClick="saveMessage"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Clear all"
android:textAllCaps="false"
android:onClick="clearMessage"/>
</LinearLayout>
ট্যাগগুলো সম্পর্কে আমরা আগেই জেনে আসছি তাই এখন আর লেআউট ডিজাইন নিয়ে কথা বলতে হবে নাহ আশা করি । এই ডিজাইনে আমাদের লেআউট-টি যেরকম দেখতে হবে -
EditText এর মাধ্যমে ইউজার থেকে একটা ম্যাসেজ ইনপুট নিবো । সিকবারের মাধ্যমে ইউজার ফন্টের সাইজ ছোট বড় করতে পারবে । এরপর ইউজার চাইলে ফন্টের কোন একটা কালার সিলেক্ট করে রং বদলাতে পারবে । এই ডাটাটুকু আমরা আমাদের ফোনে সেভ করে রাখবো যাতে অ্যাপ থেকে বের হওয়ার পর ইউজার যদি আবার অ্যাপ ওপেন করে তাহলে যাতে পুরানো সেভ করা ডাটা সে দেখতে পারে । যদি ইউজার Clear all বাটন প্রেস করে তাহলে ডাটাগুলোও মুছে যাবে 😊
আমরা যখন ইউজার এর কাছ থেকে কোন ভ্যালু ইনপুট হিসেবে নিয়ে সেটি ফোনে পাঠবো , সেক্ষেত্রে ডায়রেক্ট ভ্যালু পাঠানো যাবে নাহ । ভ্যালু পাঠাতে হয় কি-ভ্যালু পেয়ার এর মাধ্যমে । অর্থাৎ প্রতিটি ভ্যালুর জন্য আমরা একটি নাম দিয়ে রাখবো । এরপর যখন ফোন থেকে অ্যাপে ডাটা নিয়ে আসবো তখনও সেই নাম ধরে ডাক দিলেই ডাটা চলে আসবে 😊 ডাটা গুলো রাখবো একটি ফাইলের ভিতরে 😊
তো চলুন স্ট্রিং এ একটি ফাইল নাম ও যে ৩ টি ডাটা সেভ করবো সেই ডাটাগুলোর জন্য একটি করে নাম দিয়ে রাখি ।
string.xml -
<resources>
<string name="app_name">SharedPreferences</string>
<string name="File_Name">file_name</string>
<string name="Font_Size">font_size</string>
<string name="Font_Color">font_color</string>
<string name="Message">message_box</string>
</resources>
আমরা আজকের অ্যাপে কিছু কালার ইউজ করবো । তো আমাদের অ্যাপে আমরা যেসব কালার ইউজ করবো সবগুলো কালারস ফাইলের ভিতর রেখে দিয়ে ইউজ করবো ।
colors.xml -
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="yellow">#f9e721</color>
<color name="green">#5ee734</color>
<color name="red">#d11e24</color>
</resources>
এবার ব্যাকগ্রাউন্ডের কোড করা যাক 😊
MainActivity.java -
public class MainActivity extends AppCompatActivity {
EditText message;
SeekBar seekBar;
float font_size;
String font_color;
আমাদের লেআউট এ যে ভিউগুলো ইউজ করেছি সেগুলো নিয়ে কাজ করার জন্য সেই সব ক্লাসের ইন্সট্যান্স তৈরি করলাম ।
ফন্ট সাইজ float হয় সর্বদা তাই ফন্ট সাইজ নিয়ে কাজ করার জন্য float ভ্যারিয়েবল এবং কালার এর জন্য String ভ্যারিয়েবল তৈরি করলাম ।
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = findViewById(R.id.messageBox);
seekBar = findViewById(R.id.seekBar);
ভিউ দুটির আইডির সাথে ইন্সট্যান্স এর সংযোগ ঘটিয়ে দিলাম 😊
এবার প্রথমেই seekbar এর কাজটা করবো । সিকবার এর মাধ্যমে ফন্টের সাইজ ছট-বড় করার জন্য যে ম্যাথডটি ইউজ করতে হয় সেটি হল setOnSeekBarChangeListener -
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
message.setTextSize(TypedValue.COMPLEX_UNIT_PX,i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
font_size = message.getTextSize();
}
});
এই ম্যাথডের ভিতর ৩ টি ম্যাথড আছে । প্রথম ম্যাথডটি seekbar এর মাধ্যমে চেঞ্জ করার সময় কাজ করে । ২য় ম্যাথডটি ইউজার যখন seekbar টাচ করে তখন কাজ করবে এবং ৩য় ম্যাথডটি ইউজার যখন seekbar নিয়ে কাজ শেষ করে তখন কাজ করবে ।
১ম ম্যাথডের মাধ্যমে আমরা seekbar এর মান এর একটা ভ্যালু পাই । এখানে ভ্যালু বাড়ার সময় int আকারে ভ্যালু বৃদ্ধি পাচ্ছে কিন্তু seekbar টেনে শেষ করার পর যে ভ্যালুটা পাবো সেটা float আকারে পাই , তাই উপরে float ভ্যারিয়েবল নিয়েছি যাতে seekbar টেনে শেষ করার পর যে মানটা পাবো সেটা সেই ভ্যারিয়েবল এ রাখতে পারি ।
আগেই বলেছিলাম ৩য় ম্যাথড কাজ করে যখন কাজ শেষ , তো seekbar টেনে শেষ করার পর seekbar এর বর্তমান অবস্থার সাইজের মানটা font_size ভ্যারিয়েবল এর ভিতরে রাখলাম ।
এবার কালার নিয়ে কাজ করা যাক -
কালার চেঞ্জ করার জন্য আমরা রেডিও বাটন ইউজ করেছি । রেডিও বাটন নিয়ে কাজ করার সময় আমরা জেনে আসছি প্রতিটা বাটনে একই ম্যাথড এর নাম ইউজ করতে হয় , কারন বাটনগুলো যে একই গ্রুপের ভিউ সো যেটায় ক্লিক করবে সাথে সাথে যেন শুধু সেটারই কাজ করে ।
আগের ম্যাথডের নিচে রেডিও বাটনের অনক্লিক ম্যাথডে দেয়া ম্যাথড টা লিখলাম -
public void colorChange(View view) {
switch (view.getId()){
case R.id.yellow:
message.setTextColor(getResources().getColor(R.color.yellow));
font_color = "Yellow";
break;
case R.id.green:
message.setTextColor(getResources().getColor(R.color.green));
font_color = "Green";
break;
case R.id.red:
message.setTextColor(getResources().getColor(R.color.red));
font_color = "Red";
break;
}
}
সুইচ কেসের মাধ্যমে ইউজার এর দেয়া নির্দেশটা নিলাম , যে সে কোন বাটনে ক্লিক করেছে । এরপর প্রতি বাটনের পরিপ্রেক্ষিতে সে অনুযায়ী ইউজার এর দেয়া ম্যাসেজের কালার চেঞ্জ করে দিলাম setTextColor ম্যাথডের মাধ্যমে । কালারটা যেহেতু আমাদের colors.xml এ ডিক্লার করা আছে তাই getResources().getColor এর মাধ্যমে সেখান থেকে কালারটা কল করা হইছে 😊
সর্বশেষে আমরা যে কালারটা সিলেক্ট করেছি সেটা font_color ভ্যারিয়েবল এর ভিতরে চলে যাবে ।
তাহলে font_color এবং font_size সহ ইউজার থেকে ইনপুটও পেলাম যা message ভিউ তে আছে এবার এই ভ্যালু তিনটি Save Message বাটনে প্রেস করার মাধ্যমে ফোন মেমোরি তে নিয়ে যাবো । সে জন্য Save Message বাটনে আমরা যে অনক্লিক ম্যাথডটি ইউজ করেছি সেটির ম্যাথড MainActivity.java তে উপরের কোডের নিচে লিখে নিন 😊
public void saveMessage(View view) {
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putFloat(getString(R.string.Font_Size),font_size);
editor.putString(getString(R.string.Font_Color),font_color);
editor.putString(getString(R.string.Message),message.getText().toString());
editor.commit();
}
আমরা যেহেতু SharedPreferences এর মাধ্যমে ভ্যালুগুলো পাঠাবো তাই প্রথমেই SharedPreferences এর অব্জেক্ট তৈরি করলাম যার সাথে getSharedPreferences ম্যাথডের মাধ্যমে ফোনে একটি ফাইল তৈরি করলাম । আমরা যেহেতু এই MainActivity থেকে ডাটা নিতেছি তাই এক্টিভিটির নাম দিয়ে দিছি । ফাইল নামটা আমাদের অ্যাপ প্রোজেক্টের strings.xml এর ভিতর থাকায় সেখান থেকে কল করলাম এবং সেকেন্ড প্যারামিটারটি হল ফাইলটি কোন টাইপের হবে । MODE_PRIVATE দেয়ার ফলে শুধুমাত্র এই অ্যাপটিই ফাইলের ডাঁটা নিয়ে কাজ করতে পারবে , যদি আমরা পাবলিক রাখতাম তাহলে অন্য অ্যাপগুলোও চাইলে আমাদের ডাটা এক্সেস করতে পারতো ।
SharedPreferences এর ফাইলের ভিতরে ডাটা ডুকানোর জন্য Editor ক্লাসের অব্জেক্ট তৈরি করতে হবে এবং সেটি SharedPreferences এর সাথে সংযোগ করেই editor অব্জেক্ট তৈরি করলাম ।
এরপর আমাদের হাতে আসা ভ্যালু ৩টি পাঠিয়ে দিলাম । যেহেতু আমাদের ফন্ট সাইজ float আকারে তাই putFloat আবার string ডাঁটাগুলোর জন্য putString ম্যাথডগুলো নিলাম যেগুলোর ভিতর প্যারামিটার হিসেবে ২ টি ভ্যালু দিতে হবে । প্রথম ভ্যালুটি হচ্ছে key নাম যেটা আমরা স্ট্রিং রিসোর্স এর ভিতর ডিক্লার করেছি আর দ্বিতীয়টি হচ্ছে ভ্যালু যা আমরা ভ্যারিয়েবল থেকে পাচ্ছি । ম্যাসেজটা আমরা ডায়রেক্ট EditText ভিউ থেকে ডায়রেক্ট নিতেছি যা String হিসেবে স্টোর করে রাখবো, তাই toString() ম্যাথড দ্বারা সেটি string এ কনভার্ট করলাম ।
শেষে editor.commit দ্বারা সকল ইনফরমেশনগুলো সেভ করে দিলাম 😊😊😊
এখন যদি আমরা Save Message বাটনে প্রেস করি তাহলে ডাটাগুলো ফোন মেমোরি তে সেভ হয়ে গেল । এবার দ্বিতীয় বাটনের কাজ করা যাক । আমরা যখন Clear all বাটনে প্রেস করবো তখন ডাটা গুলো ফোন মেমোরি থেকেও ডিলেট হয়ে যাবে ।
public void clearMessage(View view) {
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
message.setText("");
editor.commit();
}
বাটনে Clear all লেখা থাকলেও অনক্লিক ম্যাথডে clearMessage লিখেছিলাম তাই সেই নামেই ভিউ তৈরি করতে হবে 😊
এখানেও আগের মত প্রথমে আমাদের SharedPreferences এর অব্জেক্ট তৈরি করতে হবে । এরপর তার ভিতর ডাঁটা নিয়ে কাজ করার জন্য Editor এর অব্জেক্টও তৈরি করলাম । এরপর যাস্ট ক্লিয়ার ম্যাথড ইউজ করে সকল ডাঁটা মুছে দিলাম এবং সেটি সেভ করে দিলাম। মেমোরি থেকে ডাঁটা চলে গেল কিন্তু তখন EditText এ ইউজারের ইনপুট কিন্তু ঠিকই লেখা থাকবে যতক্ষণ নাহ ব্যাকস্পেস দিয়ে সেটি মুছে নাই দেই কিংবা অ্যাপ অফ করে আবার অন নাহ করি তাই Clear all বাটনে প্রেস করলে EditText ভিউ থেকেও যাতে ম্যাসেজটা চলে যায় সেজন্য একটি ফাকা ভ্যালু সেট করে দিলাম ।
ডাঁটা সেভ করার কোড হয়ে গেল, মুছার কোডও হয়ে গেল । এবার ডাঁটা ফোন মেমোরি থেকে অ্যাপের ভিতর নিয়ে আসার কোড লিখতে হবে 😊
ইউজার যখন প্রতিবার অ্যাপ ওপেন করবে তখনই আমাদের চেক করতে হবে মেমোরি তে কোন ডাঁটা সেভ করা আছে কিনা তাহলে সেটি আমরা দেখিয়ে দিব । তাই এই কোডগুলো একদম উপরে লেখা যাক । setOnSeekBarChangeListener এর উপরে -
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
message.setText(sharedPreferences.getString(getString(R.string.Message),""));
font_size = sharedPreferences.getFloat(getString(R.string.Font_Size),20);
font_color = sharedPreferences.getString(getString(R.string.Font_Color),"");
যেহেতু SharedPreferences নিয়ে কাজ করছি তাই আবারো তার অব্জেক্ট তৈরি করলাম । আমরা যখনই কাজ করবো তখনই SharedPreferences এর অব্জেক্ট তৈরি করে কাজ করতে হবে । এখানে একই নামে অব্জেক্ট তৈরি করতেছি কারন এর আগে যে অব্জেক্ট দুইটি তৈরি করেছি সে দুইটি এক একটি ম্যাথডের ভিতরে কিন্তু তৈরি করেছি যেটি শুধু ওই ম্যাথডের ভিতরেই কাজ করবে ।
এরপর SharedPreferences অব্জেক্ট দ্বারা message এর ভিতর key নাম ধরে কল করলাম । এখানে getString() ম্যাথডের ভিতর প্যারামিটার হিসেবে দুইটি ভ্যালু দিতে হবে । প্রথমটা key নাম এবং দ্বিতীয়টা ডিফ্লট ভ্যালু । যদি key নামে key তে কোন ভ্যালু নাহ থাকে তাহলে অ্যাপে আমরা যা শো করাতে চাই সেটি ডিফল্ট ভ্যালুতে প্যারামিটার হিসেবে দিয়ে দিব । ম্যাসজে আমরা ফাকা একটি ভ্যালু দিয়ে দিলাম । ফন্ট সাইজ এবং ফন্ট কালার এর ক্ষেত্রেও একই নিয়ম ফলো করা হইছে এবং ভ্যালুগুলো একটি ভ্যারিয়েবল এর ভিতর রাখা হইছে যাতে সেখান থেকে আমরা এগুলো কন্ট্রোল করতে পারি
যদি ম্যাথডের মাধ্যমে ডায়রেক্ট সাইজ বসিয়ে দেয়া হয় তবে সেক্ষেত্রে ঝামেলা হবে তাই ভ্যারিয়েবল এর ভিতরে রেখে কাজ করবো আমরা । মেমোরির ভিতরে কোন ডাঁটা থেকে থাকলে ভ্যারিয়েবল এর ভিতরে যে মানগুলো আমরা পাবো সে অনুযায়ী এবার ম্যাসেজটি সাজাবো ।
প্রথমে ফন্ট সাইজ টা দেই এবং যতটুকু ফন্ট সাজ আসবে সেইমানে seekbar এর কার্সর টাও থাকবে -
message.setTextSize(TypedValue.COMPLEX_UNIT_PX,font_size);
if(font_size!=20) {
seekBar.setProgress((int) font_size);
}
setTextSize ম্যাথড দ্বারা ফন্ট সাইজ টা বসিয়ে দিলাম । আমরা যখন মেমোরি থেকে ফন্ট এর সাইজ কল করেছি তখন ডিফল্ট ভ্যালু হিসেবে ২০ দিয়েছিলাম । তো এখানে একটা কন্ডিশন দিয়ে দিলাম , যদি ডিফল্ট ভ্যালু আসা মানে আমার কোন লেখা সেভ করা নাই , তাই ডিফল্ট ভ্যালু নাহ আসলে অন্য যে মানটা আসবে seekbar এর কার্সর টাও সেখানে থাকবে ।
এবার আমরা সেভ করা ডাঁটা অনুযায়ী টেক্স এর কালার চেঞ্জ করবো । তো সেজন্য if-else এর কন্ডিশন দিয়ে বসিয়ে দিলেই হয়ে গেল -
if(font_color.equals("Yellow")){
message.setTextColor(getResources().getColor(R.color.yellow));
}else if(font_color.equals("Green")){
message.setTextColor(getResources().getColor(R.color.green));
}else if (font_color.equals("Red")){
message.setTextColor(getResources().getColor(R.color.red));
}
font_color ভ্যারিয়েবল এ কালারটা চেক করলাম । এরপর setTextColor ম্যাথডটা সে অনুযায়ী কালার রিসোর্স এ থাকা কালার বসিয়ে দিলাম ।
এবার অ্যাপটি রান করে চেক করুন 😊
MainActivity.java তে ফুল কোড-
package com.example.user.sharedpreferences;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SeekBar;
public class MainActivity extends AppCompatActivity {
EditText message;
SeekBar seekBar;
float font_size;
String font_color;
LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = findViewById(R.id.messageBox);
seekBar = findViewById(R.id.seekBar);
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
message.setText(sharedPreferences.getString(getString(R.string.Message),""));
font_size = sharedPreferences.getFloat(getString(R.string.Font_Size),20);
font_color = sharedPreferences.getString(getString(R.string.Font_Color),"");
message.setTextSize(TypedValue.COMPLEX_UNIT_PX,font_size);
if(font_size!=20) {
seekBar.setProgress((int) font_size);
}
if(font_color.equals("Yellow")){
message.setTextColor(getResources().getColor(R.color.yellow));
}else if(font_color.equals("Green")){
message.setTextColor(getResources().getColor(R.color.green));
}else if (font_color.equals("Red")){
message.setTextColor(getResources().getColor(R.color.red));
}
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
message.setTextSize(TypedValue.COMPLEX_UNIT_PX,i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
font_size = message.getTextSize();
}
});
}
public void colorChange(View view) {
switch (view.getId()){
case R.id.yellow:
message.setTextColor(getResources().getColor(R.color.yellow));
font_color = "Yellow";
break;
case R.id.green:
message.setTextColor(getResources().getColor(R.color.green));
font_color = "Green";
break;
case R.id.red:
message.setTextColor(getResources().getColor(R.color.red));
font_color = "Red";
break;
}
}
public void saveMessage(View view) {
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putFloat(getString(R.string.Font_Size),font_size);
editor.putString(getString(R.string.Font_Color),font_color);
editor.putString(getString(R.string.Message),message.getText().toString());
editor.commit();
}
public void clearMessage(View view) {
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences(getString(R.string.File_Name),MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
message.setText("");
editor.commit();
}
}
😊😊😊
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন