按下按钮后,我将用户在 EditText 中输入的文本替换为 TextView 的文本。一旦 TextView 文本发生更改,当我导航到另一个片段或 Activity 并返回时,TextView 已恢复为其原始文本。我尝试了多种保存实例状态的解决方案均无效。
Edit2:这是片段中的最新代码
public class TeamFragment extends Fragment {
private TextView testTextView;
private EditText testEditText;
private SharedPreferences pref;
private SharedPreferences.Editor editor;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = inflater.inflate(R.layout.fragment_team, container, false);
Button button = (Button)v.findViewById(R.id.recordBtn);
testEditText = v.findViewById(R.id.testEditText);
pref = this.getActivity().getSharedPreferences("my_pref",
Context.MODE_PRIVATE);
editor = pref.edit();
testTextView = (TextView) v.findViewById(R.id.testTextView);
final EditText testEditText = (EditText) v.findViewById(R.id.testEditText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testTextView.setText(testEditText.getText().toString());
editor.putString("val", testEditText.getText().toString());
editor.apply();
}
});
return v;
}
@Override
public void onStart() {
super.onStart();
String val = this.getActivity().getSharedPreferences("my_pref",
Context.MODE_PRIVATE).getString("val", "n/a");
if(val.equals("n/a")) {
testTextView.setText(val);
}
}
}
这是我的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light"
android:padding="8dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Record"
android:layout_centerHorizontal="true"
android:layout_below="@+id/tresEditText"
android:id="@+id/recordBtn"
android:onClick="displayEditText"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/testTextView"
android:text="Test"
android:layout_marginTop="20dp"
android:layout_marginLeft="30dp"/>
<EditText
android:layout_width="30dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="100dp"
android:id="@+id/testEditText"/>
</RelativeLayout>
最佳答案
您的应用程序崩溃,因为您尚未初始化 EditText
和 TextView
。
不要重写 onSaveInstanceState()
,而是考虑使用 SharedPreferences()
,因为 onSaveInstanceState()
用于在设备方向改变时保存状态被改变了。
在您的情况下,您可以做的是将 textView 数据保存在 SharedPreference
中,当您返回片段时,您可以在“onStart()”中检查 SharedPreferences()
code> 包含保存的值,然后相应地填充您的 textView。
您可以执行以下操作:
public class TeamFragment extends Fragment {
private TextView testTextView;
private EditText testEditText;
private SharedPreferences pref;
private SharedPreferences.Editor editor;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = inflater.inflate(R.layout.fragment_team, container, false);
Button button = (Button)v.findViewById(R.id.recordBtn);
textTextView = v.findViewById(R.id.your_id);
testEditText = v.findViewById(R.id.your_id);
pref = this.getActivity().getSharedPreferences("my_pref",
Context.MODE_PRIVATE);
editor = pref.edit();
testTextView = (TextView) v.findViewById(R.id.testTextView);
final EditText testEditText = (EditText)
v.findViewById(R.id.testEditText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testTextView.setText(testEditText.getText().toString());
editor.putString("val", testEditText.getText().toString());
editor.apply();
}
});
return v;
}
@Override
protected void onStart() {
super.onStart();
String val = this.getActivity().getSharedPreferences("my_pref",
Context.MODE_PRIVATE).getString("val", "n/a");
if(val.equals("n/a")) {
testTextView.setText(val);
}
}
}
关于java - 如何在片段中保存此 TextView 的实例状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59081957/