سبد (0)

ارتباط فرگمنت ها

آن چه در این آموزش فرا می گیرید:

  1. تعریف یک واسط
  2. پیاده سازی کردن Interface
  3. تحویل یک پیغام به Fragment

مواردی که باید مطالعه کرده باشید:

  • Fragmentها

خودتان امتحان کنید:

دانلود دمو »

ارتباط با سایر framentها

به منظور استفاده ی مجدد از کامپوننت های واسط گرافیکی fragment، می بایست هر یک از کامپوننت ها را به صورت مولفه های ماژولار مستقل ایجاد کرد. این مولفه ها، چیدمان و رفتار تعریف شده ی مخصوص به خود را دارا هستند. هنگامی که fragmentهای قابل استفاده را تعریف کردید، می توان آن ها را با یک activity مرتبط کرد و آن ها را با منطق برنامه متصل کرد و یک واسط گرافیکی ترکیبی را ایجاد کرد.

برخی اوقات می خواهید یک fragment با دیگری ارتباط داشته باشد، مثلاً می خواهید محتوا را بر اساس رویداد کاربر تغییر دهید. همه ی ارتباط های بین دو fragment از طریق Activity مرتبط امکان پذیر است. دو fragment نباید مستقیماً ارتباط برقرار کنند.


تعریف یک واسط

برای اینکه اجازه بدهیم یک fragment با activity بالاسریش ارتباط برقرار کند، می توان یک interface در کلاس Fragment تعریف کرد و آن را در کلاس Activity پیاده سازی کرد. Fragment پیاده سازی interface را با استفاده از متد ()onAttach چرخه ی حیات دریافت می کند و سپس می تواند متدهای interface را برای ارتباط با Activity فراخوانی کند.

در زیر یک مثال برای ارتباطا بین activity و fragment آورده شده است:


public class HeadlinesFragmentextendsListFragment{
OnHeadlineSelectedListener mCallback;

// Container Activity must implement this interface
publicinterfaceOnHeadlineSelectedListener{
publicvoid 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){
thrownewClassCastException(activity.toString()
+" must implement OnHeadlineSelectedListener");
}
}

...
}

حالا fragment می تواند پیغام هایی را به activity با فراخوانی متد ()onArticleSelected (یا سایر متدهای واسط) تحویل دهد. این کار با استفاده از نمونه ی mCallBack مربوط به واسط onHeadlineSelectedListener انجام داد.

برای مثال، وقتی کاربر روی یکی از آیتم های لیست کلیک می کند، متد زیر در fragment صدا زده می شود. fragment از Intrface برای تحویل رویداد به activity والد استفاده می کند.

Title

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

پیاده سازی کردن Interface

یک activity، برای دریافت رویدادهای یک fragment، می بایست interfaceی که داخل کلاس fragment تعریف شده است را پیاده سازی کند.

برای مثال، Activity زیر interface مثال بالا را پیاده سازی می کند:

پیاده سازی interface

 
public static class MainActivity extends Activity
implementsHeadlinesFragment.OnHeadlineSelectedListener{
...

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


تحویل یک پیغام به Fragment

activity میزبان می تواند پیغام ها را به fragment تحویل دهد. برای این کار باید با استفاده از ()findFragmentById، نمونه ی Fragment را بدست بیاورد، سپس مستقیماً متدهای عمومی fragment را فراخوانی می کند.

برای نمونه، تصور کنید activity ای که در بالا نشان داده شد، ممکن است یک fragment دیگر داشته باشد. وظیفه ی این fragment نمایش یک آیتم بر اساس اطلاعات ارسالی از fragment بالاست. در این حالت، activity می تواند اطلاعات دریافتی از متد قبلی را به fragmentی که قصد نمایش آیتم را دارد تحویل دهد:

تحویل اطلاعات از Activity به fragment دیگر

 
public static class MainActivity extends Activity
implementsHeadlinesFragment.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 =newArticleFragment();
Bundle args =newBundle();
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();
}
}
}
تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehiمجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامیپرداخت آنلاین -  بانک ملتمعرفی بیاموز در شبکه سهپرداخت آنلاین - بانک اقتصاد نوینپرداخت آنلاین - بانک سامان