0

炒菜我有一個片段不工作:片段EditText.setText(字符串)字符串時,來自savedInstanceState但是當硬編碼

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){...}不工作。它沒有設置。就好像,名字從if(savedInstanceSaved != null){...}獲得null的值。但我在各種代碼塊中使用的Toasts按預期工作。它保存在onSaveInstanceState(Bundle savedInstanceState){...}中,執行if(savedInstanceSaved != null){...},這意味着我的savedInstanceState不爲空,並且還顯示if(instanceSaved){...}name字符串的正確值。這意味着我的代碼在orientation更改期間正常工作。但它不是在setText(String)方法中設置任何文本。

我也嘗試過使用setText("String"),這工作。如代碼所示。我在做什麼錯,我錯過了什麼?請幫忙。謝謝。

注: 我使用內部android.support.design.widget.TextInputLayout

編輯EditText S: 我發現,不管是什麼,setText(name)總是服用String name的初始值。即使Toast中的name顯示新的更新值,setText()總是使用初始值。 另外,我注意到,如果我改變方向三次,應用程序崩潰。

+0

.setText(name.toString())試試這種方式。 –

+0

這基本上意味着價值爲null – Eenvincible

+0

@MaisaiHyder,這也不起作用。而我甚至不明白爲什麼我的應用每三秒鐘都會崩潰,我正在嘗試旋轉屏幕。 –

回答

1

如果您的視圖有ID,那麼Android會自動恢復視圖狀態。這發生在onCreateView()之後。所以你的代碼正在工作,你的改變只是失去了。

爲了詳細描述,引述official Fragment documentation

  1. onAttach(活動)調用一次的片段與它的活性相關。
  2. onCreate(Bundle)調用來初始化片段的創建。
  3. onCreateView(LayoutInflater,ViewGroup,Bundle)創建並返回與片段關聯的視圖層次結構。
  4. onActivityCreated(Bundle)告訴片段其活動已完成自己的Activity.onCreate()。
  5. onViewStateRestored(Bundle)告訴片段,其視圖層次結構的所有保存狀態都已恢復。
  6. onStart()使片段對用戶可見(基於其包含的活動正在啓動)。
  7. onResume()使片段開始與用戶交互(基於其包含的活動正在恢復)。

更新:基於您的評論

下面我99%的信心問題是你所顯示的代碼之外。您的問題是您在內存中有兩份ContactUsFragment

一個已恢復狀態,包括EditText的文本,然後是您必須重新創建的另一個文本。因此,您會看到吐司彈出窗口(因爲舊片段已恢復),但由於您已將新片段的視圖替換爲新的ContactUsFragment的視圖,因此您沒有看到您放置在EditText中的值,尚未恢復。

+0

我的視圖有ID,但它們在方向更改期間沒有自動恢復。此外,我的應用程序崩潰在LogCat錯誤'NullPointerException'在'savedInstanceState.putString(「sv_name」,et_name.getText()。toString());' –

+0

@SajibAcharya我可以向你保證你的'EditText'它恢復了舊的文本價值,這不是可協商的,它是Android的工作原理。 'NullPointerException'是一個不同的問題,請創建一個新的問題。 –

+0

我相信Android的工作方式。但在我的情況下,與此相反,文本值沒有得到恢復。這就是我發佈這個問題的原因。如果你願意,我可以放置屏幕截圖。關於'NullPointerException',我會創建一個新的問題,但我需要首先解決這個問題。我的片段狀態在方向更改時未保存。 –

0

我嘗試了很多事情,但最終,我得到它是非常的解決方案simple..before我們知道RestoreInstanceState的onSaveInstanceState和如何在Android主基本上都採用視圖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。 .now android保持屏幕方向改變的數據狀態