系列文章:安卓开发之Activity间传输数据(多场景分析)
在Activity中,我们经常使用动态加载的形式来创建一个或者多个Fragment,所以导致不同位置甚至是不同时间,都会有不同的Fragment,存在。
如果要管理Activity和Frament的关系,那么Activity和Fragment之间的数据传输就十分重要。
需要的文件:一个附带layout的Fragment以及MainActivity
一、Activity---->Fragment
第一步:
在Fragment中编写静态方法
public static FragmentTest newInstance(String title){
FragmentTest fragmentTest=new FragmentTest();
Bundle bundle=new Bundle();
bundle.putString("bundle_title",title);//这里的参数一最好常量化
FragmentTest.setArguments(bundle);
return fragmentTest;
}
这个方法是用来在Activity中动态加载Fragment时的初始化Fragment方法,可以在初始化的时候传输数据
第二步:
在Fragment的onCreate方法
super.onCreate(savedInstanceState);
if (getArguments()!=null)
{
mtitle=getArguments().getString("bundle_tilte");
}
这里可以接受到动态加载Fragment时Activity传输的数据,然后可以把接收到的数据全局化,即可在onCreateView中使用传输来的数据。
第三步:动态加载Fragment
在Activity中:
第一种写法
FragmentTest fragmentTest=FragmentTest.newInstance("ggzx");
getSupportFragmentManager()
.beginTransaction()
.add(R.id.linearLayoutContainer, fragmentTest)
.commit();
第二种
getSupportFragmentManager()
.beginTransaction()
.add(R.id.linearLayoutContainer, FragmentTest.newInstance("ggzx"))
.commit();
以上就是简要的传输普通的String字符
我们来传bundle吧
第一步:
public static FragmentTest newInstance(Bundle bundle){
FragmentTest fragmentTest=new FragmentTest();
fragmentTest.setArguments(bundle);
return fragmentTest;
}
这里其实比刚才传输String更简洁了,因为setArguments只能传入bundle类型参数,在使用String类型时,需要新建bundle,然后将String转入新建bundle,再将bundle给setArugments。
因为我们直接传输bundle了,这里其实就更简洁了,直接把bundel放进去即可
第二步
if (getArguments()!=null)
{
mnum=getArguments().getInt("G_num",0);
}
第三步:
//创建bundle
Bundle bundle=new Bundle();
bundle.putInt("G_num",100);
FragmentTest fragmentTest=FragmentTest.newInstance(bundle);
getSupportFragmentManager()
.beginTransaction()
.add(R.id.linearLayoutContainer, fragmentTest)
.commit();
这样就可以使用了,大家可以在这个简单的案例上面进行扩充。
Activity:
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// FragmentTest fragmentTest=FragmentTest.newInstance("bundle_title");
// getSupportFragmentManager()
// .beginTransaction()
// .add(R.id.linearLayoutContainer, FragmentTest.newInstance("ggzx"))
// .commit();
button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建bundle
Bundle bundle=new Bundle();
bundle.putInt("G_num",100);
FragmentTest fragmentTest=FragmentTest.newInstance(bundle);
getSupportFragmentManager()
.beginTransaction()
.add(R.id.linearLayoutContainer, fragmentTest)
.commit();
}
});
}
}
Fragment:
public class FragmentTest extends Fragment {
int mnum;
public static FragmentTest newInstance(Bundle bundle){
FragmentTest fragmentTest=new FragmentTest();
fragmentTest.setArguments(bundle);
return fragmentTest;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_blank,container,false);
Button button=view.findViewById(R.id.button3);
button.setText(mnum+"");
return view;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments()!=null)
{
mnum=getArguments().getInt("G_num",0);
}
}
}