加载时 settingsFragment 闪烁

问题描述

我有一个奇怪的问题,我的 Fragment(它是预设的 settingsFragment,它使用了一个首选屏幕布局)在每个不是它的第一笔交易上都闪烁(见视频:{ {3}})

我超级困惑! 我的 mainActivity(我使用的唯一活动)包含两个片段:mainFragmentsettingsFragmentsettingsFragment 的事务从点击 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 (将#修改为@)