注:如果使用Android3.0以下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager获得FragmentManager。不过还是建议把Manifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4包了
之前写过几篇关于Fragment的文章,回顾一下
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;
}
}
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>
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方法