Устройства Samsung относятся к FragmentTransactions иначе, чем другие устройства?
Я пытался решить проблему, которая сводит меня с ума целую вечность. У меня есть приложение с одним Activity, которое показывает разные экраны путем динамического обмена фрагментами, то есть обычным
getFragmentManager().beginTransaction().replace(R.id.fragementContainer, new SomeFragment()).commit();
Это прекрасно работает на моем Nexus 4, Nexus 5, Nexus 7 2012, Nexus 7 2013, Moto G 1st gen и т. Д. В основном все, кроме устройств Samsung (SGS5, SGS6). На этих устройствах иногда (редко, но не достаточно редко) кажется, что вызов replace() неверно истолковывается как вызов add(), и новый фрагмент появляется поверх предыдущего.
Я попытался воспроизвести ошибку, но, кажется, нет никакого паттерна к нему. Так как я нигде не получаю сообщений об ошибках, я не могу устранить их.
2 ответа
Вот почему я всегда использую библиотеки поддержки. Исходный код находится в вашем проекте и не был изменен третьими лицами. Вы уже используете пакет поддержки?
Это вполне может быть вызвано некоторыми "оптимизациями" Samsung. Единственное, что я могу посоветовать, это использовать remove()
а также add()
вместо replace()
, Реализация в рамках FragmentTransaction
отличается, поэтому есть вероятность, что это будет вести себя по-другому.
Вы можете легко удалить фрагмент, потому что он имеет тот же идентификатор, что и контейнер. Попробуй это:
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment oldFragment = fragmentManager.findFragmentById(R.id.container);
if (oldFragment != null) transaction.remove(oldFragment);
transaction.add(R.id.container, new Fragment(), "tag").commit();