java - 如何在片段中保存此 TextView 的实例状态?

标签 java android-fragments textview android-savedstate

按下按钮后,我将用户在 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>

最佳答案

您的应用程序崩溃,因为您尚未初始化 EditTextTextView

不要重写 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/

相关文章:

android - 将 textview 的内容传递给邮件正文

android - 如何在 Textview Android 的末尾添加图像

android - 如何在 android 中制作多级(超过 3 级)抽屉导航?

android - 为 TextView 生成一个简单的分隔线

java - 如何设置默认选中的组件

java - Hibernate-search 5.0 空间 - 不确定它是否在哈希中存储纬度/经度

android - fragment 内的 ViewPager 不起作用

android - 方向更改后 fragment 中的 getActivity() 为空

java - 当我尝试通过套接字流发送/接收 jxrpc 时出现 "socket closed"错误

java - 打开存在的文件时出现 FileNotFoundException?