尝试使用视图模型检索 Edittext 输入时获取原始数据

时间:2021-01-15 14:25:45

标签: java android android-fragments android-viewmodel android-binder

我正在尝试为应用程序构建多页表单。根据这里的建议,我尝试使用 ViewModel 来存储用户输入的数据,以便轻松地将其获取到另一个片段中,并在他们来回导航时将 edittext 更新为他们之前的输入。应用程序还必须具有视图绑定。

但是,当尝试在最后一个片段中检索 Toast 消息中的输入或将其放入 edittext 时,我将其作为输出 "androidx.lifecycle.MutableLiveData@8177d2c"

为什么会这样?我将 .toString() 方法与 getText() 一起使用,所以我不知道为什么

我的代码:

SharedViewModel.java

package com.loopbreakr.viewmodelform;

import androidx.lifecycle.ViewModel;
import androidx.lifecycle.MutableLiveData;

public class SharedViewModel extends ViewModel {
    private MutableLiveData<CharSequence> answerOneText = new MutableLiveData<>();
    private MutableLiveData<CharSequence> answerTwoText = new MutableLiveData<>();
    private MutableLiveData<CharSequence> answerThreeText =  new MutableLiveData<>();

    public void setAnswerOneText(CharSequence input) {
        answerOneText.setValue(input);
    }

    public void setAnswerTwoText(CharSequence input) {
        answerTwoText.setValue(input);
    }

    public void setAnswerThreeText(CharSequence input){
        answerThreeText.setValue(input);
    }

    public MutableLiveData<CharSequence> getAnswerOneText() {
        return answerOneText;
    }

    public MutableLiveData<CharSequence> getAnswerTwoText() {
        return answerTwoText;
    }

    public MutableLiveData<CharSequence> getAnswerThreeText() {
        return answerThreeText;
    }
}

MainActivity.java

package com.loopbreakr.viewmodelform;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
        NavController navController = navHostFragment.getNavController();
    }
}

我试图从中检索数据的 PageOne.java 片段

package com.loopbreakr.viewmodelform;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import com.loopbreakr.viewmodelform.databinding.FragmentPageOneBinding;


public class PageOne extends Fragment {
    private SharedViewModel sharedViewModel;
    private FragmentPageOneBinding binding = null;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewDataBinding fragmentBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_page_one,container,false);
        binding = (FragmentPageOneBinding) fragmentBinding;
        return  binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        if(binding != null){
            binding.pageOneInput.setText(sharedViewModel.getAnswerOneText().toString());
            binding.nextToTwo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sharedViewModel.setAnswerOneText(binding.pageOneInput.getText().toString());
                    goNext();
                }
            });
            binding.returnButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    goBack();
                }
            });
        }
    }

    public void goNext() {
        NavController navController = Navigation.findNavController(getView());
        navController.navigate(R.id.action_pageOne_to_pageTwo);
    }
    public void goBack(){
        NavController navController = Navigation.findNavController(getView());
        navController.navigate((R.id.action_pageOne_to_description));
    }

}

最后一个片段 PageThree.java,我尝试获取数据并将其显示为 Toast 消息

package com.loopbreakr.viewmodelform;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import com.loopbreakr.viewmodelform.databinding.FragmentPageOneBinding;


public class PageOne extends Fragment {
    private SharedViewModel sharedViewModel;
    private FragmentPageOneBinding binding = null;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ViewDataBinding fragmentBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_page_one,container,false);
        binding = (FragmentPageOneBinding) fragmentBinding;
        return  binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        if(binding != null){
            binding.pageOneInput.setText(sharedViewModel.getAnswerOneText().toString());
            binding.nextToTwo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sharedViewModel.setAnswerOneText(binding.pageOneInput.getText().toString());
                    goNext();
                }
            });
            binding.returnButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    goBack();
                }
            });
        }
    }

    public void goNext() {
        NavController navController = Navigation.findNavController(getView());
        navController.navigate(R.id.action_pageOne_to_pageTwo);
    }
    public void goBack(){
        NavController navController = Navigation.findNavController(getView());
        navController.navigate((R.id.action_pageOne_to_description));
    }

}

此外,这里是 XML,以防它们相关

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />

</androidx.constraintlayout.widget.ConstraintLayout>

fragment_page_one.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="viewModel"
            type="com.loopbreakr.viewmodelform.SharedViewModel"/>

    </data>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PageOne">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

    <Button
        android:id="@+id/nextToTwo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="next"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/returnButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Return"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <MultiAutoCompleteTextView
        android:id="@+id/pageOneInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textAutoCorrect|textMultiLine"
        android:maxLines="4"
        android:minLines="4"
        app:layout_constraintBottom_toBottomOf="@+id/textView2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

1 个答案:

答案 0 :(得分:0)

覆盖模型类中的 toString 方法,它将起作用

#Data
df <- structure(list(Genes = c("abts-1", "acp-2", "acp-2", "acs-13", 
"acs-22", "acs-22", "acs-3", "acs-3", "add-2", "add-2"), Cell = c("MSx1", 
"Ea", "Ep", "MSx1", "Ea", "Ep", "Ea", "Ep", "Ea", "Ep"), AC = c(94.9, 
301, 188, 69.1, 176, 64.3, 156, 75.5, 123, 125), FC = c(6.81, 
32.4, 20.6, 8.2, 19.4, 7.7, 17.2, 8.87, 6.62, 6.69)), row.names = c(NA, 
-10L), class = "data.frame")

在我的模型类中有四个变量,这就是为什么它在 beandetails 中显示 4 个变量