为了账号安全,请及时绑定邮箱和手机立即绑定

片段交易.替换导致应用程序中的白色(空白?)屏幕

片段交易.替换导致应用程序中的白色(空白?)屏幕

C#
慕田峪4524236 2022-08-20 14:49:57
我的应用的流程如下:主要活动: 家居碎片 ->停电设置碎片 ->停电碎片 ->家居碎片出于某种原因,当我尝试从BlackoutFragment转到HomeFragment时,MainActivity变为空,并且在我离开应用程序并返回它之前没有任何渲染。左边是HomeFragment通常的样子,右边是当我导航回它时的样子:我用来设置片段的方法集:    // Which is invoked like     // SetFragment(typeof(HomeFragment), "Home", true, true, false);    public void SetFragment(Type fragmentType, string fragmentName, bool addToBackStack, bool showNavigationIndicator, bool useSlideAnimation)    {        if (fragmentType == typeof(HomeFragment))            SetFragment(new HomeFragment(), fragmentType, fragmentName, addToBackStack, showNavigationIndicator, useSlideAnimation);        else if (fragmentType == typeof(BlackoutFragment))            SetFragment(new BlackoutFragment(), fragmentType, fragmentName, addToBackStack, showNavigationIndicator, useSlideAnimation);        else if (fragmentType == typeof(BlackoutSetupFragment))            SetFragment(new BlackoutSetupFragment(), fragmentType, fragmentName, addToBackStack, showNavigationIndicator, useSlideAnimation);    }    private void SetFragment(Fragment fragment, Type fragmentType, string fragmentName, bool addToBackStack, bool showNavigationIndicator, bool useSlideAnimation)    {        FragmentTransaction transaction = this.FragmentManager.BeginTransaction();        if (useSlideAnimation)            transaction.SetCustomAnimations(Resource.Animator.enter_from_left, Resource.Animator.exit_to_right, Resource.Animator.enter_from_right, Resource.Animator.exit_to_left);        transaction.Replace(Resource.Id.content_main_fragment_layout, fragment, fragmentType.Name);        if (addToBackStack)            transaction.AddToBackStack(null);        transaction.Commit();        this.FragmentManager.ExecutePendingTransactions();        if (!string.IsNullOrWhiteSpace(fragmentName))            SetAppBarTitle(fragmentName);        if (showNavigationIndicator) _navDrawerToggle.DrawerIndicatorEnabled = true;        else _navDrawerToggle.DrawerIndicatorEnabled = false;    }
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

问题是使用,以便在BlackoutFragment上使用倒计时来更新UI。将其替换为似乎已解决了该问题。我的猜测是,在UI线程上运行的经过的事件“RefreshView”在尝试离开片段时引起了一些趣味。System.Timers.TimerSystem.Threading.Timer


所以替换:


    public override void OnResume()

    {

        base.OnResume();

        //...

        _refreshTimer = new System.Timers.Timer();

        _refreshTimer.Interval = 1000;

        _refreshTimer.Elapsed += RefreshView;

        _refreshTimer.Start();

    }


    public override void OnPause() 

    {

        base.OnPause();

        //...

        _refreshTimer.Dispose();

    }

跟:


    public override void OnResume()

    {

        base.OnResume();

        //...

        _refreshTimer = new System.Threading.Timer(RefreshView, null, 0, 1000);

    }


    public override void OnPause()

    {

        base.OnPause();

        //...

        _refreshTimer.Dispose();

    }

解决了我的问题。


查看完整回答
反对 回复 2022-08-20
?
九州编程

TA贡献1785条经验 获得超4个赞

您不应将初始 Fragment 添加到回堆栈中,因为这将导致它是可逆事务。这意味着如果你的初始状态是“无片段”,并且你为“no fragment”->“HomeFragment”添加到backstack,那么你可以弹出回“no fragment”状态。

只需更改对初始片段的调用,使其不会将其添加到回堆栈中。


查看完整回答
反对 回复 2022-08-20
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号