Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么调用setRetainInstance(true)时,TextView的文本未还原?_Android_Android Fragments - Fatal编程技术网

Android 为什么调用setRetainInstance(true)时,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

我为一个片段调用了setRetainInstance(true)。我在片段上添加了EditText和TextView。旋转时,EditText中的文本保留,但TextView中的文本消失

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

复制的步骤

  • 在编辑文本中键入“android”
  • 按下[测试1]按钮。文本视图现在显示“android”
  • 旋转设备
  • 结果

    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;
        }
    }
    
    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组件存在相同的问题。你的意思是替换为?我试过了,但它导致了通货膨胀异常。若要恢复按钮上的文本,冻结文本也适用于按钮,因为按钮是文本视图。