ফ্র্যাগমেন্ট সহ স্টেট সেভ করা হচ্ছে

বিভিন্ন Android সিস্টেম অপারেশন আপনার ফ্র্যাগমেন্টের অবস্থাকে প্রভাবিত করতে পারে। ব্যবহারকারীর স্টেট সেভ করা হয়েছে কিনা তা নিশ্চিত করতে, Android ফ্রেমওয়ার্ক অটোমেটিক ফ্র্যাগমেন্ট ও ব্যাক স্ট্যাক সেভ ও রিস্টোর করে। তাই, আপনার ফ্র্যাগমেন্টের যেকোনও ডেটা সেভ ও রিস্টোর করা হয়েছে কিনা তা আপনাকে নিশ্চিত করতে হবে।

নিচের সারণীতে এমন অপারেশনগুলি দেখানো হয়েছে যেগুলি আপনার ফ্র্যাগমেন্টের স্টেট হারানোর কারণ হতে পারে, সেইসাথে বিভিন্ন ধরনের স্টেট সেইসব পরিবর্তনের মাধ্যমে অপরিবর্তিত থাকে কিনা তাও দেখানো হয়েছে। টেবিলে উল্লেখ করা রাজ্যের ধরনগুলি নিচে দেওয়া হল:

  • ভেরিয়েবল: ফ্র্যাগমেন্টে লোকাল ভেরিয়েবল।
  • ভিউ স্টেট: ফ্র্যাগমেন্টে এক বা একাধিক ভিউয়ের মালিকানাধীন যেকোনও ডেটা।
  • SavedState: এই ফ্র্যাগমেন্ট ইনস্ট্যান্সের সাথে সম্পর্কিত ডেটা যা onSaveInstanceState()-এ সেভ করা উচিত।
  • NonConfig: কোনও বাহ্যিক সোর্স থেকে ডেটা নেওয়া হয়, যেমন সার্ভার বা লোকাল রিপোজিটরি অথবা ব্যবহারকারীর তৈরি করা ডেটা যা একবার কমিট করার পরে সার্ভারে পাঠানো হয়।

প্রায়শই Variables-কে SavedState-এর মতোই মনে করা হয়, তবে নিম্নলিখিত সারণীটি দুটির মধ্যে পার্থক্য করে যাতে প্রতিটির উপর বিভিন্ন অপারেশনের প্রভাব দেখানো যায়।

অপারেশন ভেরিয়েবল রাজ্য দেখুন SavedState NonConfig
ব্যাক স্ট্যাকে যোগ করা হয়েছে ✓ ✓ x ✓
কনফিগারেশনে পরিবর্তন x ✓ ✓ ✓
প্রসেস বন্ধ করা/আবার তৈরি করা x ✓ ✓ ✓*
সরানো হয়েছে, ব্যাক স্ট্যাকে যোগ করা হয়নি x x x x
হোস্ট শেষ হয়েছে x x x x

* ViewModel-এর জন্য Saved State মডিউল ব্যবহার করে প্রসেস বন্ধ করার সময় NonConfig স্টেট ধরে রাখা যেতে পারে।

সারণী ১: বিভিন্ন ফ্র্যাগমেন্ট ডেস্ট্রাক্টিভ অপারেশন এবং বিভিন্ন স্টেট টাইপের উপর সেগুলির প্রভাব।

আসুন একটি নির্দিষ্ট উদাহরণ দেখা যাক। এমন একটি স্ক্রিনের কথা ভাবুন যা একটি র‍্যান্ডম স্ট্রিং তৈরি করে, এটি একটি TextView-এ দেখায় এবং কোনও বন্ধুকে পাঠানোর আগে স্ট্রিংটি এডিট করার বিকল্প প্রদান করে:

র‍্যান্ডম টেক্সট জেনারেটর অ্যাপ যা বিভিন্ন ধরনের স্টেট
            দেখায়
ছবি ১. র‍্যান্ডম টেক্সট জেনারেটর অ্যাপ যা বিভিন্ন ধরনের স্টেট দেখায়।

এই উদাহরণের জন্য, ধরে নিন যে ব্যবহারকারী এডিট বোতামটি প্রেস করলে, অ্যাপটি একটি EditText ভিউ দেখায় যেখানে ব্যবহারকারী মেসেজটি এডিট করতে পারেন। ব্যবহারকারী বাতিল করুন বিকল্পে ক্লিক করলে, EditText ভিউ মুছে দিতে হবে এবং এর দৃশ্যমানতা View.GONE হিসেবে সেট করতে হবে। এই ধরনের স্ক্রিনে নির্বিঘ্ন অভিজ্ঞতা নিশ্চিত করতে চারটি ডেটা ম্যানেজ করার প্রয়োজন হতে পারে:

ডেটা ধরন স্টেটের ধরন বর্ণনা
seed Long NonConfig র‍্যান্ডমভাবে নতুন ভালো কাজ জেনারেট করার জন্য সিড ব্যবহার করা হয়েছে। ViewModel তৈরি করার সময় জেনারেট করা হয়েছে।
randomGoodDeed String SavedState + ভেরিয়েবল ফ্র্যাগমেন্ট প্রথমবার তৈরি করার সময় জেনারেট করা হয়। randomGoodDeed সেভ করা হয় যাতে প্রসেস বন্ধ করা ও আবার তৈরি করার পরেও ব্যবহারকারী একই র‍্যান্ডম ভালো কাজ দেখতে পান।
isEditing Boolean SavedState + ভেরিয়েবল ব্যবহারকারী এডিট করা শুরু করলে বুলিয়ান ফ্ল্যাগ true-এ সেট করা হয়। isEditing সেভ করা হয় যাতে ফ্র্যাগমেন্ট আবার তৈরি করার সময় স্ক্রিনের এডিটিং অংশ দেখা যায়।
এডিট করা টেক্সট Editable রাজ্য দেখুন (EditText-এর মালিকানাধীন) EditText ভিউতে এডিট করা টেক্সট। EditText ভিউ এই টেক্সট সেভ করে যাতে ব্যবহারকারীর প্রসেসে থাকা পরিবর্তন হারিয়ে না যায়।

টেবিল ২: র‍্যান্ডম টেক্সট জেনারেটর অ্যাপকে অবশ্যই ম্যানেজ করতে হবে এমন স্টেট।

নিম্নলিখিত বিভাগগুলি বর্ণনা করে যে কীভাবে ডেস্ট্রাক্টিভ অপারেশনের মাধ্যমে আপনার ডেটার অবস্থা সঠিকভাবে ম্যানেজ করবেন।

রাজ্য দেখুন

ভিউ নিজের অবস্থা ম্যানেজ করার জন্য দায়ী। যেমন, কোনও ভিউ ব্যবহারকারীর ইনপুট গ্রহণ করলে, কনফিগারেশন পরিবর্তন ম্যানেজ করার জন্য সেই ইনপুট সেভ ও রিস্টোর করার দায়িত্ব ভিউয়ের। Android ফ্রেমওয়ার্কের মাধ্যমে প্রদান করা সব ভিউয়ের নিজস্ব onSaveInstanceState() ও onRestoreInstanceState() ইমপ্লিমেন্টেশন আছে, তাই আপনার ফ্র্যাগমেন্টের মধ্যে ভিউ স্টেট ম্যানেজ করতে হবে না।

যেমন, আগের পরিস্থিতিতে, এডিট করা স্ট্রিং একটি EditText-এ রাখা হয়। EditText-এর কাছে যে টেক্সট দেখানো হচ্ছে তার ভ্যালু এবং অন্যান্য বিবরণ, যেমন বেছে নেওয়া যেকোনও টেক্সটের শুরু ও শেষ সংক্রান্ত তথ্য থাকে।

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

<EditText
    android:id="@+id/good_deed_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

সারণী ১-এ যেমন উল্লেখ করা হয়েছে, ফ্র্যাগমেন্ট সরিয়ে দেয় না বা হোস্ট নষ্ট করে না এমন সব অপারেশনের মাধ্যমে ভিউ তার ViewState সেভ ও রিস্টোর করে।

SavedState

আপনার ফ্র্যাগমেন্ট অল্প পরিমাণে ডায়নামিক স্টেট ম্যানেজ করার জন্য দায়ী যা ফ্র্যাগমেন্ট কীভাবে কাজ করে তার অবিচ্ছেদ্য অংশ। আপনি Fragment.onSaveInstanceState(Bundle) ব্যবহার করে সহজে-সিরিয়ালাইজ করা ডেটা রিটেন করতে পারবেন। Activity.onSaveInstanceState(Bundle)-এর মতোই, আপনি বান্ডেলে যে ডেটা রাখেন তা কনফিগারেশন পরিবর্তন এবং প্রসেস বন্ধ করা ও রিক্রিয়েশনের মাধ্যমে রেখে দেওয়া হয় এবং আপনার ফ্র্যাগমেন্টের onCreate(Bundle), onCreateView(LayoutInflater, ViewGroup, Bundle) এবং onViewCreated(View, Bundle) পদ্ধতিতে উপলভ্য থাকে।

আগের উদাহরণটি নিয়ে আলোচনা করা যাক, randomGoodDeed হল সেই দলিল যা ব্যবহারকারীকে দেখানো হয় এবং isEditing হল একটি ফ্ল্যাগ যা নির্ধারণ করে যে ফ্র্যাগমেন্টটি EditText দেখাবে নাকি লুকাবে। এই সেভ করা স্ট্যাটাস onSaveInstanceState(Bundle) ব্যবহার করে চালিয়ে যেতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putBoolean(IS_EDITING_KEY, isEditing)
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed)
}

জাভা

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(IS_EDITING_KEY, isEditing);
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed);
}

onCreate(Bundle)-এ স্ট্যাটাস ফিরিয়ে আনতে, বান্ডেল থেকে সেভ করা ভ্যালু ফিরিয়ে আনুন:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    isEditing = savedInstanceState?.getBoolean(IS_EDITING_KEY, false)
    randomGoodDeed = savedInstanceState?.getString(RANDOM_GOOD_DEED_KEY)
            ?: viewModel.generateRandomGoodDeed()
}

জাভা

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        isEditing = savedInstanceState.getBoolean(IS_EDITING_KEY, false);
        randomGoodDeed = savedInstanceState.getString(RANDOM_GOOD_DEED_KEY);
    } else {
        randomGoodDeed = viewModel.generateRandomGoodDeed();
    }
}

সারণী ১-এ যেমন উল্লেখ করা হয়েছে, মনে রাখবেন যে ফ্র্যাগমেন্ট ব্যাকস্ট্যাকে রাখা হলে ভেরিয়েবলগুলি রেখে দেওয়া হয়। সেগুলিকে সেভ করা স্টেট হিসেবে বিবেচনা করলে সব ডেস্ট্রাক্টিভ অপারেশন জুড়ে সেগুলি বজায় থাকে।

NonConfig

NonConfig ডেটা আপনার ফ্র্যাগমেন্টের বাইরে রাখতে হবে, যেমন ViewModel-এ। আগের উদাহরণে, seed (আমাদের NonConfig স্টেট) ViewModel-এ তৈরি করা হয়েছে। এর স্ট্যাটাস বজায় রাখার লজিক ViewModel-এর মালিকানাধীন।

Kotlin

public class RandomGoodDeedViewModel : ViewModel() {
    private val seed = ... // Generate the seed

    private fun generateRandomGoodDeed(): String {
        val goodDeed = ... // Generate a random good deed using the seed
        return goodDeed
    }
}

জাভা

public class RandomGoodDeedViewModel extends ViewModel {
    private Long seed = ... // Generate the seed

    private String generateRandomGoodDeed() {
        String goodDeed = ... // Generate a random good deed using the seed
        return goodDeed;
    }
}

ViewModel ক্লাসটি সহজাতভাবে ডেটাকে কনফিগারেশন পরিবর্তন, যেমন স্ক্রিন রোটেশন, থেকে বাঁচতে দেয় এবং ফ্র্যাগমেন্টটি ব্যাক স্ট্যাকে রাখা হলে মেমরিতে থেকে যায়। প্রসেস বন্ধ করা ও রিক্রিয়েশনের পরে, ViewModel রিক্রিয়েট করা হয় এবং নতুন seed জেনারেট করা হয়। আপনার ViewModel-এ SavedState মডিউল যোগ করলে, ViewModel-কে প্রসেস বন্ধ করা ও রিক্রিয়েশনের মাধ্যমে সহজ অবস্থা বজায় রাখতে দেয়।

অতিরিক্ত রিসোর্স

ফ্র্যাগমেন্ট স্টেট ম্যানেজ করা সম্পর্কে আরও তথ্য পেতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন।

কোডল্যাবস

নির্দেশিকা