مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش کار با فرگمنت ( Fragment ) ها در اندروید در زمان اجرا

اندازه صفحه دستگاه های اندرویدی بسیار متنوع است. این اندازه از گوشی های 3.5 اینچی شروع شده و تا 10 یا 13 اینچ می رود. بهتر است شما برنامه اندروید خودتان را طوری طراحی کنید که UX قوی داشته باشد باید اندازه صفحه را نیز در نظر بگیرید. در کار با Fragment ها می توان کاری کرد که UX کمی بهبود داده شود. همانطور که در مثال چت تلگرام در مطلب قبلی گفتیم در گوشی های کوچک یک Fragment دیده می شود ولی در دستگاه های با صفحه های بزرگ مانند تبلت ها می توان چند Fragment را کنار یکدیگر مشاهده کرد. برای مثال عکس زیر را ببینید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
وب سایت توسینسو

در عکس بالا ما دو Fragment در یک activity داریم که حالت نمایش آنها با توجه به اندازه صفحه نمایش تغییر می کند. یعنی در یک صفحه بزرگ هر دوی FragmentA , FragmentB نشان داده می شود ولی در دستگاه های کوچک فقط یک Fragment نمایش داده می شود و می توان از یک Fragment به Fragment دیگری رفت. اگر بخواهیم در زمان اجرا با Fragment ها کار کنیم باید از کلاس FragmentManager استفاده کنیم. این کلاس متدهایی را در خود دارد که می توانیم با کمک این متد ها Fragment ها را به یک activity اضافه کنیم و یا آن ها را از activity حذف کنیم و یا Fragmentها را با یکدیگر در داخل activity جایگزین کنیم.

اضافه کردن یک Fragment به activity در زمان اجرا

در قسمت های قبل گفتیم که می توان در زمان طراحی برنامه و در فایل layout مربوط به Activity با استفاده از تگ fragment، یک یا چند Fragment را به برنامه اضافه کرد. ولی مشکلی که این کار دارد این است که استاتیک و ثابت است. حال اگر ما بخواهیم در زمان اجرا Fragment ها را تغییر بدهیم و به خاطر ثابت بودن نمی توانیم این کار را انجام بدهیم. همانطور که گفتیم در زمان اجرا ما با استفاده از FragmentManager کارهای حذف و اضافه و تغییر Fragment ها را انجام میدهیم.

به شکلی که با استفاده از این کلاس ما یک FragmentTransaction می سازیم. سپس از FragmentTransaction برای اضافه و حذف و جاگزینی و سایر کارهای مربوط به Fragment ها را انجام می دهیم. یک نکته مهم که باید در مورد کار با Fragment ها به آن توجه کنید این است که وقتی شما با Fragment ها کار می کنید باید دقت داشته باشید مخصوصا زمانی که می خواهید با Fragment ها در زمان اجرا کار کنید این است که در داخل layout مربوط به activity ها یک ویویی قرار دهیم که از نوع container باشد و بتوانیم Fragment را در داخل ان قرار دهیم. به طور مثال از ویوی FragmentLayout می توان برای قرار دادن Fragment ها استفاده کرد. مانند کد زیر

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

برای این که در کد جاوا FragmentManger مورد نظر را به دست آوریم از متد getSupportManager استفاده می کنیم. دقت داشته باشید که برای شروع به کار باید ابتدا یک تراکنش Fragment را شروع کنیم و بعد از آن اقدام به اضافه کردن Fragment مورد نظر کنیم. و بعد از این که Fragment را اضافه کردیم باید متد commit مربوط به تراکنش مورد نظر را فراخوانی نماییم. دقت داشته باشید که ممکن است که در طی برنامه چندین تراکنش را شروع کنیم و سپس آن را commit نماییم. برای مثال در کد زیر یک Fragment به کد layout که در بالا نوشتیم اضافه شده است.

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // چک کردن این که اکتیویتی ما جایی برای فرگمنت دارد یا خیر
        if (findViewById(R.id.fragment_container) != null) {

            
            if (savedInstanceState != null) {
                return;
            }

            // ساخت یک فرگمنت جدید
            HeadlinesFragment firstFragment = new HeadlinesFragment();



            // اضافه کردن فرگمن به اکتیویتی
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

چون که ما Fragment را در زمان اجرا به activity اضافه کردیم پس بعدا می توانیم در زمان اجرا آن را حذف کنیم و یا با یک Fragment دیگر آن را جاگزین نماییم. ولی اگر این کار را با <fragment> انجام داده بودیم نمی توانستیم این کار را بکنیم.

جاگزین کردن یک Fragment با دیگری

نحوه انجام کار جایگزینی یک Fragment با Fragment دیگر شبیه به اضافه کردن است ولی باید از متد replace به جای متد add استفاده کنیم. دقت داشته باشید که وقتی شما کاری مانند اضافه کردن و یا حذف و یا جایگزین کردن را بر روی Fragment انجام می دهید به دنبال آن می توانید این اجازه را به کاربر بدهید که کاری را که کرده است را undo کند و به عقد برگردد. برای این بازگشت به عقب باید قبل از این که شما تراکنش ساخته شده را قبل از این که commit کنید، آن را addToBackStack کنید. دقت داشته باشید که وقتی که شما این متد را قبل از commit کردن صدا می زنید fragment ی که می خواهید حذف کنید حذف نخواهد شود و فقط در حالت Stop نگهداری می شود و وقتی که کاربر دکمه back را زد fragment دوباره ریستارت می شود ولی وقتی که این متد اضافه نشده باشد وقتی که شما یک Fragment را حذف می کنید و یا آن را جایگزین می کنید دیگر آن فرگمنت نابود خواهد شد. در مثال زیر کدی آورده شده است که این مفاهیم را نشان می دهد.

// ساخت فرگمنت
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

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

// Commit the transaction
transaction.commit();

ورودی که متد addToBackStack می گیرد یک رشته اختیاری است که برای کارهای پیشرفته می توان از آن استفاده کرد.ITPRO باشید.

نویسنده: مهدی عادلی فر

منبع: Itpro

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات