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

问题描述

我正在尝试为应用程序构建多页表单。根据这里的建议,我尝试使用 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,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>

解决方法

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

#Data
df <- structure(list(Genes = c("abts-1","acp-2","acs-13","acs-22","acs-3","add-2","add-2"),Cell = c("MSx1","Ea","Ep","MSx1","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 个变量

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...