0

У меня есть фрагмент:фрагмент - EditText.setText (String) не работает, когда строка приходит из 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){...} не работает. Он ничего не устанавливает. Как будто, имя получает null значение от if(savedInstanceSaved != null){...}. Но Toasts, который я использовал внутри своих различных блоков кода, работает так, как ожидалось. Он сохраняет в onSaveInstanceState(Bundle savedInstanceState){...}, выполняя if(savedInstanceSaved != null){...}, что означает, что мой savedInstanceState не является нулевым, а также показывает правильное значение для name строки в if(instanceSaved){...}. Это означает, что мой код работает правильно во время изменения orientation. Но он не устанавливает какой-либо текст в методе setText(String).

Я также пробовал использовать setText("String"), и это работает. Как показано в коде. Что я делаю неправильно и чего не хватает? Пожалуйста помоги. Спасибо.

Примечание: Я использую EditText S внутри android.support.design.widget.TextInputLayout

EDIT: я обнаружил, что независимо от того, что, setText(name) всегда принимает начальное значение String name. Несмотря на то, что name в Toast показывает новое обновленное значение, setText() как-то всегда использует начальное значение. Кроме того, я заметил, что если я изменил ориентацию трижды, приложение выйдет из строя.

+0

.setText (name.toString()) попробуйте этот способ. –

+0

Это означает, что значение равно – Eenvincible

+0

@MFaisalHyder, что тоже не работает. И я даже не понимаю, почему мое приложение рушится каждый третий раз, когда я пытаюсь повернуть экран. –

ответ

1

Если у ваших представлений есть идентификаторы, которые они делают, тогда 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() заставляет фрагмент взаимодействовать с пользователем (в зависимости от его активности, которая возобновляется).

Update:

Основываясь на ваш комментарий ниже я 99% уверен, что проблема находится вне кода вы отображается.Ваша проблема в том, что у вас две копии ContactUsFragment в памяти.

Тот, у которого было восстановлено состояние, включая текст EditText, а затем еще один, который вы должны воссоздать. Следовательно, вы видите всплывающее сообщение с тостом (по мере восстановления старого фрагмента), но вы не видите значения, которые вы размещаете в EditText, потому что вы заменили представление старого фрагмента новым представлением ContactUsFragment, который не был восстановлен.

+0

У моих просмотров есть идентификаторы, но они не получаются автоматически восстановленными во время изменения ориентации. Кроме того, мое приложение падает при каждом третьем изменении ориентации с ошибкой LogCat 'NullPointerException' в' savedInstanceState.putString («sv_name», et_name.getText(). ToString()); ' –

+0

@SajibAcharya Я могу заверить вас в вашем' EditText' имеет прежнее значение текстового значения, оно не подлежит обсуждению, так работает Android. «NullPointerException» - это другая проблема, пожалуйста, создайте новый вопрос. –

+0

Я уверен, что Android работает именно так. Но в моем случае, против этого, текстовое значение не восстанавливается. Вот почему я разместил этот вопрос. Я могу поставить скриншоты, если хочешь. О 'NullPointerException', я создам новый вопрос, но сначала мне нужно решить эту проблему. Состояние фрагмента не сохраняется при изменении ориентации. –

0

Я пробовал много вещей, но в конце концов, я получил решение это очень simple..before мы знаем, как андроид ГЛАВНОЕ RestoreInstanceState и onSaveInstanceState в основном с использованием представления идентификатора

<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> 

присвоить идентификатор для обоих представлений. . Теперь андроид поддерживает состояние данных при изменении ориентации экрана.