面试:fragment相关

发布于:2022-11-05 ⋅ 阅读:(406) ⋅ 点赞:(0)

一、Fragment和activity之间如何通信

Activity与Fragment之间通信的多种方式_东东旭huster的博客-CSDN博客_fragment和activity通信

1、通过bundle,在Activity中构造Fragment的时候,可以将需要传递的数据封装在成一个Bundle对象,然后通过setArguments()方法传递参数,例子如下
Activity


        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        Fragment fragTop = new FrameTop();
        fragmentTransaction.replace(R.id.frame1,fragTop);
        Bundle bundle = new Bundle();
        fragTop.setArguments(bundle);
        bundle.putString("name","fragTop");
        fragmentTransaction.commit();

Fragment中获取数据

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        Bundle arguments = getArguments();
        String name = arguments.getString("name");
    }


2、通过广播
3、通过EventBus,
通过EventBus不仅可以实现Activity与Fragment, 还可以实现Fragment与Fragment之间通信
4、通过接口回调,这种方式在Android中非常普遍,这里也不详细的介绍了,一般就是在Activity中实现一个回调接口,然后将该接口注册到Fragment中,Fragment中就可以通过该接口与Activity通信了。
5、通过ViewModel,

viewModel是jetPack中一个非常好用的工具,假设您有一个 Fragment,在该 Fragment 中,用户从列表中选择一项,还有另一个 Fragment,用于显示选定项的内容。这种情况不太容易处理,因为这两个 Fragment 都需要定义某种接口描述,并且所有者 Activity 必须将两者绑定在一起。此外,这两个 Fragment 都必须处理另一个 Fragment 尚未创建或不可见的情况。

可以使用 ViewModel 对象解决这一常见的难点。这两个 fragment 可以使用其 activity 范围共享 ViewModel 来处理此类通信,如以下示例代码所示:

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

public class ListFragment extends Fragment {
    private SharedViewModel model;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        model.getSelected().observe(getViewLifecycleOwner(), item -> {
           // Update the UI.
        });
    }
}

6、通过Handler

7、跨Activity的Fragment之间通信,使用startActivityResult

图片

1、FragmentA 调用 startActivityForResult() 方法之后,跳转到 ActivityB 中,ActivityB 把数据通过 setArguments() 设置给 FragmentB。

2、FragmentB 调用 getActivity().setResult() 设置返回数据,FragmentA 在onActivityResult() 中拿到数据。

此时,有两点需要特别注意:

1、不要使用 getActivity().startActivityForResult() , 而是在Fragment中直接调用startActivityForResult()。

2、activity 需要重写 onActivityResult,其必须调用 super.onActivityResult(requestCode, resultCode, data)。

以上两点如果违反,则 onActivityResult 只能够传递到 activity 的,无法传递到 Fragment。

二、fragment四种提交方式区别

https://www.jianshu.com/p/78136d0d3501

三、fragment生命周期

Fragment生命周期_沙漠一只雕得儿得儿的博客-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到