標籤:android 廣播 viewpager item之間 資料通訊
當你在實現Fragment之間的通訊時(例如Fragment_A和Fragment_B),可能會想到的方法是在Fragment_B中對外提供一個介面,然後在Fragment_A中去調用這個介面,並把這需要的參數傳遞過去。
下面我將對利用廣播來實現從Fragment_A向Fragment_B傳遞資料。
主介面:
public class MainActivity extends FragmentActivity { private int getLayoutResID() { return R.layout.activity_main; } private MyViewPagerAdapter mAdapter = null; private final int START_ITEM = 0; private ViewPager mDataViewPager = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(getLayoutResID()); initEvent(); } /** * 初始化事件 */ private void initEvent() { initView(); } /** * 初始化介面 */ private void initView() { initWidgets(); } /** * 初始化控制項 */ private void initWidgets() { mDataViewPager = (ViewPager) findViewById(R.id.activity_main_show_viewpager); mAdapter = new MyViewPagerAdapter(getSupportFragmentManager()); mAdapter.setContext(MainActivity.this); mDataViewPager.setAdapter(mAdapter); mDataViewPager.setCurrentItem(START_ITEM); }}
適配器:
public class MyViewPagerAdapter extends FragmentStatePagerAdapter {public static final int FRAGMENT_VIEWPAGER_PAGE_COUNT = 2;private Context mContext;public MyViewPagerAdapter(FragmentManager fm) {super(fm);}public void setContext(Context context) { mContext = context; }@Overridepublic Fragment getItem(int which) {try {switch (which) {case 0:return PageOneFragment.newInstance();case 1:return PageTwoFragment.newInstance();default:break;}} catch(Exception e) { e.printStackTrace();}return PageOneFragment.newInstance();}@Overridepublic int getCount() {return FRAGMENT_VIEWPAGER_PAGE_COUNT;}}
第一個Fragment:
public class PageOneFragment extends Fragment {public static PageOneFragment newInstance() {PageOneFragment fragment = new PageOneFragment();return fragment;}private int getLayoutResID() {return R.layout.fragment_page_0;}public static final String TAG = PageOneFragment.class.getName();private TextView mShowTextView = null;private Button mSendButton = null;private static final int MESSAGE_UPDATEVIEW = 0x123;private PageTwoDataChangedReceiver mReceiver = null;public static final String DATA_CHANGED = "com.example.viewpager.communication.fragment.PAGE_ONE_DATA_CHANGED";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(getLayoutResID(), container, false);initEvent(view);return view;}private void initEvent(View v) {initView(v);registerPageTwoDataChangedReceiver();}private void initView(View v) {initWidgets(v);setViewOnclickEvent();}private void initWidgets(View v) { mShowTextView = (TextView) v.findViewById(R.id.page_0_show_textview); mSendButton = (Button) v.findViewById(R.id.page_0_send_button);}/** * 對所有的按鈕進行點擊事件監聽 */private void setViewOnclickEvent() { mSendButton.setOnClickListener(viewOnClickListener);}private OnClickListener viewOnClickListener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.page_0_send_button: Intent intent = new Intent(); intent.setAction(PageTwoFragment.DATA_CHANGED); getActivity().sendBroadcast(intent);break;default:break;}}};private void registerPageTwoDataChangedReceiver() { IntentFilter filter = new IntentFilter(); try { if (mReceiver != null) { getActivity().unregisterReceiver(mReceiver); } } catch (Exception e) { e.printStackTrace(); } mReceiver = new PageTwoDataChangedReceiver(); filter.addAction(PageOneFragment.DATA_CHANGED); getActivity().registerReceiver(mReceiver, filter);}Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case MESSAGE_UPDATEVIEW:updateView((String)msg.obj);break;default:break;}};};private void updateView(String data) { mShowTextView.setText("從第二頁發來的資料:" + data + " " + System.currentTimeMillis());}class PageTwoDataChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(PageOneFragment.DATA_CHANGED)) { String label = "TWO Time: "; Message msg = new Message(); msg.what = MESSAGE_UPDATEVIEW; msg.obj = label; handler.sendMessage(msg); } }}@Overridepublic void onDestroy() { if (mReceiver != null) { getActivity().unregisterReceiver(mReceiver); } super.onDestroy();}}
第二個Fragment:
public class PageTwoFragment extends Fragment {public static PageTwoFragment newInstance() {PageTwoFragment fragment = new PageTwoFragment();return fragment;}private int getLayoutResID() {return R.layout.fragment_page_1;}public static final String TAG = PageTwoFragment.class.getName();private static final int MESSAGE_UPDATEVIEW = 0x123;private TextView mShowTextView = null; private Button mSendButton = null;private PageOneDataChangedReceiver mReceiver = null;public static final String DATA_CHANGED = "com.example.viewpager.communication.fragment.PAGE_TWO_DATA_CHANGED";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(getLayoutResID(), container, false);initEvent(view);return view;}private void initEvent(View v) {initView(v);registerPageOneDataChangedReceiver();}private void initView(View v) {initWidgets(v);setViewOnclickEvent();}private void initWidgets(View v) { mShowTextView = (TextView) v.findViewById(R.id.page_1_show_textview); mSendButton = (Button) v.findViewById(R.id.page_1_send_button);}/** * 對所有的按鈕進行點擊事件監聽 */private void setViewOnclickEvent() { mSendButton.setOnClickListener(viewOnClickListener);}private OnClickListener viewOnClickListener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.page_1_send_button: Intent intent = new Intent(); intent.setAction(PageOneFragment.DATA_CHANGED); getActivity().sendBroadcast(intent);break;default:break;}}}; private void registerPageOneDataChangedReceiver() { IntentFilter filter = new IntentFilter(); try { if (mReceiver != null) { getActivity().unregisterReceiver(mReceiver); } } catch (Exception e) { e.printStackTrace(); } mReceiver = new PageOneDataChangedReceiver(); filter.addAction(PageTwoFragment.DATA_CHANGED); getActivity().registerReceiver(mReceiver, filter); } Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case MESSAGE_UPDATEVIEW:updateView((String)msg.obj);break;default:break;}};};private void updateView(String data) { mShowTextView.setText("從第一頁發來的資料:" + data + " " + System.currentTimeMillis()); } class PageOneDataChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(PageTwoFragment.DATA_CHANGED)) { String label = "ONE Time: "; Message msg = new Message(); msg.what = MESSAGE_UPDATEVIEW; msg.obj = label; handler.sendMessage(msg); } } } @Override public void onDestroy() { if (mReceiver != null) { getActivity().unregisterReceiver(mReceiver); } super.onDestroy(); }}
工程源碼:
布局檔案比較簡單,這裡不再給出。如下為項目源碼。
http://download.csdn.net/detail/u013761665/8333283
筆者最新開發的應用串連
http://zhushou.360.cn/detail/index/soft_id/2419729?recrefer=SE_D_%E6%A3%B1%E9%95%9C
http://www.wandoujia.com/apps/com.mastershield.personalstat
Android利用廣播實現ViewPager中item之間的資料通訊