gpt4 book ai didi

android - 为什么在调用 setRetainInstance(true) 时,TextView 的文本没有恢复?

转载 作者:搜寻专家 更新时间:2023-11-01 08:35:58 25 4
gpt4 key购买 nike

我为 fragment 调用了 setRetainInstance(true)。我在 fragment 上添加了 EditText 和 TextView。旋转时,EditText 中的文字保留了下来,但 TextView 中的文字消失了。

我想我可以手动恢复TextView的文本,但我想知道为什么系统会自动恢复EditText的文本,而不是TextView的文本。我做错了什么吗?

重现步骤。

  1. 在EditText中输入“android”
  2. 按下 [测试 1] 按钮。 TextView 现在显示“android”
  3. 旋转设备。

结果

EditText 有“android”,但 TextView 是空的。

MyFragment.java

public class MyFragment extends Fragment
{
private static final String TAG = "MyFragment";
EditText etInput;
Button btnTest1;
TextView tvMessage;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
Log.d(TAG, "onCreateView()");
View v= inflater.inflate(R.layout.my_fragment, container, false);
etInput = (EditText)v.findViewById(R.id.etInput);
btnTest1 = (Button)v.findViewById(R.id.btnTest1);
btnTest1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
tvMessage.setText(etInput.getText().toString());
Log.d(TAG, "btnTest1 was clicked");
}
});

tvMessage = (TextView) v.findViewById(R.id.tvMessage);
return v;
}
}

主 Activity .java

public class MainActivity extends AppCompatActivity
{
String TAG = this.getClass().getName();

@Override
protected void onCreate(Bundle savedInstanceState)
{
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

FragmentManager fm = getSupportFragmentManager();
Fragment mf = fm.findFragmentById(R.id.placeholder);
if(mf == null)
{
Log.d(TAG, "creating new my fragment");
mf = new MyFragment();
mf.setRetainInstance(true);
fm.beginTransaction().add(R.id.placeholder, mf).commit();
}
}
}

我的 fragment .xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText

android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/tvMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btnTest1"
android:text="Test 1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:text="Fragment Test"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<FrameLayout
android:id="@+id/placeholder"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp">

</FrameLayout>
</LinearLayout>

最佳答案

如果要启用 TextView 的自动恢复,需要在 xml 中将 freezesText 属性设置为 true(或调用 setFreezesText(true)).

对于TextViewfreezesText默认值为false,但是对于EditText,默认值为

来自 freezesText 的文档:

If set, the text view will include its current complete text inside of its frozen icicle in addition to meta-data such as the current cursor position. By default this is disabled; it can be useful when the contents of a text view is not stored in a persistent place such as a content provider. For EditText it is always enabled, regardless of the value of the attribute.

关于android - 为什么在调用 setRetainInstance(true) 时,TextView 的文本没有恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com