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

时间: 2024-11-13 19:14:26

Android利用广播实现ViewPager中item之间的数据通信的相关文章

【Android进阶】关于ListView中item与控件抢夺焦点的那些事

在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 我们以item存在一个Button控件为例 首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下 @Override public

Android利用广播监听设备网络连接(断网)的变化情况

MainActivity如下: package cc.testnetworkchange; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听设备网络连接的变化情况 * 亦可借此监测到设备是否已经断开网络 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedI

android 利用广播实现程序的强制退出

利用广播机制,实现程序的强制退出. 前面有篇博文,写到了一键退出,这里利用到了那里的ActivityCollector的集合和BaseActivity 功能:打开程序后,先登录,登录成功后,进入主页面,主页面有个按钮,点击后弹出窗口,用户点击 "是"之后退出程序 1.ActivityCollector package com.yuanlp.forceexit; /**  * Created by 原立鹏 on 2017/6/28.  */ import android.app.Acti

Android利用广播监听按下HOME和电源键

package cc.testhome; import cc.testhome.HomeKeyObserver.OnHomeKeyListener; import cc.testhome.PowerKeyObserver.OnPowerKeyListener; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听Home键的按下和长按Home键 * 利用广播监听电源键的按下(关闭屏幕) * *

android实现ListView或GridView中item的倒数功能

有时在开发中可能会遇到当未到某个时间时需要让ListView或GridView中的相应item进行倒数的需求,此时,如果还是按照常见的ListView或GridView的Adapter的写法+计时功能来实现的话,则当滚动ListView或GridView的时候,item就可能会出现复用问题(即不需要进行倒数或当前item的倒数已经结束了,却还会出现倒数的现象),因此,为了解决这种问题,需要进行倒数时,重新遍历当前对象的集合,然后让每个对象的相应时间值减1,最后再通过Adapter的notifyD

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a

【android】巧用android:divider属性设置LinearLayout中元素之间的间隔

如上图,要想实现3个button线性排列并且使它们的大小相同.间隔相等.而且整体填充满整个linearlayout,我们一般的做法是在每两个button之间放一个固定宽度的view,然后设置button的宽度为0.layout_weight为1.这样虽能实现功能,可是总感觉不方便,特别是button多的时候. 今天介绍另一种简单.优雅的方法,就是利用android:divider属性. 1.首先新建一个固有的width/height的Drawable: spacer_medium.xml [ja

ucos III中任务之间的数据通信和任务划分

1. 如果将关系密切(比如两个任务之间需要经常收发数据)的若干功能分别用不同的任务来实现,则需要进行大量的任务之间数据通信和同步通信,这系统来说是一个很大的负担.因此应该将关系密切的若干功能组合成一个任务,相关数据为各个功能共享,因此可以节省大量的资源. 2. 任务之间的切换需要占用CPU的资源,所以用时间片对任务进行切换,那么时间片的设定是一个取舍值,太小则切换频繁占用CPU太多资源,太大则任务反应速度太慢,所以一般根据经验设定为1ms. 原文地址:https://www.cnblogs.co

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**