#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
только один раз за всю жизнь этого фрагмента.