Компонент навигации для Android

#java #android

Вопрос:

компонент навигации Android перезагружает фрагмент и снова наблюдает изменяемые данные при переходе от фрагмента к фрагменту , я попробовал один прослушиватель наблюдения , но ничего не происходит, продолжайте перезагружать и снова нажимать api

 public class TermsFragment extends Fragment {  private TermsViewModel termsViewModel; private FragmentTermsBinding binding;  public View onCreateView(@NonNull LayoutInflater inflater,  ViewGroup container, Bundle savedInstanceState) {  termsViewModel = new ViewModelProvider(this).get(TermsViewModel.class);  termsViewModel.init(getContext());  binding = FragmentTermsBinding.inflate(inflater, container, false);  termsViewModel.terms.observe(getViewLifecycleOwner(), terms -gt; {  if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.N) {  binding.terms.setText(Html.fromHtml(terms.replaceAll("lt;img. ?gt;", ""), Html.FROM_HTML_MODE_COMPACT));  } else {  binding.terms.setText(Html.fromHtml(terms.replaceAll("lt;img. ?gt;", "")));  }   });   View root = binding.getRoot();  return root; }  @Override public void onDestroyView() {  super.onDestroyView();  binding = null;  } }  

и мой класс viewmodel

 public class TermsViewModel extends ViewModel implements Onresponse {  public MutableLiveDatalt;Stringgt; terms;  Context context=null;  public TermsViewModel() {  terms = new MutableLiveDatalt;gt;();  }  public void init(Context context){  this.context=context;  Maplt;String,Objectgt; body=new HashMaplt;gt;();  body.put("st", Api.app_data);  body.put("id",1);  body.put("lg",Constant.langstr);  Constant.connect(context,Api.app_data,body,this::onResponse,false); }  @Override public void onResponse(String st, JSONObject object, int online) {  if(object!=null) {  try {  terms.setValue(object.getString("data"));  } catch (JSONException e) {  e.printStackTrace();  }   }  }  }  

Комментарии:

1. добавьте свой код .

2. Добавьте свой сингл observer тоже

3. @Manohar обновлено

4. Никогда не сохраняйте контекст/представление в ViewModel , это приведет к утечке памяти .

5. onCreateView будет вызываться каждый раз, когда вы возвращаетесь к фрагменту . Вам нужно проверить, есть ли у viewmodel уже данные/нет . если у него есть данные, затем установите данные в пользовательский интерфейс, иначе извлеките данные с сервера .

Ответ №1:

При перемещении вперед и назад представление не сохраняется, но фрагмент сохраняется. Таким образом, вы можете переместить любой код инициализации в onCreate вместо onCreateView . onCreate вызывается один раз за время жизни фрагмента.

 override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)    termsViewModel = new ViewModelProvider(this).get(TermsViewModel.class);  termsViewModel.init(getContext()); }  

Таким образом, вы будете:

  • создайте модель представления только один раз! Это очень важно, так как замена модели представления новым экземпляром удаляет все ранее загруженные данные;
  • вызовите init только один раз за всю жизнь этого фрагмента.