如何在Android Studio中使用MVVM + Databinding设计登录名?

问题描述 投票:0回答:1

我是新手,没有编程经验。现在,我使用CODELABS.developer.google.com和developer.android.com学习Java + android,但是在设计“登录”模块时遇到了问题。这个问题花了我3天的时间。我每天都在Google上搜索解决方案,但仍然没有解决。

错误:

C:\Users\Admin\AndroidStudioProjects\exmaple\app\build\generated\data_binding_base_class_source_out\debug\out\com\exmaple\databinding\FragmentEmailEditBinding.java:15: ����: �Ҳ�������
import com.exmaple.ViewModel;
                  ^
  ����:   �� ViewModel
  �: ����� com.exmaple

C:\Users\Admin\AndroidStudioProjects\exmaple\app\build\generated\data_binding_base_class_source_out\debug\out\com\exmaple\databinding\FragmentEmailEditBinding.java:33: ����: �����ViewModel.Login������
  protected ViewModel.Login.EmailAuthViewModel mEmailAuthViewModel;
                           ^

LoginActivity.java

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        FragmentEmailEditBinding binding = DataBindingUtil.setContentView(this,R.layout.fragment_email_edit);
        EmailAuthViewModel emailAuthViewModel = new ViewModelProvider(this).get(EmailAuthViewModel.class);
        binding.getEmailAuthViewModel();
        binding.setLifecycleOwner(this);

        FragmentManager fragmentManager = getSupportFragmentManager();
        EmailAuthFragment emailAuthFragment = new EmailAuthFragment();
        fragmentManager.beginTransaction()
                .add(R.id.frag_signIn,emailAuthFragment).commit();
    }
}

fragment_email_edit.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="emailAuthViewModel"
            type="com.example.ViewModel.Login.EmailAuthViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="8dp">

        <EditText
            android:id="@+id/fieldEmail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:hint="@string/hint_email"
            android:inputType="textEmailAddress"
            android:text="@={emailAuthViewModel.email}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintBottom_toTopOf="@id/fieldPassword"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.25"
            app:layout_constraintVertical_chainStyle="packed" />

        <EditText
            android:id="@+id/fieldPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:hint="@string/hint_password"
            android:inputType="textPassword"
            android:text="@{emailAuthViewModel.password}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/fieldEmail"
            app:layout_constraintVertical_bias="0.25"
            app:layout_constraintVertical_chainStyle="packed" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

EmailAuthViewModel.java

public class EmailAuthViewModel extends ViewModel {

    public MutableLiveData<String> email = new MutableLiveData<>();
    public MutableLiveData<String> password = new MutableLiveData<>();

    public EmailAuthViewModel(MutableLiveData<String> email, MutableLiveData<String> password) {
        this.email = email;
        this.password = password;
    }
}

EmailAuthModel.java

class EmailAuthModel {

}
java android mvvm android-databinding
1个回答
0
投票

我的猜测是,这行binding.getEmailAuthViewModel(); 会引发NPE,因为您没有将viewmodel传递给任何地方的绑定。我认为您想将viewmodel传递给数据绑定文件,而不是从中获取。

© www.soinside.com 2019 - 2024. All rights reserved.