Fragment در اندروید

Fragment ها اجزای قابل استفاده مجدد در یک activity هستند.

فرض کنید در حال ساخت یک برنامه ایمیل هستید.اگر برنامه شما روی گوشی در حال اجرا باشد دارای یک صفحه برای نمایش لیست ایمیل ها و یک صفحه برای جزئیات ایمیل ها خواهد بود.حال فرض کنید بخواهید که در تبلت ها یک صفحه ۲ ستونه برای این کار داشته باشید.رویکرد بدون استفاده از Fragment این هست که طراحی به صورت کامل برای گوشی و تبلت مجزا باشد .ولی با استفاه از Fragmentها نیاز به طراحی مجزا نیستیم.

fragments

lifecycle یک Fragment  به صورت مشخص تاثیر گرفته از activityی است که در آن قرار گرفته است.مثلا زمانی که یک activity به وضعیت paused می رود تمام fragmentهای داخل آن نیز به وضیعت paused می روند و همچنین اگر یک activity  به وضعیت destroyed برود ، fragmentها نیز destroyed می شوند.

می توانیم fragmentها به activity اضافه و یا حذف کنیم.همچنین می توانیم آن ها را در back stack قرار دهیم.برای ایجاد یک Fragment نیاز هست که از کلاس Fragment ارث بری کنید.

fragmentها نیز به مانند activity ها دارای callbackهای onCreate(), onStart(), onPause(), و onStop() هستند که در صورت نیاز باید از آن ها استفاده کنیم.

lifecycle یک Fragment در تصویر زیر قابل مشاهده است:

fragment_lifecycle

onCreate():

زمانی که سیستم در حال ساخت Fragment است این متد فراخوانی می شود و در آن می توانیم مواردی را مقدار دهی کنیم که نیاز است در هر بار paused یا stopped از بین نروند.

onCreateView():

زمانی که سیستم در حال ترسیم ui هست این متد فراخوانی می شود که ما باید به عنوان خروجی یک view بر گردانیم.همچنین در صورتی که Fragment ما ui ندارد می بایست null برگشت دهیم.

onPause():

زمانی که کاربر Fragment را ترک می کند این متد فراخوانی می شود.بهتر است اطلاعاتی که کاربر نیاز دارد را ذخیره کنیم .

onAttach():

زمانی که Fragment  برای اولین بار با activity وصل شد.

onDetach():

زمانی که Fragment از activity جدا شد.

برای اضافه کردن ui به fragment به شکل زیر عمل می کنیم:

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

از طریق دو راه می توان fragment را به یک activity اضافه کرد:

تعریف fragment داخل layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

استفاده از fragmentManager.

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

همچنین اگر نیاز بود که Fragment را به backstack اضافه کنید باید به شکل زیر عمل کنید:


// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

برای بازیابی Fragment ها باید متد onBackPressed به شکل زیر پیاده شود:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() &amp;gt; 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

دقت کنید اگر در یک transaction کارهای مختلفی از قبیل اضافه کردن،حذف کردن و جایگزین کردن را انجام داده باشید با زدن دکمه back همه آنها یک جا برگردانده می شوند.
توجه به این نکته ضروری است که صدا زدن commit() به معنی انجام شدن تراکنش در همان لحظه نیست.بلکه تراکنش صف خواهد شد و در زمانی که نوبتش رسید اجرا می شود.

تصویر زیر نشان دهنده lifecycle یک activity در مقابل lifecycle یک fragment است:

activity_fragment_lifecycle

 

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *