фрагмент мигает/мигает после вызова метода replace()

У меня есть MainActivity, который должен переключаться между двумя фрагментами: Content и Settings (расширяет PreferenceFragmentCompat). Все работало нормально, но недавно я реализовал внедрение зависимостей Dagger 2, и мой фрагмент настроек начал мигать. При нажатии пункта настроек на нижней панели навигации иногда появляется фрагмент настроек, затем исчезает на несколько миллисекунд и снова появляется.

Я не вижу никакой объяснимой причины, почему это происходит, и что именно происходит.

Объясните, пожалуйста, что происходит и как это исправить?

Вот код моего MainActivity.

MainActivity.java

public class MainActivity extends BaseActivity
    implements BottomBarConstructor.BottomBarSelectItemListener,
    MainActivityContract.View {

public final static int REQUEST_CODE = 1;

@Inject
MainActivityContract.Presenter<MainActivityContract.View> presenter;

private EffectsControlFragment effectsControlFragment;
private SettingsFragment settingsFragment;

private FragmentManager fragmentManager;

private BottomNavigationView bottomNavigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    createFragments();
    bindViews();
    initializeFragment();

    getActivityComponent().inject(this);
    presenter.onAttach(this);
    presenter.onBottomBarCreate();
}

@Override
public void onSelectItem(String fragmentId) {
    changeFragment(fragmentId);
}


@Override
public void createBottomBar(List<BottomBarItem> items) {
    new BottomBarConstructor(this, bottomNavigationView).create(items);
}

public void changeFragment(String fragmentId) {
    switch (fragmentId) {
        case "main":
            replaceFragment(effectsControlFragment, fragmentId);
            break;
        case "settings":
            replaceFragment(settingsFragment, fragmentId);
            break;
        default:
            replaceFragment(EffectsControlFragment.newInstance(), fragmentId);
    }
}

private void replaceFragment(Fragment fragment, String fragmentId) {
    fragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment, fragmentId)
            .commit();
}

private void createFragments() {
    effectsControlFragment = EffectsControlFragment.newInstance();
    settingsFragment = SettingsFragment.newInstance();
    fragmentManager = getSupportFragmentManager();
}

private void bindViews() {
    bottomNavigationView = findViewById(R.id.navigation_bar);
}

private void initializeFragment() {
    fragmentManager.beginTransaction()
            .add(R.id.fragment_container, EffectsControlFragment.newInstance())
            .commit();

}
}

person Dmitry Smolyaninov    schedule 11.01.2018    source источник


Ответы (3)


Добавление .addToBackStack(null) к fragmentTransaction решило мою проблему.

private void replaceFragment(Fragment fragment, String fragmentId) {
        fragmentManager.beginTransaction()
                .replace(R.id.fragment_container, fragment, fragmentId)
                .addToBackStack(null)
                .commit();
    }
person Dmitry Smolyaninov    schedule 11.01.2018
comment
как странно; это также исправило мигание для меня ... но тогда вкладки не работают правильно при нажатии кнопки «Назад» - person pete; 11.08.2020

После стольких часов экспериментов нашел лучшее решение. Я могу опоздать, но уверен, что это будет помощь для кого-то.

Все, что вам нужно сделать, это просто удалить fragmentTransition из вашего кода. fragmentTransaction!!.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)

Это удалит вашу анимацию перехода и заменит содержимое внутри фрагмента, а также удалит эффект мерцания.

Удачного кодирования, спасибо

person ABHIMANGAL MS    schedule 08.04.2021

решено, заставив диспетчер транзакций выполнять commitNow() вместо commit()

person pete    schedule 11.08.2020