android - 当用另一个 fragment 替换 fragment 时, fragment 转换有轻微的延迟,如何防止它?

标签 android android-fragments android-transitions

我的activity中有一个fragment A。当我想要替换该fragment时,我可以将fragment A移出屏幕并将fragment B移动到屏幕上。

但是,在显示 fragment B之前,存在轻微的滞后/延迟。我已将问题范围缩小为我的 Recycler Adapter 加载 5 个或更多项目,导致 0.5 秒 延迟(当 Recycler 没有项目时没有延迟)。它也只发生在第一次加载项目时。

我认为这是因为适配器加载在 ui 线程 上花费了大约 0.5 秒

我的问题是,如何设计才能不再出现延迟?

我的Adapterfragment的 onViewCreated()内部被调用,但这似乎并没有消除延迟。

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        viewModel = new ViewModelProvider(this).get(MainViewModel.class);

        adapter = new BackpackAdapter(viewModel.getListItems());
        recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
        recyclerView.setAdapter(backpackAdapter);
    }

我还使用 Glide 在后台线程上加载图像,但它似乎也没有消除延迟。

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
        Glide.with(holder.itemView.getContext())
                .load(list.get(i).getImage())
                .apply(RequestOptions.centerCropTransform())
                .into(holder.imageView);

        ...
        ...

这是我的 fragment 转换,用于将 fragment A移出屏幕以显示B

getChildFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .setCustomAnimations(R.anim.enter_right, R.anim.exit_left, R.anim.enter_left, R.anim.exit_right)
                .replace(R.id.container_view, new FragmentB(), "FRAG_B")
                .commit();

有人知道我可以做些什么来使 fragment 过渡更加平滑吗?

最佳答案

我也遇到了这个问题,我使用 Fragment 的 postponeEnterTransition 方法解决了这个问题。

首先,您需要从基本 fragment 扩展所有 fragment ,如下所示:

public class HomeFragment extends BaseFragment {

}

接下来创建 BaseFragment 类,如下所示:

public class BaseFragment extends Fragment {

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // we don't need to change transition animations when method calls again!
        if (savedInstanceState != null) return;

        // here we pause enter transition animation to load view completely
        postponeEnterTransition();

        // we set the background color of root view to white
        // because navigation animations run on a transparent background by default
        view.setBackgroundColor(Color.WHITE);

        // here we start transition using a handler
        // to make sure transition animation won't be lagged
        view.post(() -> postponeEnterTransition(0, TimeUnit.MILLISECONDS));
    }

}

仅供引用,我使用了导航组件,并为所有 fragment 应用过渡动画,我在样式中添加了这些行:

<style name="Theme.AppName" parent="Theme.MaterialComponents.Light.NoActionBar">

        <item name="enterAnim">@anim/enter_anim</item>
        <item name="exitAnim">@anim/exit_anim</item>
        <item name="popEnterAnim">@anim/pop_enter_anim</item>
        <item name="popExitAnim">@anim/pop_exit_anim</item>

</style>

注意:如果您使用 LiveData 来更新 recyclerView,则会导致过渡动画出现滞后,因为它会异步加载项目。

希望这有帮助!

关于android - 当用另一个 fragment 替换 fragment 时, fragment 转换有轻微的延迟,如何防止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74838068/

相关文章:

java - 无法解析方法 'get(java.lang.String)'

android - 如何在 Android 中使用自定义屏幕而不是默认启动屏幕?

java - 设置新内容 View 时应用程序崩溃

android - DialogFragment 的简单示例 - 示例代码不适合我

android - 过渡管理器 - 滑出 View 无法正常工作

java - 当 onBackPressed() 被覆盖时保留过渡动画

java - 使用 RecyclerView 制作类似目录的布局

java - 数据未显示在 RecyclerView 中。 onCreateViewHolder 和 onBindViewHolder 未执行

android - setRetainInstance(true) 不持久化Fragment的成员变量

Android 5.0 windowEnterTransition 不影响过渡