碎片页介绍(三)

1.getActivity():

碎片相当于活动的组件,存在于活动中。在碎片页中,getActivity()可以获取活动,从而操作活动和碎片页的组件。

例如:

在一个碎片中修改另外一个碎片的组件。

public class TestFragment1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		((TextView) getActivity().findViewById(R.id.tv_name1))
				.setText("test f1");
		// TestFragment2的组件
		((TextView) getActivity().findViewById(R.id.tv_name1))
				.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						((TextView) getActivity().findViewById(R.id.tv_name2))
								.setText("0.0!");
					}
				});
	}

}

2.getArguments():

通过它可以让活动向碎片页传输一个bundle对象。

在活动中设置bundle:

Fragment f1 = new TestFragment1();
		Bundle bundle=new Bundle();
		bundle.putString("name", "bundle data!");
		f1.setArguments(bundle);
在碎片页中获取传递的bundle:

public class TestFragment1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		// 获取传递的bundle
		((TextView) getActivity().findViewById(R.id.tv_name1))
				.setText(getArguments().getString("name"));
	}

}
当然,将实例化碎片页封装为静态的方法,使用起来要简单和美观点。

public class TestFragment1 extends Fragment {
	// 实例化
	static TestFragment1 newInstance(CharSequence label) {
		TestFragment1 frag = new TestFragment1();
		Bundle b = new Bundle();
		b.putCharSequence("label", label);
		frag.setArguments(b);
		return frag;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		// 获取传递的bundle
		((TextView) getActivity().findViewById(R.id.tv_name1))
				.setText(getArguments().getString("name"));
	}

}

3.通过同享接口。

首先定义一个接口:

public class TestFragment1 extends Fragment {

	public interface TransData {
		public void test(String nameTxt);
	}

	TransData transData=null;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		((TextView) getActivity().findViewById(R.id.tv_name1))
		.setText("test f1");
		((TextView) getActivity().findViewById(R.id.tv_name1))
				.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						transData.test("click frag txt");
					}
				});
	}

	@Override
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		super.onAttach(activity);
		try {
			transData = (TransData) activity;
		} catch (ClassCastException e) {
			// TODO: handle exception
			throw new ClassCastException(activity.toString()
					+ "必须实现 TransData接口");
		}
	}

}

然后让活动去实现接口:

public class TestMain extends FragmentActivity implements TransData {
	@Override
	public void test(String nameTxt) {
		// TODO Auto-generated method stub
		((TextView) findViewById(R.id.tv_name2)).setText(nameTxt);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_testfirst);
		initView();
	}

因为活动是接口的具体实现,就可以在碎片页中将活动对象强转为接口的实现,因为是共享的活动对象,在碎片页中通过强转的接口实现调用接口方法,就相当于直接调用活动中的实现的具体接口方法,从而达到了碎片页向活动传递数据的效果。

就跟在一个类中,调用该类的方法一样。

其实接口定义写在碎片页或者外面其实也没啥区别。

简单的demo


注意:

1.同事加载的几个碎片页,不要使用同样的layout资源文件,否则可能导致某些碎片页不能正常显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值