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