首页 > 解决方案 > 即使在添加 ViewModel 后配置也会发生变化:Android 架构组件

问题描述

我从生命周期架构库中添加了一个ViewModel类。但它在我的代码中不起作用。我做错了什么。我是 android 的 ViewModel Arch 组件的新手。

这是我的代码:

摇篮:

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"

}

视图模型:

import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;

public class NameViewModel extends ViewModel {

// Create a LiveData with a String
private MutableLiveData<String> mCurrentName;

public MutableLiveData<String> getmCurrentName() {
    if (mCurrentName == null) {
        mCurrentName = new MutableLiveData<>();
    }
    return mCurrentName;
}

}

MainActivity.java

import android.arch.lifecycle.Observer;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private NameViewModel nameViewModel;

private TextView lblText;
private EditText txtValue;

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

    lblText = findViewById(R.id.textview);
    txtValue = findViewById(R.id.editText);

    final Observer<String> nameObserver = new Observer<String>() {
        @Override
        public void onChanged(@Nullable String data) {

            lblText.setText(data);

        }
    };

    nameViewModel.getmCurrentName().observe(this, nameObserver);

    txtValue.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence value, int start, int before, int count) {
            nameViewModel.getmCurrentName().setValue(value.toString());
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

  }
}

我错过了一些必要的东西吗?

任何帮助将不胜感激。太感谢了。

标签: androidviewmodel

解决方案


把它放在你的onCreate方法中

nameViewModel = ViewModelProviders.of(this, null).get(NameViewModel.class);

并参考这个这个链接了解更多信息ViewModelProvider.Factory


推荐阅读