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

آموزش ایجاد ارتباط بین Fragment ها و Activity ها در اندروید

چگونه بین Fragment ها و Activity ها در برنامه نویسی اندروید ارتباط برقرار کنیم؟ در مطلب قبل گفتیم که می توان Fragment ها را یک بار ساخت و چندین جا از آن استفاده کرد. حال برای این کار شما باید Fragment ها را به شکلی طراحی کنید که هر Fragment مستقل باشد و خودش layout و رفتار خودش را طراحی و تعریف کند. وقتی که شما این کار را انجام دادید شما می توانید در داخل activity این Fragment ها را قرار دهید و بتوانند با هم کار کنند و با هم ارتباط برقرار کنند و با هم بتوانند یک UI قوی بسازند و یک منطق قوی نیز پیاده سازی نمایند.

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

نوع ارتباطی که بین دو Fragment برقرار می شود این است که وقتی اتفاقی در یک Fragment می افتد Fragment دیگر نیز تغییر کند. برای مثال شما لیست چت ها در تلگرام را به عنوان یک Fragment در نظر بگیرید و قسمتی که متن چت ها را نشان می دهد را نیز یک Fragment در نظر بگیرید. در این صورت وقتی که بر روی یک چت کلیک می کنید باید چت مورد نظر در Fragment دیگر باز شود. این ارتباط بین دو Fragment باید از طریق activity بپردازد و Fragment ها به طور مستقیم با هم ارتباط ندارند. حال در ادامه به این که چگونه این ارتباط را برقرار کنیم توضیح خواهیم داد.

تعریف اینترفیس

برای این که اجازه دهیم ک یک Fragment با Activity ارتباط برقرار کند می توانید یک اینترفیس در داخل Fragment تعریف کنید و آن را داخل activity پیاده سازی کنید. برای استفاده از آن هم Fragment وقتی ساخته می شود یعنی در متد onAttach آن اینترفیس را دریافت کرده و از داخل آن متدهای activity را فراخوانی می کند. در مثال زیر این ارتباط به شما نشان داده می شود.

public class HeadlinesFragment extends Fragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

در کد بالا یک Fragment تعریف شده است که در داخل آن یک اینترفیس به نام OnHeadlineSelectedListener

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

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Send the event to the host activity
        mCallback.onArticleSelected(position);
    }

پیاده سازی اینترفیس

حال باید در داخل activity اینترفیس را داخل activity پیاده سازی کنیم. این پیاده سازی برای دریافت درخواست های Fragment ها صورت می گیرد. برای مثال در کد زیر این پیاده سازی را انجام داده ایم.

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

ارسال پاسخ به Fragment

از داخل یک activity که چند Fragment دارد می توان به Fragment ها دسترسی پیدا کرد و با آنها کار کرد. برای مثال همان قضیه چت های تلگرام را در نظر بگیرید. ما می خواهیم از داخل activity بگوییم که کدام چت لود شود. برای این کار باید با آن Fragment ارتباط برقرار کنیم. برای پیدا کردن Fragment مورد نظر از متد findFragmentById() استفاده می شود. و بعد از این که Fragment پیدا شد می توان به طور مستقیم متدهای public که در Fragment وجود دارند را فراخوانی نمود. برای مثال در کد زیر ما یک Fragment به نام ArticleFragment داریم که آن را پیدا کرده و از داخل آن متد updateAricleView را صدا می زنیم.

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            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();
        }
    }
}

در کد بالا اگر Fragment مورد نظر پیدا شود که عمل update انجام خواهد شد. ولی اگر پیدا نشد به این معنی است ک باید Fragment جاری را جمع کنیم و Fragment جدید بسازیم و در صفحه نشان دهیم. چند خط آخر نشان دهنده این است که Fragment ساخته شده را جایگزین Fragment جدید می کنیم.

برای این که این قسمت را کامل درک کنید مثال تلگرام و چت های آن را به یاد بیاورید. اگر شما تلگرام را بر روی یک تبلت 10 اینچی باز کنید خواهید دید که در سمت چپ صفحه لیست چت ها است که با کلیک بر روی هر چت چت مورد نظر در سمت راست باز خواهد شد. ولی اگر تلگرام را در یک گوشی 5 اینجی باز کنید فقط لیست چت ها را می بینید که با کلیک بر روی هر چت لیست چت ها بسته شده و محتویات چت به شما نشان داده می شود. توسینسو باشید.

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

منبع: Itpro

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


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

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

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

نظرات