You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Kotlin Fragment的by lazy ViewModel初始化转为Java实现

简洁规范地将Kotlin Fragment重写为Java版本(ViewModel初始化实现)

核心实现思路

Kotlin中用by lazy实现的ViewModel懒加载,在Java中可以通过延迟初始化+主线程安全的方式简洁实现,避免字节码工具生成的冗余代码。以下是完整的规范实现:

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

public class AddDataFragmentJava extends Fragment {

    // 延迟初始化ViewModel,对应Kotlin的by lazy
    private DetailViewModel viewModel;

    // 获取ViewModel的方法,简洁实现懒加载
    private DetailViewModel getViewModel() {
        if (viewModel == null) {
            viewModel = new ViewModelProvider(this).get(DetailViewModel.class);
        }
        return viewModel;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_add_data_java, container, false);

        // 获取视图控件
        Button button = v.findViewById(R.id.buttonSaveData);
        EditText editTextNumber2 = v.findViewById(R.id.editTextNumber2);
        EditText editSetNumber = v.findViewById(R.id.editSetNumber);

        button.setOnClickListener(v1 -> {
            // 获取输入值(添加格式异常处理,避免崩溃)
            double weightNumber;
            int setNumber;
            try {
                weightNumber = Double.parseDouble(editTextNumber2.getText().toString());
                setNumber = Integer.parseInt(editSetNumber.getText().toString());
            } catch (NumberFormatException e) {
                // 可在此添加输入错误提示逻辑
                return;
            }

            // 调用ViewModel方法,直接通过getViewModel()获取实例
            getViewModel().saveWeather(
                    new Weather(
                            new City("M", 51.5, weightNumber),
                            setNumber,
                            1
                    )
            );
        });

        return v;
    }
}

关键细节说明

  • ViewModel懒加载:getViewModel()方法在首次调用时初始化ViewModel,后续直接返回已创建的实例,和Kotlin的by lazy行为完全一致。由于Fragment的生命周期方法均在主线程执行,无需额外加synchronized锁,大幅简化代码。
  • 输入健壮性处理:添加了NumberFormatException捕获,避免用户输入非数字内容导致崩溃,补全了原Kotlin代码的健壮性缺失。
  • 视图操作规范:在onCreateView中一次性获取所需控件,避免后续重复查找,符合Java Fragment的常规开发习惯。

内容的提问来源于stack exchange,提问作者Павел К

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:02:51