0

我有一个片段:

ContactUsFragment.java

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.app.Fragment;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;


/**
 *
 */
public class ContactUsFragment extends Fragment {

    private EditText et_name, et_phoneno;
    private String name = "", phone = "";
    private boolean instanceSaved = false;

    public ContactUsFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState != null) {
            Toast.makeText(getActivity().getBaseContext(), "Not null", Toast.LENGTH_LONG).show();
            name = savedInstanceState.getString("sv_name");
            phone = savedInstanceState.getString("sv_phone");
            instanceSaved = savedInstanceState.getBoolean("InstanceSaved");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_contact_us, container, false);
        registerETs(view);

        if(instanceSaved) {
            Toast.makeText(getActivity().getBaseContext(), "Instance was saved", Toast.LENGTH_LONG).show();
            Toast.makeText(getActivity().getBaseContext(), name, Toast.LENGTH_LONG).show(); //--This line works. Gives the correct value of string upon orientation change--
            Toast.makeText(getActivity().getBaseContext(), phone, Toast.LENGTH_LONG).show();
            et_name.setText(name); //--This line does not work--
            et_name.setText("Another String"); //--This  line does not work--
            et_phoneno.setText(phone); //--This line does not work--
        }

        et_name.setText("A String"); //--This line works--

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();

    }

    public void registerETs(View view) {
        et_name = (EditText)view.findViewById(R.id.input_name);
        et_phoneno = (EditText)view.findViewById(R.id.input_phoneno);
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Toast.makeText(getActivity().getBaseContext(), "saving", Toast.LENGTH_LONG).show();
        savedInstanceState.putString("sv_name", et_name.getText().toString());
        savedInstanceState.putString("sv_phone", et_phoneno.getText().toString());
        savedInstanceState.putBoolean("InstanceSaved", true);
    }
}

我面临的问题是,et_name.setText(name)内部if(instanceSaved){...}无法正常工作。它什么也没设置。好像, name 正在nullif(savedInstanceSaved != null){...}. 但是Toasts我在各种代码块中使用的代码按预期工作。它正在保存onSaveInstanceState(Bundle savedInstanceState){...},正在执行if(savedInstanceSaved != null){...},这意味着 mysavedInstanceState不是 null 并且还显示了namestring in的正确值if(instanceSaved){...}。这意味着我的代码在更改期间可以正常工作orientation。但它没有在setText(String)方法中设置任何文本。

我也尝试过使用setText("String"),并且有效。如代码所示。我做错了什么,我错过了什么?请帮忙。谢谢你。

注意:我在EditText里面使用 sandroid.support.design.widget.TextInputLayout

编辑:我发现无论如何,setText(name)总是取String name. 尽管nameinToast显示了新的更新值,但setText()总是以某种方式始终使用初始值。另外,我注意到如果我三次更改方向,应用程序就会崩溃。

4

2 回答 2

1

如果您的视图有 ID,它们确实有,那么 Android 将自动恢复视图状态。这发生在onCreateView(). 所以您的代码正在运行,您的更改只是丢失了。

详细说明,引用官方 Fragment 文档

  1. 一旦片段与其活动相关联,就会调用 onAttach(Activity)。
  2. onCreate(Bundle) 调用以进行片段的初始创建。
  3. onCreateView(LayoutInflater, ViewGroup, Bundle) 创建并返回与片段关联的视图层次结构。
  4. onActivityCreated(Bundle) 告诉片段它的活动已经完成了它自己的 Activity.onCreate()。
  5. onViewStateRestored(Bundle) 告诉片段其视图层次结构的所有已保存状态都已恢复。
  6. onStart() 使片段对用户可见(基于其包含的活动正在启动)。
  7. onResume() 使片段开始与用户交互(基于其包含的活动被恢复)。

更新:

根据您在下面的评论,我 99% 确信问题不在您显示的代码范围内。您的问题是您ContactUsFragment在内存中有两个副本。

已恢复其状态的一个,包括EditText的文本,然后是您必须重新创建的另一个。因此,您会看到 toast 弹出窗口(旧片段已恢复),但您没有看到放置在 中的值EditText,因为您已将旧片段的视图替换为新ContactUsFragment的视图,该视图具有没有被恢复。

于 2015-11-09T17:05:32.913 回答
0

我尝试了很多事情,但最后,我得到了非常简单的解决方案..在我们知道android如何主要使用RestoreInstanceState和onSaveInstanceState基本上使用视图ID

<android.support.design.widget.TextInputLayout
 android:id="@+id/ids1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 <EditText
  android:id="@+id/ids2"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/></android.support.design.widget.TextInputLayout>

为两个视图分配 id ..现在 android 维护屏幕方向上的数据状态已更改

于 2017-05-10T10:59:50.440 回答