ActivityMainBindingImpl.java 的问题

Issues with ActivityMainBindingImpl.java

我正在编写摄氏-华氏度转换器,但程序因我未找到的内容而崩溃

我实际上是在尝试使用数据绑定和视图模型,但是 Android Studio 在 ActivityMainBindingImpl.java 中发现了一些不是我自己写的问题。这是代码的一部分,它发现了一个问题。它在第 104 行 com.example.convertitorecelsius_farenheit.MainViewModel viewModel = mViewModel;它说“无法解析符号 'mViewModel'”

“super(bindingComponent, root, 0)”中的第 33 行还有另一个问题,它说“'ActivityMainBinding()' 在 'com.example.convertitorecelsius_farenheit.databinding.ActivityMainBinding' 中具有私有访问权限”

最后一个问题是在“public class ActivityMainBindingImpl extends ActivityMainBinding {”中的第 8 行,错误在“ActivityMainBinding”中,它说“无法继承自 final 'com.example.convertitorecelsius_farenheit.databinding.ActivityMainBinding' “

这是我发现这些问题的完整代码

package com.example.convertitorecelsius_farenheit.databinding;
import com.example.convertitorecelsius_farenheit.R;
import com.example.convertitorecelsius_farenheit.BR;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
@SuppressWarnings("unchecked")
public class ActivityMainBindingImpl extends ActivityMainBinding  {

@Nullable
private static final androidx.databinding.ViewDataBinding.IncludedLayouts sIncludes;
@Nullable
private static final android.util.SparseIntArray sViewsWithIds;
static {
    sIncludes = null;
    sViewsWithIds = new android.util.SparseIntArray();
    sViewsWithIds.put(R.id.cambiaTemperatura, 3);
    sViewsWithIds.put(R.id.inputTemperatura, 4);
    sViewsWithIds.put(R.id.converti, 5);
}
// views
@NonNull
private final androidx.constraintlayout.widget.ConstraintLayout mboundView0;
// variables
// values
// listeners
// Inverse Binding Event Handlers

public ActivityMainBindingImpl(@Nullable androidx.databinding.DataBindingComponent bindingComponent, @NonNull View root) {
    this(bindingComponent, root, mapBindings(bindingComponent, root, 6, sIncludes, sViewsWithIds));
}
private ActivityMainBindingImpl(androidx.databinding.DataBindingComponent bindingComponent, View root, Object[] bindings) {
    super(bindingComponent, root, 0
        , (android.widget.Button) bindings[3]
        , (android.widget.Button) bindings[5]
        , (android.widget.EditText) bindings[4]
        , (android.widget.TextView) bindings[2]
        , (android.widget.TextView) bindings[1]
        );
    this.mboundView0 = (androidx.constraintlayout.widget.ConstraintLayout) bindings[0];
    this.mboundView0.setTag(null);
    this.textTemperatura.setTag(null);
    this.textView.setTag(null);
    setRootTag(root);
    // listeners
    invalidateAll();
}

@Override
public void invalidateAll() {
    synchronized(this) {
            mDirtyFlags = 0x2L;
    }
    requestRebind();
}

@Override
public boolean hasPendingBindings() {
    synchronized(this) {
        if (mDirtyFlags != 0) {
            return true;
        }
    }
    return false;
}

@Override
public boolean setVariable(int variableId, @Nullable Object variable)  {
    boolean variableSet = true;
    if (BR.viewModel == variableId) {
        setViewModel((com.example.convertitorecelsius_farenheit.MainViewModel) variable);
    }
    else {
        variableSet = false;
    }
        return variableSet;
}

public void setViewModel(@Nullable com.example.convertitorecelsius_farenheit.MainViewModel ViewModel) {
    this.mViewModel = ViewModel;
    synchronized(this) {
        mDirtyFlags |= 0x1L;
    }
    notifyPropertyChanged(BR.viewModel);
    super.requestRebind();
}

@Override
protected boolean onFieldChange(int localFieldId, Object object, int fieldId) {
    switch (localFieldId) {
    }
    return false;
}

@Override
protected void executeBindings() {
    long dirtyFlags = 0;
    synchronized(this) {
        dirtyFlags = mDirtyFlags;
        mDirtyFlags = 0;
    }
    java.lang.String viewModelTypeCurrentTemperature = null;
    int viewModelConvertiTemperatura = 0;
    com.example.convertitorecelsius_farenheit.MainViewModel viewModel = mViewModel;

    if ((dirtyFlags & 0x3L) != 0) {



            if (viewModel != null) {
                // read viewModel.typeCurrentTemperature
                viewModelTypeCurrentTemperature = viewModel.getTypeCurrentTemperature();
                // read viewModel.convertiTemperatura()
                viewModelConvertiTemperatura = viewModel.convertiTemperatura();
            }
    }
    // batch finished
    if ((dirtyFlags & 0x3L) != 0) {
        // api target 1

        this.textTemperatura.setText(viewModelConvertiTemperatura);
        androidx.databinding.adapters.TextViewBindingAdapter.setText(this.textView, viewModelTypeCurrentTemperature);
    }
}
// Listener Stub Implementations
// callback impls
// dirty flag
private  long mDirtyFlags = 0xffffffffffffffffL;
/* flag mapping
    flag 0 (0x1L): viewModel
    flag 1 (0x2L): null
flag mapping end*/
//end

}

这是我写的程序 MainActivity.java

package com.example.convertitorecelsius_farenheit;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.widget.EditText;

import com.example.convertitorecelsius_farenheit.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

  private ActivityMainBinding binding;
  private MainViewModel viewModel;

  public EditText inputTemperature;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    inputTemperature = findViewById(R.id.inputTemperatura);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    binding.setLifecycleOwner(this);
    setContentView(binding.getRoot());

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

public int getInputTemperature() {
    return Integer.parseInt(inputTemperature.toString());
}}

MainViewModel.java

package com.example.convertitorecelsius_farenheit;

import androidx.lifecycle.ViewModel;

public class MainViewModel extends ViewModel {

public int grades;
public boolean isCelsius = false;

 MainActivity temperaturaInserita = new MainActivity();

 //private final MutableLiveData<String> _TypeCurrentTemperatura = new MutableLiveData<>();
 private String _TypeCurrentTemperatura = "";  //indicates if the temperature is celsius or farenheit

public String getTypeCurrentTemperature() {
    return _TypeCurrentTemperatura;
}

public void changeTypeTemperature() {
    if (isCelsius) {
        isCelsius = false;
        _TypeCurrentTemperatura = "F°";
    } else {
        isCelsius = true;
        _TypeCurrentTemperatura = "C°";
    }
}

public int convertiTemperatura() {  //convertTemperature (that's the italian name)
    if (isCelsius) {
        grades = (int) ((temperaturaInserita.getInputTemperature() * 1.8) + 32);
    } else {
        grades = (int) ((int) ((temperaturaInserita.getInputTemperature()) -32) * .5556);
    }
    return grades;
}}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>
    <variable
        name="viewModel"
        type="com.example.convertitorecelsius_farenheit.MainViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="348dp"
        android:text="@{viewModel.typeCurrentTemperature}"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/cambiaTemperatura"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="80dp"
        android:text="c--f"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/inputTemperatura"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="52dp"
        android:ems="10"
        android:inputType="number"
        app:layout_constraintBottom_toTopOf="@+id/cambiaTemperatura"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/converti"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="273dp"
        android:layout_marginBottom="274dp"
        android:text="converti"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputTemperatura"
        app:layout_constraintVertical_bias="1.0" />

    <TextView
        android:id="@+id/textTemperatura"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="23dp"
        android:text="@{viewModel.convertiTemperatura()}"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

谁能帮帮我 :)

您的代码中有一些错误:

  • 您正在设置 activity 视图两次,删除第一行:setContentView(R.layout.activity_main);
  • 由于您使用的是视图绑定(不同于数据绑定),因此您无需调用 findViewById 将其替换为 inputTemperature = binding.inputTemperatura
  • 如果您已经在使用数据绑定,为什么还要使用视图绑定呢?您可以在数据绑定中完成所有 input/output 相关任务。
  • 您永远不应该实例化 ANDROID 活动或持有对它的引用,这是 Android 框架的任务,删除视图模型的行 MainActivity temperaturaInserita = new MainActivity();

检查这个答案可能对你有帮助:

编辑

您不需要从视图模型中调用 activity 的方法,这是一种不好的做法,因为如果系统破坏了您的 activity,您将在视图中以 NPE 结束模型,你有 2 个选项:

我建议使用第一个选项,这样您将始终在视图模型中拥有更新后的值,并且还可以在配置更改后继续存在。

请记住,无论如何,您的视图模型都不应该引用 Activity。