zoukankan      html  css  js  c++  java
  • 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;
        }
    
    	@Override
    	public 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();
    	}
    	
    	@Override
    	public 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";
    	
    	@Override
    	public 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() {
    		
    		@Override
    		public 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);
                }
            }
    	}
    	
    	@Override
    	public 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";
    	
    	@Override
    	public 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() {
    		
    		@Override
    		public 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


  • 相关阅读:
    ASP.NET Web API中通过URI显示实体中的部分字段
    ASP.NET Web API中把分页信息放Header中返回给前端
    写一个针对IQueryable<T>的扩展方法支持动态排序
    Perl处理和收走子进程(退出状态码和wait)
    Perl多进程
    Perl信号处理
    大话西游之大圣娶亲中的至尊宝和紫霞仙子
    Perl List::Util模块用法详解
    Python面向对象:杂七杂八的知识点
    Python迭代和解析(5):搞懂生成器和yield机制
  • 原文地址:https://www.cnblogs.com/fengju/p/6336125.html
Copyright © 2011-2022 走看看