Android 为什么调用setRetainInstance(true)时,TextView的文本未还原?
我为一个片段调用了setRetainInstance(true)。我在片段上添加了EditText和TextView。旋转时,EditText中的文本保留,但TextView中的文本消失 我想我可以手动恢复TextView的文本,但我想知道为什么系统会自动恢复EditText的文本,而不是TextView的文本。我做错什么了吗 复制的步骤Android 为什么调用setRetainInstance(true)时,TextView的文本未还原?,android,android-fragments,Android,Android Fragments,我为一个片段调用了setRetainInstance(true)。我在片段上添加了EditText和TextView。旋转时,EditText中的文本保留,但TextView中的文本消失 我想我可以手动恢复TextView的文本,但我想知道为什么系统会自动恢复EditText的文本,而不是TextView的文本。我做错什么了吗 复制的步骤 在编辑文本中键入“android” 按下[测试1]按钮。文本视图现在显示“android” 旋转设备 结果 EditText具有“android”,但Text
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;
}
}
MainActivity.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();
}
}
}
my_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)
)
对于文本视图
,冻结文本
的默认值为假
,但对于编辑文本
,默认值为真
根据以下文件:
如果已设置,文本视图将在
除了当前光标等元数据外,它还冻结了冰柱
位置。默认情况下,这是禁用的;当
文本视图的内容不会存储在持久位置,例如
内容提供商。对于EditText,它始终处于启用状态,而不考虑
属性的值
setRetainInstanceState将保留片段本身的状态,而不是该片段中包含的UI/视图。要做到这一点,您需要在片段中全局保存一些值,然后在onCreateView中将视图重置为这些值。我在某个地方读到,如果您使用xml显式定义片段(带有标记),这将起作用,但我不知道这是否有助于您,为什么EditText的文本会自动恢复?@SinJeong hun我读到的文档中有两个UI组件存在相同的问题。你的意思是替换为?我试过了,但它导致了通货膨胀异常。若要恢复按钮上的文本,冻结文本也适用于按钮,因为按钮是文本视图。