问题描述
我有一个奇怪的问题,我的 Fragment(它是预设的 settingsFragment
,它使用了一个首选屏幕布局)在每个不是它的第一笔交易上都闪烁(见视频:{ {3}})
我超级困惑!
我的 mainActivity
(我使用的唯一活动)包含两个片段:mainFragment
和 settingsFragment
。 settingsFragment
的事务从点击 mainFragment
中的 onClickListener 开始,它通过接口与 mainActivity
通信(因此事务是从 Activity 执行的!)。它也被添加到 backstack 中。
@Override
public void onTvSettingsClicked() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.mainFl,settingsFragment)
.addToBackStack(null)
.commit();
}
有趣的是,当我覆盖 onBackpressed()
并调用 recreate()
时,下一个事务再次正常工作。好像片段没有被正确删除(?)。
此外,在上面显示的代码之后使用 getSupportFragmentManager().executePendingTransactions()
会使闪烁出现的频率明显降低,但仍然不能完全修复它。
我还注意到,使用过渡动画似乎有助于解决问题,但我宁愿不使用。
闪烁不会发生在普通片段(具有“经典”布局)
在我的主活动中:
public class MainActivity extends AppCompatActivity implements MainFragment.mainFragmentListener,SettingsFragment.settingsFragmentListener {
private Fragment mainFragment;
private Fragment settingsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainFragment = new MainFragment();
settingsFragment = new SettingsFragment();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.flMainActivity,mainFragment)
.setReorderingallowed(true)
.commit();
}
}
@Override
public void onTvSettingsClicked() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.flMainActivity,settingsFragment)
.setReorderingallowed(true)
.addToBackStack(null)
.commit();
getSupportFragmentManager().executePendingTransactions();
}
在我的 mainFragment 中:
public class MainFragment extends Fragment {
private TextView tvSettings;
private mainFragmentListener listener;
public interface mainFragmentListener {
void onTvSettingsClicked();
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main,container,false);
tvSettings = view.findViewById(R.id.mainFragment_tvSettings);
tvSettings.setonClickListener(v -> {
listener.onTvSettingsClicked();
});
return view;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof mainFragmentListener) {
listener = (mainFragmentListener) context;
}
else {
throw new RuntimeException(context.toString() + " must implement mainFragmentListener");
}
}
// required method to reset the interface when the fragment is being destroyed
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
如前所述,我的 settingsFragment 使用的是 android studio 的预设布局,并且只包含已经生成的方法 onCreatePreference
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)