android之间的各项信息传输类型

时间:2021-09-30 18:15:06

首先是activity想fragment怎样动态的传输数据:

一:activity与fragment之间进行数据传递是,在Activity中将要传递的数据封装在一Bundle中,使用setArgument(Bundel bundel)方法传递数据,在要传递到的Fragment中 使用this.getArgment(),得到传递到的Bundle。

对于FrameLayout用于动态的更新fragment。这个只是带你比较重要:

对应的一个activity中的代码点击事件如下:

public class MainActivity extends AppCompatActivity  {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button =(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirstFragment fragment = new FirstFragment();
                Bundle bundle = new Bundle();
                bundle.putString("data","传递到的数据");
                fragment.setArguments(bundle);//数据传递到fragment中
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.framelayout,fragment);
                fragmentTransaction.commit();
            }
        });
 
    }
 
}

replace方法的第二个参数不能使用new 类名();这样数据是不能传递的。

对于fragment重大代码如下:

public class FirstFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first,container,false);
        TextView textView = (TextView)view.findViewById(R.id.textview);
        Bundle bundle =this.getArguments();//得到从Activity传来的数据
        String mess = null;
        if(bundle!=null){
            mess = bundle.getString("data");
        }
        textView.setText(mess);
        return view;
    }

}

这样一来当按下Button的时候,碎片回加载进Framelayout中,并且bundle中的数据也会传递到fragment的textview中;

还可以使用attach函数进行传递参数。

二:activity与activity之间的数据传输第二种方法

通过intent方式传递

(1)传递字符串等

发送端activity
android之间的各项信息传输类型
接收端activity
android之间的各项信息传输类型

(2)传递一个对象法1(Serializable是java中自带的方法数据存在内存中)

三、Fragment获取Activity中的数据

首先呢,我们可以通过Intent,直接携带参数传递,简单、方便。然而这种方法破坏了fragment的封装性,MainFragment不再是独立的构建单元,因为它现在由某个特定的activity托管,该activity的Intent定义了EXTRA_CRIME_ID的Extra无法在适用于其他任何activity
Activity

public static Intent newIntent(Context context, UUID crime_id){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);

return intent;
}
Fragment

UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(MainActivity.EXTRA_CRIME_ID)
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
第二种方法,附加argument给fragment,调用Fragmen.setArguments(Bundle)方法,而且必须在ftagment创建后,添加activity(托管fragment的activity)前完成。

也就是说,再创建MainFragment实例时,直接把传递的数据传递过去,直接在MainFragment里面调用获取数据,所有的业务逻辑都在MainFragment里面实现,实现了模块的独立性。

public static MainFragment newInstance(UUID crime_id) {
Bundle bundle = new Bundle();
bundle.putSerializable(ARG_CRIME_ID, crime_id);

MainFragment fragment = new MainFragment();
fragment.setArguments(bundle);
return fragment;
}
获取argument
先调用Fragment的getArguments()方法,再调用Bundle的限定类型getXxx()方法

UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
其实为了更好的实现模块的独立性,都是在获取数据的Activity或Fragment中创建静态方法实现具体的业务逻辑,而设置数据的Activity或Fragment负责调用静态方法,把需要传递的数据放入参数中即可。