探索Fragment(2)---数据交互

Fragment使用时,要把数据传送给Activity 或者Fragment 那么就牵扯到  数据传递的过程了

1.控件的值获取跟传递

        首先得到某控件里面的值(如:editText等),那么只要在Activity/fragment得到控件的引用,那么就可以得到该控件的相关值,也空set控件的值

所以只要得到引用就可以了

        1.1.在Activity中得到Fragment中的控件:

代码:

<span style="font-size:18px;"><span style="white-space:pre">		</span>setContentView(R.layout.activity_main);
		mFragmengManager = getFragmentManager();
		transaction = mFragmengManager.beginTransaction();
		fragment1 = new Fragment1();
		Bundle bundle = new Bundle();
		bundle.putString("name", "fragment1");
		fragment1.setArguments(bundle);
		transaction.replace(R.id.left, fragment1, "fragment1");
		transaction.addToBackStack("fragment1");
		transaction.commit();</span>
        在Oncreate完成以后才可以访问fragment的控件,否则为null,因为在onCreate时   fragment的的View还没有加载,所以要注意各自的生命周期:

       

<span style="font-size:18px;">         <span style="background-color: rgb(255, 255, 255);">   Button buttonFragment  = (Button) fragment1.getView().findViewById(R.id.fragment_button);
		buttonFragment.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, "Toast fragment1", Toast.LENGTH_SHORT).show();
			}
		});</span></span>
         1.2Fragment中得到Activity中的控件:

              代码如下:

<span style="font-size:18px;">@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragmeng_f1, null);
		<span style="background-color: rgb(204, 204, 204);">button = (Button) getActivity().findViewById(R.id.activity_button);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getActivity(), "111111111", Toast.LENGTH_SHORT).show();
			}
		});
	</span>
		Bundle bundle = getArguments();
		if (null != bundle){
			String name = bundle.getString("name");
			button.setText("name :" + name);
		}
		
		return view;
	}</span>
      1.3 在fragment中得到另一个fragment的控件

             前面2中情况都是Activity中有fragment的引用, fragment可以getActivity()可以得到Activty的引用,而Fragment却没有方法得到另一个fragment的引用,要想得到另一个fragment得使用 FragmengManager.findFragmentByTag(tag)的方法了。

 代码:

        Activity中:

         

<span style="font-size:18px;">               setContentView(R.layout.activity_main);
		mFragmengManager = getFragmentManager();
		transaction = mFragmengManager.beginTransaction();
		fragment1 = new Fragment1();
		transaction.replace(R.id.left, fragment1, "fragment1");
		fragment2 = new Fragment2();
		transaction.replace(R.id.right, fragment2, "fragment2");
		transaction.commit();
		</span>
<span style="font-size:18px;">fragment2 中</span>
<span style="font-size:18px;"><strong>Fragment1 fragment1 = (Fragment1) mFragmengManager.findFragmentByTag("fragment1");</strong>
		if (null != fragment1){
			Button buttonFragment  = (Button) fragment1.getView().findViewById(R.id.fragment_button);
			buttonFragment.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					Toast.makeText(getActivity(), "2222222222", Toast.LENGTH_SHORT).show();
				}
			});
		}</span>

记得tag要唯一,而且给控件引用时,要注意各自的生命周期

2. Activity  传送给Fragment

        2.1.使用setArguments的方法传递

         使用代码:

                mFragmengManager = getFragmentManager();
		transaction = mFragmengManager.beginTransaction();
		fragment1 = new Fragment1();
		Bundle bundle = new Bundle();
		bundle.putString("name", "fragment1");
		fragment1.setArguments(bundle);
		transaction.replace(R.id.left, fragment1, "fragment1");
		transaction.addToBackStack("fragment1");
		transaction.commit();
       在Fragmnet中

<span style="white-space: pre;">	</span><span style="background-color: rgb(255, 255, 255);"><strong>Bundle bundle = getArguments();
<span style="white-space: pre;">	</span>if (null != bundle){
<span style="white-space: pre;">		</span>String name = bundle.getString("name");
<span style="white-space: pre;">		</span>button.setText("name :" + name);
<span style="white-space: pre;">	</span>}</strong></span>
       2.2  frgament可以直接通过getActivity() 访问Activity中的值,但是要强制转换(主动获取)

       如:String data = ((MainActivity)getActivity()).getdata();
Toast.makeText(getActivity(), "data = " + data, Toast.LENGTH_SHORT).show();

       2.3 使用接口回调,当Activity 的数据改变时通知fragment(自动接收)

       首先创建接口

      public interface CallBack {
   public void getResult(String data , int id);
      }

     fragmnet中实现接口:

public class Fragment1 extends MyBaseFragment  implements CallBack{

@Override
public void getResult(String data, int id) {
Toast.makeText(getActivity(), "data = " + data + "  id = " + id, Toast.LENGTH_SHORT).show();
}

}

       在Activity中注册(赋值)

       registerCallback(fragment1);

public void registerCallback(CallBack back){
this.mCallBack = back;
}
// 直接= 也可以 mCallBack  =  fragment1 

       最后是触发事件:可以是button点击 , 下载数据完成  等fragment关心的数据变化等都可以

       如:button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (mCallBack != null){
mCallBack.getResult(data, 10001);
}
}
});


3. fragment 传送给Activity ,注意在fragment中setArguments这个方法行不通 ,调试时会报错,具体原因现在没有深究

         3.1Activity中有fragment的引用,直接访问就是了  (主动获取)

         3.2 接口回调的方式     (自动接收)


4. fragment 传递跟fragment   

      比第3点对一个操作,就是先得另一个fragment的引用,然后就可以直接访问,跟设置接口回调了

得到另一个fragmnent的引用在1.3中有写到


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值