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