Android利用廣播實現ViewPager中item之間的資料通訊

來源:互聯網
上載者:User

標籤: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之間的資料通訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.