FragmentTransaction.Replace вызывает белый (пустой?) Экран в приложении - PullRequest
0 голосов
/ 31 января 2019

Поток моего приложения выглядит следующим образом:

MainActivity: HomeFragment -> BlackoutSetupFragment -> BlackoutFragment -> HomeFragment

По какой-то причине, когда я пытаюсь перейти к HomeFragment изBlackoutFragment, MainActivity становится пустым, и ничего не отображается, пока я не покину приложение и не вернусь к нему.Слева - то, как обычно выглядит HomeFragment, а справа - как я возвращаюсь к нему:

image image

The set of methods I am using to set the fragments:

    // 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;
    }

and the axml for the main activity's content is this:

<?xml version="1.0" encoding="utf-8"?>
 

Кто-нибудь знает, что здесь может происходить?Я попытался включить все, что, по моему мнению, было бы полезно для отладки, но если что-то еще нужно, напишите мне комментарий.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Проблема заключалась в использовании System.Timers.Timer для обновления пользовательского интерфейса с обратным отсчетом на BlackoutFragment.Замена на System.Threading.Timer, похоже, решила проблему.Я предполагаю, что прошедшее событие «RefreshView», запущенное в потоке пользовательского интерфейса, вызывало некоторую забаву при попытке отойти от фрагмента.

Таким образом, заменив:

    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();
    }

решил мою проблему.

0 голосов
/ 31 января 2019

Не следует добавлять начальный фрагмент в backstack, так как это приведет к обратимой транзакции.Это означает, что если ваше начальное состояние - «нет фрагмента», и вы добавили транзакцию для «нет фрагмента» -> «HomeFragment» в backstack, то вы можете вернуться к состоянию «нет фрагмента».

Простоизмените вызов для исходного фрагмента, чтобы он не добавил его в backstack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...