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 がnullから値を取得しているかのようにif(savedInstanceSaved != null){...}。しかし、Toastsコードのさまざまなブロック内で使用した は、期待どおりに機能しています。に保存してonSaveInstanceState(Bundle savedInstanceState){...}実行しています。これは、 myが null ではなく、stringの正しい値を示していることif(savedInstanceSaved != null){...}を意味します。これは、変更中にコードが正しく機能していることを意味します。しかし、メソッドにテキストを設定していません。savedInstanceStatenameif(instanceSaved){...}orientationsetText(String)

も使用してみsetText("String")ましたが、うまくいきます。コードに示すように。私は何が間違っていて、何が欠けていますか? 助けてください。ありがとうございました。

注:EditText内部で sを使用していますandroid.support.design.widget.TextInputLayout

編集:何があっても、setText(name)常に の初期値を取っていることがわかりましたString namenameではToast新しく更新された値が表示されますが、どういうsetText()わけか常に初期値を使用しています。また、向きを 3 回変更すると、アプリがクラッシュすることに気付きました。

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、メモリ内に のコピーが 2 つあることです。

のテキストを含めて状態が復元されたEditTextものと、再作成されたはずの別のもの。したがって、(古いフラグメントが復元されるため) トースト ポップアップが表示されますが、古いフラグメントのビューを新しい のビューに置き換えたため、 に配置した値は表示EditTextされません。ContactUsFragment復元されていません。

于 2015-11-09T17:05:32.913 に答える