调用replace()方法后,片段闪烁/闪烁 [英] fragment blinks/flashes after calling replace() method

查看:127
本文介绍了调用replace()方法后,片段闪烁/闪烁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 MainActivity ,应该在两个片段之间切换:内容和设置(扩展了 PreferenceFragmentCompat ).一切正常,但是最近我实现了 Dagger 2 依赖注入,并且我的设置"片段开始闪烁.当您按下底部导航栏上的设置项目时,有时会出现设置片段,然后消失几毫秒,然后再次出现.

I have a MainActivity, that is supposed to switch between two fragments: Content and Settings (extends PreferenceFragmentCompat). Everything worked fine, but recently I implemented Dagger 2 dependency injection, and my Settings fragment started to blink. When you press settings item on the bottom navigation bar, sometimes settings fragment appears, then disappears for few milliseconds and appears again.

我看不到发生这种情况的确切原因.

I don't see any explainable reason why this happens, and what exactly happens.

请问您能解释一下发生的情况以及如何解决此问题吗?

Can you, please, explain what's happening and how to fix this?

这是我的MainActivity的代码.

Here is the code of my 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();

}
}

推荐答案

在fragmentTransaction中添加 .addToBackStack(null)解决了我的问题.

Adding .addToBackStack(null) to the fragmentTransaction solved my problem.

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

这篇关于调用replace()方法后,片段闪烁/闪烁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆