Fragment总结

注:如果使用Android3.0以下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager获得FragmentManager。不过还是建议把Manifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了


之前写过几篇关于Fragment的文章,回顾一下

1,Fragment的生命周期

2,DialogFragment

3,listFragment


1,添加Fragment:

public class MainActivity extends FragmentActivity
{
	
	private ContentFragment mContentFragment  ; 

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		FragmentManager fm = getSupportFragmentManager();
		mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container);
		
		if(mContentFragment == null )
		{
			mContentFragment = new ContentFragment();
			fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
		}

	}

}

2,Activity---->Fragment 的过程中 添加参数

      Activity中代码:

        OtherRightFragment fragment = new OtherRightFragment();
	FragmentManager fragmentManager = getSupportFragmentManager();
	FragmentTransaction transaction = fragmentManager.beginTransaction();
	Bundle bundle=new Bundle();
	bundle.putString("tag", "接收到通过setArguments方法传来的参数");
	fragment.setArguments(bundle);
	transaction.addToBackStack(null);//在事物提交前执行
	transaction.commit();</span>
Fragment中代码:

	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		Bundle bundle=getArguments();
		String argument = null;
		if (bundle!=null) {
			argument=bundle.getString("tag");
		}
		View view=inflater.inflate(R.layout.other_right_fragment, null);
		TextView textView=(TextView) view.findViewById(R.id.shan_xi);
		//fragment获取activity的内容
		if (!TextUtils.isEmpty(argument)) {
			textView.setText(((FragmentDemo01Act)getActivity()).otherRightString+"\n"+argument);
		}
		return view;
	}

3,不同Activity中Fragment跳转startActivityForResult

类比activity的startActivityForResult方法,fragment中有startActivityForResult方法,并且有回调onActivityResult,但是没有setResult来设置回调的intent数据,这里就要用宿舍activity的setResult方法来实现了。

FirstFragment:

public class FirstFragment extends Fragment{
	TextView textView;
	String argument;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Bundle bundle=getArguments();
		argument=bundle.getString("argument");
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view =inflater.inflate(R.layout.activity_main, null);
		textView=(TextView) view.findViewById(R.id.text);
		textView.setText(argument);
		view.findViewById(R.id.button01).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent=new Intent();
				intent.setClass(getActivity(), SecondActivity.class);
				startActivityForResult(intent, 0);
			}
		});
		return view;
	}
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		if (data==null) {
			textView.setText("null");
			return;
		}
		String dateString=data.getStringExtra("tag");
		textView.setText(dateString);
	}
}

SecondFragment:

public class SecondFragment extends Fragment{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view =inflater.inflate(R.layout.activity_main, null);
		view.findViewById(R.id.button01).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent data=new Intent();
				data.putExtra("tag", "argumentFromSecondFragment");
				getActivity().setResult(0, data);
			}
		});
		return view;
	}

}


FirstActivity:

public class FirstActivity extends FragmentActivity {

	Context context=FirstActivity.this;
	FirstFragment firstFragment;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fragment);
		FragmentManager manager=getSupportFragmentManager();
		firstFragment=(FirstFragment) manager.findFragmentById(R.id.fragment);
		FragmentTransaction transaction=manager.beginTransaction();
		if (firstFragment==null) {
			firstFragment=new FirstFragment();
			transaction.add(R.id.fragment, firstFragment);
		}
		Bundle bundle=new Bundle();
		bundle.putString("argument", "argumentFromFirstActivity");
		firstFragment.setArguments(bundle);
		transaction.commit();
	}
}

SecondActivity:

<span style="font-size:18px;">public class SecondFragment extends Fragment{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view =inflater.inflate(R.layout.activity_main, null);
		view.findViewById(R.id.button01).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent data=new Intent();
				data.putExtra("tag", "argumentFromSecondFragment");
				getActivity().setResult(0, data);
			}
		});
		return view;
	}
}

3,Fragment之间的数据传递:

  上面讲的是在不同的activity中的fragment的数据传递,之前写过一篇博客讲的是同一个activity中的不同fragment之间的数据传递(利用宿主activity实现接口),这里要讲的是第二种情况的特殊情况:在secondFragment上面点击按钮,产生一个弹出框的Fragment。

对于这种特殊情况,当然可以使用接口的方式实现数据传递,因为也是在一个activity中的。但既然是特殊情况,肯定有特殊并且更加便捷、优雅的方法实现。

SecondFragment:

                textView.setText("点击 展示dialogFragment");
		textView.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				//Fragment上面产生一个Fragment
				DialogFragmentOnSecondFragment dialogFragment = new DialogFragmentOnSecondFragment();
				FragmentManager manager = getFragmentManager();
				dialogFragment.setTargetFragment(SecondFragment.this, 0);//这句是关键
				dialogFragment.show(manager, "DialogFragmentOnSecondFragment");

			}
		});
点击testView执行了dialogFragment的setTargetFragment(SecondFragment.this, REQUEST_EVALUATE)方法,这个方法,一般就是用于当前fragment由别的fragment启动,在完成操作后返回数据的。


仍然在onActivityResult里面接受数据

<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		String request=data.getStringExtra("tag");
		if (!TextUtils.isEmpty(request)) {
			textView.setText(request);
		}
		Toast.makeText(getActivity(), request, Toast.LENGTH_SHORT).show();
	}</span></span>


DialogFreagment:

        button.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View v) {
				if (getTargetFragment()!=null) {
					setResult(view);
				}
				DialogFragmentOnSecondFragment.this.dismiss();
			}

		});
		return view;
	}

	private void setResult(View view) {
		Intent intent=new Intent();
		editText=(EditText) view.findViewById(R.id.name_ed);
		if (!TextUtils.isEmpty(editText.getText().toString())) {
			returnString=editText.getText().toString();
		}
		intent.putExtra("tag", returnString);
		getTargetFragment().onActivityResult(0, 0, intent);
		
	}
点击button设置返回数据,首先判断是否设置了targetFragment,注意这里的setResult就是一个普通的方法,需要手动调用SecondFragment的onActivityResult方法



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值