آموزش EventBus در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش EventBus در اندروید می پردازیم در آموزش قبلی EventBus را معرفی کردیم و در این آموزش نحوه استفاده از Eventbus را در برنامه نویسی اندروید یاد خواهید گرفت همانطور که در آموزش قبلی گفتیم که EventBus به منظور ایجاد یک نوع یکپارچگی در برنامه های که از تعداد زیادی اکتیویتی یا فرگمت یا حتی مقدار کد زیاد استفاده کرده باشیم در ادامه با ما همراه باشید.
خروجی برنامه که در آخر خواهید دید همانند زیر است.
در صورتی که با Eventbus آشنا نیستید می توانید از لینک زیر آن را مورد بررسی قرار دهید.
EventBus در اندروید چیست ؟
خب EventBus یک کتاب خانه است و باید همانند دیگر کتاب خانه ها به پروژه اضافه شود.
وارد فایل Build.gradle از نوع Module شده سپس در بخش dependencies خط زیر را اضافه کنید.
1 2 3 | dependencies { compile 'org.greenrobot:eventbus:3.0.0' } |
پروژه را sync کنید باید قند شکن فعال باشد.
یک فایل به نام dimens.xml ایجاد کنید در مسیر res/values ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 | <resources> <dimen name="margin_extra_large">20dp</dimen> <dimen name="margin_large">10dp</dimen> <dimen name="margin_medium">5dp</dimen> <dimen name="padding_large">10dp</dimen> <dimen name="padding_medium">5dp</dimen> </resources> |
در بالا فاصله هایی را که در برنامه استفاده می شود را قرار دادیم.
وارد strings.xml شده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <resources> <string name="app_name">EventBus - Programchi</string> <string name="message_received">Message Received:</string> <string name="message_main_activity">Message received in MainActivity : </string> <string name="message_second_activity">Message received in SecondActivity : </string> <string name="message_fragment">Message received in Fragment : </string> <string name="title_main">MainActivity</string> <string name="title_fragment">Fragment</string> <string name="title_stickyEvent">StickyEvent Example</string> <string name="hint_message">Enter message</string> <string name="send_message_fragment">Send message to Fragment</string> <string name="send_message_activity">Send message to Activity</string> <string name="show_second_activity">Show Second Activity</string> </resources> |
در بالا یکسری داده ها و رشته های از پیش آماده شده را ایجاد کردیم و در برنامه از آنها استفاده خواهد شد.
یک کلاس به نام Events ایجاد می کنیم از این کلاس به منظور نمایش پیام استفاده خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package ir.programchi; public class Events { // Event used to send message from fragment to activity. public static class FragmentActivityMessage { private String message; public FragmentActivityMessage(String message) { this.message = message; } public String getMessage() { return message; } } // Event used to send message from activity to fragment. public static class ActivityFragmentMessage { private String message; public ActivityFragmentMessage(String message) { this.message = message; } public String getMessage() { return message; } } // Event used to send message from activity to activity. public static class ActivityActivityMessage { private String message; public ActivityActivityMessage(String message) { this.message = message; } public String getMessage() { return message; } } } |
در بالا در شکل های مختلف را پیام را نمایش میدهیم به همین منظور از کلاس های متفاوتی درون کلاس بالا ایجاد کردیم.
حالا باید یک کلاس Global به منظور register کردن EvenBus ایجاد کنیم یک کلاس به نام GlobalBus ایجاد می کنیم و کدهای زیر را در آن قرار میدهیم.
1 2 3 4 5 6 7 8 9 10 | package ir.programchi; import org.greenrobot.eventbus.EventBus; public class GlobalBus { private static EventBus sBus; public static EventBus getBus() { if (sBus == null) sBus = EventBus.getDefault(); return sBus; } } |
در بالا یک Instance از EventBus ساختیم که در ادامه ازش استفاده کنیم.
تا اینجا برای ارتباط بین اکتیویتی و فرگمنت های بخش ساده ای را فراهم کرده ایم در ادامه برخی از متد های EventBus را توضیح خواهیم داد.
Register : به منظور ثبت یک رویداد مورد استفاده قرار می گیرد و مثل زیر کاربرد دارد.
1 | GlobalBus.getBus().register(this); |
Un-Register : به منظور برداشتن یک EventBus ثبت نام شده استفاده می شود و مثل زیر کاربرد دارد.
1 | GlobalBus.getBus().unregister(this); |
Broadcast an event : به منظور صدا زدن یک متد یا دستور در یک کلاس یا اکتیویتی یا فرگمنت و مثل زیر کاربرد دارد.
1 | GlobalBus.getBus().post(eventName); |
Receive an event : به منظور دریافت یک رویداد استفاده می شود و مثال آن همانند زیر می باشد.
1 2 3 | @Subscribe public void getMessage(Events.EventName event) { } |
در ادامه به یک مثال ساده که در ابتدای آموزش مشاهده کردید می پردازیم.
ابتدا یک فرگمنت برای این منظور درست می کنیم نام فرگمنت برابر با fragment_user.xml است.
این layout را ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:padding="@dimen/padding_medium"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/margin_medium" android:text="@string/title_fragment" android:textStyle="bold"/> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/title"/> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/message" android:hint="@string/hint_message"/> <Button android:id="@+id/submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/editText" android:layout_centerHorizontal="true" android:text="@string/send_message_activity"/> </RelativeLayout> |
در بالا یکسری input و دکمه برای ارسال داده قرار دادیم.
برای اینکه این کدها را به فرگمنت متصل کنیم باید یک فرگمنت به نام UserFragment.java ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package ir.programchi; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.greenrobot.eventbus.Subscribe; public class UserFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { GlobalBus.getBus().register(this); return inflater.inflate(R.layout.fragment_user, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setClickListener(view); } public void setClickListener(final View view) { Button btnSubmit = (Button) view.findViewById(R.id.submit); btnSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText etMessage = (EditText) view.findViewById(R.id.editText); Events.FragmentActivityMessage fragmentActivityMessageEvent = new Events.FragmentActivityMessage( String.valueOf(etMessage.getText())); GlobalBus.getBus().post(fragmentActivityMessageEvent); } }); } @Subscribe public void getMessage(Events.ActivityFragmentMessage activityFragmentMessage) { TextView messageView = (TextView) getView().findViewById(R.id.message); messageView.setText( getString(R.string.message_received) + " " + activityFragmentMessage.getMessage()); Toast.makeText(getActivity(), getString(R.string.message_fragment) + " " + activityFragmentMessage.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onDestroyView() { super.onDestroyView(); // unregister the registered event. GlobalBus.getBus().unregister(this); } } |
در بالا یک Eventbus را register کردیم و در ادامه هر زمانی که یک رویداد به نام getmessage را صدا بزنیم داده را می توانیم نمایش دهیم همانطور که می بینید یک Toast قرار دادیم.
خب یک اکتیویتی به نام MainActivity.java ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package ir.programchi; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.greenrobot.eventbus.Subscribe; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addFragment(); } @Override protected void onStart() { super.onStart(); GlobalBus.getBus().register(this); } private void addFragment() { getSupportFragmentManager().beginTransaction() .add(R.id.fragmentContainer, new UserFragment()) .commit(); } public void sendMessageToFragment(View view) { EditText etMessage = (EditText) findViewById(R.id.activityData); Events.ActivityFragmentMessage activityFragmentMessageEvent = new Events.ActivityFragmentMessage(String.valueOf(etMessage.getText())); GlobalBus.getBus().post(activityFragmentMessageEvent); } @Subscribe public void getMessage(Events.FragmentActivityMessage fragmentActivityMessage) { TextView messageView = (TextView) findViewById(R.id.message); messageView.setText(getString(R.string.message_received) + " " + fragmentActivityMessage.getMessage()); Toast.makeText(getApplicationContext(), getString(R.string.message_main_activity) + " " + fragmentActivityMessage.getMessage(), Toast.LENGTH_SHORT).show(); } @Override protected void onStop() { super.onStop(); GlobalBus.getBus().unregister(this); } } |
در بالا هم دو تا متد داریم یکی برای اینکه پیام ارسال شود و دیگری به منظور دریافت پیام استفاده می شود.
و در نهایت activity_main.xml همانند زیر خواهد بود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/margin_large" android:background="#cfcfcf"> <RelativeLayout android:id="@+id/activityLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:padding="@dimen/padding_medium"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/margin_medium" android:text="@string/title_main" android:textStyle="bold"/> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/title"/> <EditText android:id="@+id/activityData" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/message" android:hint="@string/hint_message"/> <Button android:id="@+id/sendMessageToFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/activityData" android:layout_centerHorizontal="true" android:onClick="sendMessageToFragment" android:text="@string/send_message_fragment"/> </RelativeLayout> <LinearLayout android:id="@+id/fragmentContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/activityLayout" android:layout_marginTop="@dimen/margin_extra_large" android:orientation="vertical"> </LinearLayout> </RelativeLayout> |
این آموزش به پایان رسید.
موفق باشید..