Как показать 1-й фрагмент при нажатии кнопки назад? - PullRequest
0 голосов
/ 14 февраля 2020

Я новичок в разработке мобильных приложений

В настоящее время я разрабатываю приложение Телефонный справочник из Xamarin Android, в этом приложении у меня есть 4 фрагмента (HomeFragment, AboutFragment, DirectoryFragment и SyncFragment).

HomeFragment - это первый фрагмент, который отображается из приложения. Когда я нажимаю элемент О на боковой панели, а затем нажимаю кнопку «Назад», это работает хорошо, потому что я использовал AddToBackStack(null) до commit() в основном деятельность.

Но проблема в том, скажем, я открываю приложение, тогда оно показывает по умолчанию кулак HomeFragment , когда я перехожу к AboutFragment , оно показывает AboutPage , затем, если я перейду к DirectoryFragment next и нажму кнопку "Назад", я продолжу возвращаться к AboutPage / AboutFragment , чего я и хочу достичь это то, что должно go вернуться к HomePage / HomeFragment

Короче говоря, то, чего я хочу достичь, похоже на поведение навигации приложения Gmail.

В любом случае это мой код в Основная активность

switch (e.MenuItem.ItemId)
            {
                case (Resource.Id.nav_home):
                    FragmentTransaction ft = FragmentManager.BeginTransaction();
                    HomeFragment home = new HomeFragment();
                    ft.Replace(Resource.Id.HomeFrameLayout, home);
                    HideSoftKeyboard();
                    mDrawerLayout.AddDrawerListener(mDrawerToggle);
                    ft.AddToBackStack(null);
                    ft.Commit();
                    break;

                case (Resource.Id.nav_about):
                    FragmentTransaction ft1 = FragmentManager.BeginTransaction();
                    AboutFragment about = new AboutFragment();
                    ft1.Replace(Resource.Id.HomeFrameLayout, about);
                    HideSoftKeyboard();
                    ft1.AddToBackStack(null);
                    ft1.Commit();
                    break;

                case (Resource.Id.nav_etel):
                    FragmentTransaction ft2 = FragmentManager.BeginTransaction();
                    GHQFragment ghq = new DirectoryFragment();
                    ft2.Replace(Resource.Id.HomeFrameLayout, ghq);
                    HideSoftKeyboard();
                    ft2.AddToBackStack(null);
                    ft2.Commit();
                    break;
                case (Resource.Id.nav_refresh):
                    if (CrossConnectivity.Current.IsConnected)
                    {
                        FragmentTransaction ft3 = FragmentManager.BeginTransaction();
                        SyncFragment sync = new SyncFragment();
                        ft3.Replace(Resource.Id.HomeFrameLayout, sync);
                        HideSoftKeyboard();
                        ft3.AddToBackStack(null);
                        ft3.Commit();
                    }
                    else
                    {
                        Toast.MakeText(this, "Please connect to the internet to sync records.", ToastLength.Long).Show();
                    }

                    break;

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете переопределить метод OnKeyDown, как показано в следующем коде.

  public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (keyCode == Keycode.Back)
        {
            FragmentManager fragmentManager = this.FragmentManager;
            int count = fragmentManager.BackStackEntryCount;
            for (int i = 0; i < count; ++i)
            {
                fragmentManager.PopBackStack();
            }
            // your code
            return false;
        }


        return base.OnKeyDown(keyCode, e);
    }

Я переключаю три фрагмента, когда нажимаю кнопку возврата. это переключиться на первый фрагмент. enter image description here

Обновление

Хотите ли вы добиться результата, нажав кнопку назад и вернувшись на рабочий стол, когда вы в HomePage?

enter image description here

Вот код.

public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (keyCode == Keycode.Back)
        {
            FragmentManager fragmentManager = this.FragmentManager;
            int count = fragmentManager.BackStackEntryCount;
            if(count>0){
                for (int i = 0; i < count; ++i)
                {
                    fragmentManager.PopBackStack();
                }
                return false;
            }

        }

        return base.OnKeyDown(keyCode, e);

    }
...