خانه » لایبرری های مفید و تجربیات شخصی خیلی مفید !!! » نکات استفاده از فرگمنت ها Fragment tips (استفاده از Constructor و savedInstanceState)

نکات استفاده از فرگمنت ها Fragment tips (استفاده از Constructor و savedInstanceState)

زمانی که با فرگمنت ها کار می کنید باید به چندین نکته دقت کنید.
این نکات تجربیات شخصی من هست که ندونستن اون ها زمان زیادی از من گرفت ، امیدوارم بدردتون بخوره (این پست به روز می شود و نکات جدید به آن اضافه خواهد شد.)

همان طور که می دانید با فرگمنت ها میشه مثل کلاس های جاوا برخورد کرد ، یعنی میشه واسشون Constructor تعریف کرد و متغیر هارو از طریق اون به فرگمنت ارسال کرد . مثلا من زمانی که یک فرگمنت را فراخوانی می کنم قصد ارسال یک کد رو هم به اون دارم .

خوب در فرگمنت خودم یک Constructor درست می کنم :

public class MyFragment extends Fragment {

    private int id;

    public MyFragment (int id){
       this.id=id;
    }
     
}

خوب با این روش زمان ساخته شدن فرگمنت یک id نیز به آن میفرستم

 Fragment myFragment= new MyFragment(22);

به همین سادگی یک متغیر را به فرگمنت ارسال کردم .
اما قصه از همین جا شروع میشه ، حالا کافیه صفحه رو بچرخونید یا برنامه رو برای مدت زیادی در renectApps نگه دارید و دوباره باز کنید ، میبینید که برنامه اکسپشن می دهد.
دلیل چیه ؟!
خوب کلاس MyFragment دوباره می خواد ساخته بشه ، اما اینبار کسی نیست تا Constructor را فراخوانی و مقدار دهی کند !!!!
راه حل چیست ؟
اندروید برای این مواقع یک Bundle گذاشته به اسم savedInstanceState که حتما زیاد اون رو دیدید .

نحو استفاده از اون به چه شکلی هست ؟

۳ کار باید اینجا انجام بدیم :

۱ : یک Constructor خالی به کلاس اضافه کنید.

  public MyFragment(){
  }

۲ : متد onSaveInstanceState را override کنید و متغییر هایی که نیاز دارید را در Bundle موجود در آن put کنید

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("id",id);
        super.onSaveInstanceState(outState);
    }

۳ : متد onCreate را override کنید و مقدار متغییر خود را پس بگیرید

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState!=null){
            id=savedInstanceState.getInt("id");
        }
    }

تمام شد ، حالا هر وقت اندروید بخواد فرگمنت رو دوباره بسازه اگر از قبل باز بوده باشه زمان حذف کردن آن مقدار متغییر هارو درون یک Bundle میریزد (در متد onSaveInstanceState و سپس دوباره موقع فراخوانی مقدار اون رو در onCreate برمی گرداند.

constructor خالی هم برای زمانی هست که نیاز به ساختن فرگمنت دارد .

در کل این ۳ متد باید اضافه شود :

    public MyFragment(){
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("id",id);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState!=null){
            id=savedInstanceState.getInt("id");
        }
    }

در این bundle متغیر های دیگری هم که نیاز دارید زمان چرخش گوشی از بین نروند رو هم میتونید قرار بدید.
موفق باشید

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

4 دیدگاه

  1. سلام دوست عزیز
    ————————————
    خدا قوت
    ———————————-

    عالی بود

  2. سلام

    خیلی خوبه که بدون چشم داشتی تجربیات خودمون رو در تختیار هم بزاریم. مرسی.

    و اما در خصوص ذخیره اطلاعات درون یک بندل درست عمل کردین ولی موقع بازیابی بهتر بود از متد

    onRestoreInstanceState

    استفاده میکردین.

    وقتی که اکتیویتی به حالت دِستروی میره متد

    onSaveInstanceState

    اجرا میشه و وقتی اکتیویتی میخواد دوباره ساخته بشه متد

    onRestoreInstanceState

    اجرا میشه. پس بهتر بود اطلاعات ذخیره شده رو در متد

    onRestoreInstanceState

    دریافت بکنین. کد شما هم کاملا درست کار میکنه ولی باعث زیاده کاری شده و همچنین با استفاده از تابع

    onRestoreInstanceState

    کد ها یک جا قرار میگیرن و نیازی به شرط گذاشتن نیست.کدتون میشه مثل زیر و دیگه نیازی به کد درون متد آنکِریت نیست.

        protected void onRestoreInstanceState(Bundle SaveInstanceState) {
            super.onRestoreInstanceState(SaveInstanceState);
            id=savedInstanceState.getInt("id");
        }

    امیدوارم کمک کننده بوده باشه و منظورم رو رسونده باشم.

    یاحق.

  3. نکته عالی بووووود بهش برخوردم

    ممنون

  4. مطالب عالی بود…مرسی

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا