假设现在要从fromActivity中传递信息给toFragment。
原来的代码大概是下面这样的:
//fromActivity.java
public class fromActivity extends FragmentActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_from);
//这里是android.support.v4包中的FragmentManager
FragmentManager fm = getSupportFragmentManager();
Fragment tofragment = fm.findFragmentById(R.id.fragment_container);
if (tofragment == null)
{
tofragment = new toFragment();
fm.beginTransaction().add(R.id.fragment_container, tofragment).commit();
}
}
}
我们要用argument来传递信息给Fragment(实际上就是给他个有额外信息的Bundle),而这个argument应该在创建Fragment的时候就放进去,也就是这个地方:tofragment = new toFragment();
但是由于Bundle中的额外信息是以键值对的形式储存的(详见我的文章:【Android开发】启动Activity并传递信息),所以最好能把这段代码放在toFragment中来实现。
在toFragment.java中添加如下代码:
private static final String ARG_KEY = "...";
public static toFragment newInstance(Value value)
//这里的Value是封入argument的数据的类型
//当然数据可以有多个
{
Bundle args = new Bundle();
//注意这里与“向Intent中放入额外信息”的微妙差别
//这里要区分放入的类型,而Intent那里不用
//这里假设Value是一个类
args.putSerializable(ARG_KEY, value);
//所以如果Value是int,代码会是这样的:
//args.putInt(ARG_KEY, value);
toFragment fragment = new toFragment();
//设置argument
fragment.setArguments(args);
return fragment;
}
接着将fromActivity.java中的这段代码tofragment = new toFragment();
改为:
tofragment = toFragment.newInstance(value);
最后在toFragment的onCreate(...)
方法中将argument提取出来并赋值给类的相应成员即可:
@Override
public void onCreate(...)
{
...
//通过键来获取放入的信息
//这里的语法也和“从Intent中取出信息”有着微妙的不同
mValue = (Value) getArguments().getSerializable(ARG_KEY);
}
通过这个方法,也可以实现从“Fragment启动Activity并将信息传给托管在这个Activity中的Fragment”这一需求了。