调用 replace() 方法后的片段 blinks/flashes
fragment blinks/flashes after calling replace() method
我有一个 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();
}
}
将 .addToBackStack(null)
添加到 fragmentTransaction 解决了我的问题。
private void replaceFragment(Fragment fragment, String fragmentId) {
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment, fragmentId)
.addToBackStack(null)
.commit();
}
通过让事务管理器执行 commitNow() 而不是 commit() 来解决
经过这么多小时的实验,找到了更好的解决方案。我可能会迟到,但肯定会对某人有所帮助。
您只需从代码中删除 fragmentTransition 即可。
fragmentTransaction!!.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
这将删除过渡动画并替换片段中的内容,同时删除闪烁效果。
编码愉快,谢谢
我有一个 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();
}
}
将 .addToBackStack(null)
添加到 fragmentTransaction 解决了我的问题。
private void replaceFragment(Fragment fragment, String fragmentId) {
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment, fragmentId)
.addToBackStack(null)
.commit();
}
通过让事务管理器执行 commitNow() 而不是 commit() 来解决
经过这么多小时的实验,找到了更好的解决方案。我可能会迟到,但肯定会对某人有所帮助。
您只需从代码中删除 fragmentTransition 即可。
fragmentTransaction!!.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
这将删除过渡动画并替换片段中的内容,同时删除闪烁效果。
编码愉快,谢谢