قسمت های دیگر این مطلب:

Fragment در اندروید بسیار پر کاربرد است و تقریبا در هر نرم افزار حرفه‌ای می‌توان آن را مشاهده کرد.

Fragment چیست و چه کاربردی دارد؟

استفاده از Fragment فرایند توسعه نرم افزار را ساده تر، سریع تر و دقیق تر می کند ولی الزامی به استفاده از آن نیست.

استفاده از Fragment منجر به ماژولار شدن نرم افزار شما می‌شود، فرض کنید یک بخش در نرم افزار خود دارید که در چند جای نرم افزار مورد استفاده قرار گرفته است. طبیعتا این بخش شامل لایه نمایش و کدهای برنامه نویسی است.

شاید اولین راهی که به ذهن شما برسد پیاده سازی این لایه نمایش و سورس کدهای این بخش و Copy و Past کردن آن در دیگر اکتیویتی‌ها و لایه‌های نمایش است.

Fragment این پروسه‌های تکراری را ساده کرده و این بخش‌ها را به صورت ماژول در می‌آورد تا به سادگی قابل استفاده باشند.

البته استفاده از Fragment به همین جا ختم نمی‌شود و گاهی Fragment‌ها برای مقاصد خاصی استفاده می‌شوند که حتی فاقد لایه نمایش هستند.

همانطور که در این قسمت آموزش اندروید دیدید Activity‌ها برای خود یک چرخه حیات دارند، Fragment‌ها نیز چرخه حیاتی مخصوص به خود دارند که البته مستقل از چرخه حیات Activity نیست و با آن مشترکاتی دارد.

در تصویر زیر چرخه حیات Activity و Fragment را در کنار هم ببینید:

مقایسه چرخه حیات اکتیویتی و چرخه حیات فرگمنت هیتوس

onAttach: اولین مرحله از چرخه حیات Fragment که وقتی فراخوانی می‌شود نشان می‌دهد فراگمنت به Activity متصل شده است.

onCreate: کلاس Fragment اجرا شده ولی هنوز رابط کاربری و UI آن آماده نیست.

onCreateView: در این مرحله UI فراگمنت جاری ساخته شده و خروجی این متد یک View است.

onActivityCreated: در این مرحله OnCreateاکتیویتی شروع به اجرا می‌کند.

onStart: شروع فعالیت Fragment.

onResume: زمانی که Fragment اجرا شده و به حالت پایدار رسیده و کاربر آن را مشاهده و می‌تواند از آن استفاده کند.

onPause و onStop: این دو که پشت سر هم اجرا می‌شوند منجر به متوقف شدن Fragment و غیر فعال شدن آن می‌شوند.

onDestroyView و onDestroy: که منجر به نابودی لایه نمایش و از بین رفتن Fragment می‌شوند. اگر به مرحله onDestroyView رفته و پس از آن فراگمنت قصد دوباره اجرا شدن داشته باشد، چرخه خود را از onCreateView شروع می‌کند ولی اگر به مرحله onDestroy برود اجرای Fragment از اولین مرحله شروع می‌شود.

onDetach: در این مرحله Fragment از Activity خود جدا می‌شود و چرخه حیات Fragment به پایان می‌رسد.

حال با هم یک Fragment ایجاد می‌کنیم:

یک لایه نمایش برای Fragment در مسیر لایه‌های پروژه خود با نام hitos_fragment و با سورس زیر ایجاد می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F55D69">
    <TextView
        android:text="One Fragment"
        android:textColor="#fff"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
</RelativeLayout>

به پکیج اصلی نرم افزار خود رفته و کلاس HitosFragment را مانند زیر ایجاد می‌کنیم:

package ir.hitos.hitos;
import android.support.v4.app.Fragment;

public class HitosFragment extends Fragment {

}

هنگام ایجاد کلاس و extends کردن آن از Fragment چند کلاس برای import کردن به نرم افزار به شما پیشنهاد داده می‌شود که حتما  android.support.v4.app.Fragment را فراخوانی کنید.

کلیدهای ترکیبی Ctrl + O را با هم فشار داده تا لیست متدهایی که برای کلاس Fragment قابلیت Overide شدن دارند برای شما نمایان شود.

در لیست ظاهر شده گزینه onCreateView را کلیک کنید. مقدار return پیشفرض این متد را به شکل زیر ویرایش کنید:

return inflater.inflate(R.layout.hitos_fragment, container, false);

توجه کنید که ورودی اول این متد نام لایه نمایش Fragment است.

به لایه اصلی نمایش پروژه خود رفته و آن را به شکل زیر ویرایش می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="ir.hitos.hitos.HitosFragment">
    </fragment>

</android.support.constraint.ConstraintLayout>

همانطور که در سطرهای 7 تا 12 می‌بینید یک fragment اضافه کردیم. در خط 11 در android:name آدرس Fragment را وارد کردیم.

اگر برنامه خود را در ماشین مجازی اجرا کنید خواهید دید، Fragment اجرا خواهد شد:

fragment

گاهی لازم می‌شود که Fragment را نه به صورت بالا بلکه از Activity فراخوانی کنید. بدین منظور لایه کاربری activity_main.xml را به صورت زیر ویرایش کنید:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</RelativeLayout>

در سطرهای 7 تا 11 یک FrameLayout ایجاد کردیم. FrameLayout‌ها مانند ظرفی هستند که می‌توان در آن هر محتوایی را قرار داد. در ادامه قصد داریم کدهایی در MainActivity قرار دهیم که Fragment را درون FrameLayout قرار دهیم.

کلاس MainActivity را مانند زیر ویرایش می‌کنیم:

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction= fragmentManager.beginTransaction();
        transaction.add(R.id.frame_layout, new HitosFragment());
        transaction.commit();
    }
}

در سطر هفت یک FragmentManager ایجاد کردیم. توجه داشته باشید در حین تایپ این عبارت باید آن FragmentManager‌ای را از لیست راهنما انتخاب کرد که به android.support مربوط می‌شود:

آموزش اندروید

در سطر بعدی FragmentTransaction را برای شروع عملیات انتقال Fragment انتخاب می‌کنیم. در وارد کردن این دستور نیز توجه کنید از لیست کلاس‌ها باید آن موردی که android.support باشد را انتخاب کنید.

در سطر بعدی با دستور add عملیات اضافه کردن Fragment انجام می‌پذیرد. متد add دو ورودی دارد اولی شناسه لایه FrameLayout که در فایل activity_main قرار گرفته بود و دومی کلاس Fragment مورد نظر است.

عملیات انتقال با دستور commit پایان می‌پذیرد، و نتیجه مانند فوق خواهد بود.

گاهی نیاز است بر اساس نیاز پروژه مثلا با کلیک روی یک کلید، Fragment را با Fragment دیگر جایگزین کرد. برای تست این موضوع یک لایه کاربری به نام hitos_fragment2 ایجاد و در آن محتویات hitos_fragment را قرار می‌دهیم و فقط متن android:text="One Fragment" را به android:text="Two Fragment" تبدیل می‌کنیم.

کلاس جدید به نام HitosFragment2 ایجاد و همان محتویات HitosFragment را در آن درج، و تنها در آن بخشی که لایه نمایش Fragment را مشخص می‌کنیم باید نام hitos_fragment2 را قرار دهیم.

پس یک Fragment جدید داریم که ظاهر و عملکردی مانند Fragment اول دارد، با این تفاوت که متنی که نمایش می‌دهد متفاوت است.

به لایه activity_main خود یک کلید اضافه کرده و به آن شناسه btn می‌دهیم.

متد onCreate کلاس MainActivity را به شکل زیر ویرایش می‌کنیم:

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

        final FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction= fragmentManager.beginTransaction();
        transaction.add(R.id.frame_layout, new HitosFragment());
        transaction.commit();

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                FragmentTransaction fragmentReplace = fragmentManager.beginTransaction();
                fragmentReplace.replace(R.id.frame_layout, new HitosFragment2());
                fragmentReplace.commit();
            }
        });
    }

بدین ترتیب وقتی روی کلید کلیک می‌کنید Fragment جاری شما به Fragment دیگری تبدیل می‌شود:

fragment تعویض ها

البته می‌توان کلیدی ایجاد کرد که Fragment جاری را پاک کند. برای تست این کار متد onCreate را مانند زیر ویرایش می‌کنیم تا با کلید قبلی بتوان Fragment را پاک کرد:

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

        final HitosFragment frag = new HitosFragment();
        final FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction= fragmentManager.beginTransaction();
        transaction.add(R.id.frame_layout, frag);
        transaction.commit();

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                FragmentTransaction fragmentRemove = fragmentManager.beginTransaction();
                fragmentRemove.remove(frag);
                fragmentRemove.commit();
            }
        });
    }
  • سطر 6: همانطور که می‌بینید یک شی از کلاس HitosFragment به نام frag ایجاد کردیم.
  • سطر 9: برای فراخوانی اولیه Fragment از شی ایجاد شده در سطر 6 استفاده کردیم.
  • سطر 18: به وسیله شی جدید frag اقدام به حذف Fragment از لایه اصلی می‌کنیم.

نتیجه را در زیر می‌بینید:

پاک کردن Fragment

امیدوارم این آموزش برای شما مفید بوده باشد.

تگ ها: android / اندرویدandroid studio