Android Fragment onCreateView 与 AsyncLayoutInflater

Pie*_*ley 5 android android-fragments

在发现我onCreateView花了将近一秒钟的时间来执行该inflater.inflate(...)方法后,我搜索了一下并找到了一个新的类,AsyncLayoutInflater.

我尝试在片段中实现此构造函数,但我不知道如何正确实现它,因为它总是会导致空的空白视图。

我认为我的问题是如何膨胀我的片段,使其具有从onCreateViewsuper结果)返回的空视图。

这是有效的“正常”版本:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_intervento_luogo, container, false);
    //do my stuffs
    return view;
}
Run Code Online (Sandbox Code Playgroud)

这不会并显示一个空视图:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(getContext());
    asyncLayoutInflater.inflate(R.layout.fragment_intervento_luogo, container, new AsyncLayoutInflater.OnInflateFinishedListener() {
        @Override
        public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {
            // do my stuffs
        }
    });
    return super.onCreateView(inflater, container, savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将这个异步充气器放入 onResume、onViewCreated 和 onCreate 中,但没有人工作。

我应该如何正确实施?我不敢相信没有办法跳过 onCreateView 内的异步执行的通货膨胀。

谢谢大家

Pet*_*huk 0

在 onCreateView(...) 内部,您创建并返回片段的布局。当前您返回 super.onCreateView(inflater,container,savedInstanceState); 所以它是空白的,当你的 AsyncLayoutInflater 完成时,它不会影响你的片段布局。

当您的布局膨胀时 - 将其添加到您的 ViewGroup 中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(getContext());
    asyncLayoutInflater.inflate(R.layout.fragment_intervento_luogo, container, new AsyncLayoutInflater.OnInflateFinishedListener() {
        @Override
        public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {
            parent.addView(view);
            onViewCreated(view, savedInstanceState)
        }
    });
    return super.onCreateView(inflater, container, savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

并添加 onViewCreated 来通知系统创建了哪些布局。

像这样的代码对我有用:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val asyncLayoutInflater = AsyncLayoutInflater(context!!)
    asyncLayoutInflater.inflate(R.layout.fragment_characters, container) { view, resid, parent ->
        binding = FragmentCharactersBinding.bind(view)
        binding.vm = vm
        container?.addView(binding.root)
        onViewCreated(binding.root, savedInstanceState)
    }

    return super.onCreateView(inflater, container, savedInstanceState)
}
Run Code Online (Sandbox Code Playgroud)