微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

加载时 settingsFragment 闪烁

如何解决加载时 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 举报,一经查实,本站将立刻删除。