【问题标题】:fragment blinks/flashes after calling replace() method调用 replace() 方法后片段闪烁/闪烁
【发布时间】:2018-06-20 19:11:12
【问题描述】:

我有一个MainActivity,它应该在两个片段之间切换:内容和设置(扩展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();

}
}

【问题讨论】:

    标签: android fragment dagger-2 fragmenttransaction fragmentmanager


    【解决方案1】:

    .addToBackStack(null) 添加到fragmentTransaction 解决了我的问题。

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

    【讨论】:

    • 多么奇怪;这也为我解决了闪烁问题......但是当按下后退按钮时选项卡的行为不正确
    【解决方案2】:

    经过这么多小时的实验,找到了更好的解决方案。我可能会迟到,但肯定会对某人有所帮助。

    您只需从代码中删除 fragmentTransition 即可。 fragmentTransaction!!.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)

    这将移除你的过渡动画并替换片段内的内容,同时移除闪烁效果。

    编码愉快,谢谢

    【讨论】:

      【解决方案3】:

      通过让事务管理器执行 commitNow() 而不是 commit() 解决

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多