چگونه بین 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 } }
از داخل یک 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 اینجی باز کنید فقط لیست چت ها را می بینید که با کلیک بر روی هر چت لیست چت ها بسته شده و محتویات چت به شما نشان داده می شود.
یادگیری برنامه نویسی برای متخصصین حوزه کامپیوتر این روزها یک الزام به حساب می آید. از جمله محبوب ترین زبان های برنامه نویسی دنیا می توانیم به زبان برنامه نویسی سی شارپ ، زبان برنامه نویسی جاوا ، زبان برنامه نویسی پایتون ، زبان برنامه نویسی سی پلاس پلاس و زبان برنامه نویسی SQL ( لازمه هر زبان دیگری ) و زبان برنامه نویسی PHP اشاره کنیم.
برای آموزش برنامه نویسی می توانید با خیال راحت در قالب دوره های آموزش برنامه نویسی سایت توسینسو ، آموزش سی شارپ ، آموزش جاوا ، آموزش پایتون ، آموزش جنگو ، آموزش PHP ، آموزش جاوا اسکریپت ، آموزش برنامه نویسی اندروید ، آموزش SQL و آموزش MySQL را بصورت جامع و حرفه ای آموزش ببینید.
بنیانگذار توسینسو و برنامه نویس
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود