当前位置: 首页 > 知识库问答 >
问题:

在导航抽屉片段之间切换很慢

阎庆
2023-03-14

我有一个带有导航抽屉的应用程序,它为每个菜单项使用片段。
每次单击一个项目时,我都会替换当前片段。

问题是,在用户单击后显示新片段需要很长时间,并且它会被卡住。加载时间最长的片段是一个片段,其中还包含子片段的选项卡(一个片段包含一个RecyclerView)<有什么方法可以加快碎片的装载速度吗?(如果可能的话,可能会提前初始化它们?)

这是我的代码:

protected override void OnCreate(Bundle bundle)
    {
        drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);
        navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
        drawerLayout.DrawerClosed += DrawerLayout_DrawerClosed;


        navigationView.NavigationItemSelected += (sender, e) =>
        {
            e.MenuItem.SetChecked(true);
            //react to click here and swap fragments or navigate

            switch (e.MenuItem.ItemId)
            {
                case (Resource.Id.nav_home):
                    ListItemClicked(0);
                    break;

                case (Resource.Id.nav_halachot):
                    ListItemClicked(1);
                    break;

                case (Resource.Id.nav_times):
                    ListItemClicked(2);
                    break;

                case (Resource.Id.nav_siddur):
                    ListItemClicked(3);
                    break;
                case (Resource.Id.nav_compass):
                    ListItemClicked(4);
                    break;

                case (Resource.Id.nav_settings):
                    ListItemClicked(5);
                    break;
            }


            drawerLayout.CloseDrawers();                
        };

        if (bundle == null)
        {
            ListItemClicked(0);
            navigationView.Menu.GetItem(0).SetChecked(true);
            fragment = new HomeFragment();
            SupportFragmentManager.BeginTransaction()
            .Replace(Resource.Id.content_frame, fragment)
            .Commit();
        }
    }

 public override void OnBackPressed()
    {

        if (drawerLayout.IsDrawerOpen((int)GravityFlags.Start))
        {
            drawerLayout.CloseDrawer((int)GravityFlags.Start);
        }
        else
        {
            base.OnBackPressed();
        }
    }

    private void ListItemClicked(int position)
    {

        switch (position)
        {
            case 0:
                fragment = new HomeFragment();
                Title = "Home";
                SupportActionBar.Elevation = 8;
                break;
            case 1:
                fragment = new HalachaFragment();
                Title = "aaa";
                SupportActionBar.Elevation = 0;
                break;
            case 2:
                fragment = new TimesFragment();
                Title = "bbb";
                SupportActionBar.Elevation = 8;

                break;
            case 3:
                fragment = new SiddurFragment();
                Title = "ccc";
                SupportActionBar.Elevation = 8;
                break;
            case 4:
                fragment = new CompassFragment();
                Title = "ddd";
                SupportActionBar.Elevation = 8;
                break;
            case 5:
                fragment = new SettingsFragment();
                Title = "eee";
                break;
        }



    }

    private void DrawerLayout_DrawerClosed(object sender, DrawerLayout.DrawerClosedEventArgs e)
    {
        SupportFragmentManager.BeginTransaction()
            .Replace(Resource.Id.content_frame, fragment).AddToBackStack("BACK")
            .Commit();

    }

HalachaFragment。cs(包含选项卡的片段):

public class HalachaFragment : Fragment
{
    private ViewPager halachotPager;
    private PagerSlidingTabStrip tabs;

    public HalachaFragment()
    {
        this.RetainInstance = true;
    }
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment

        var view = inflater.Inflate(Resource.Layout.HalachaSection, container, false);

        var fragments = new Android.Support.V4.App.Fragment[]
       {
           new HalachotFragment(),
           new BooksFragment(),
       };

        var titles = CharSequence.ArrayFromStringArray(new[]
        {
                "הלכות",
                "ספרים",
        });

        halachotPager = view.FindViewById<ViewPager>(Resource.Id.halachotPager);

        halachotPager.Adapter = new TabsFragmentPagerAdapter(this.ChildFragmentManager, fragments, titles);
        halachotPager.OffscreenPageLimit = 2;
        halachotPager.SetCurrentItem(1, true);
        // Bind the tabs to the ViewPager
        tabs = view.FindViewById<PagerSlidingTabStrip>(Resource.Id.halachotTabs);

        tabs.SetViewPager(halachotPager);

        return view;

    }
}

希望有人能帮我。

谢谢

共有1个答案

梁丘经艺
2023-03-14

请参阅此解决方案。只需使用线程加载片段子节点。当更改您的onItemClick时。

layoutDrawer.closeDrawer(linearDrawer);
setLastPosition(posicao);
new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            setFragmentList(lastPosition);
        }
    }, 0);
 类似资料:
  • 我希望能够使用导航抽屉,并根据导航中的选择在不同片段之间进行更改。 我正在使用Android Studio,基本上我所做的是这样的: 使用内置模板“导航抽屉活动”创建了一个新项目 创建了一个空白片段 然后我更改了onNavigationDrawerItemSelected方法中的一些代码。 我的程序崩溃了,给了我很多我不理解的错误。我做错了什么?

  • 我不是Android方面的专家,但对片段非常感兴趣。非常感谢您的帮助! 我在我的应用程序中实现了一个导航抽屉。有一个基本抽屉活动和一些片段,用户可以从抽屉菜单中切换。如果我想转移到另一个片段,没有问题,但当我使用意图开始一个新的活动时,它是有效的。如果你看一下我下面的代码,你会发现我使用了两个独立的菜单:一个用于操作栏图标(购物车和搜索),意图在其中完美工作,另一个用于导航抽屉在片段之间跳转。有没

  • 我在我的应用程序中使用抽屉菜单,并实现了在NavigationDrawer片段类中切换片段的逻辑。我最近读到片段切换只能从托管活动中发生。 有一个从NavigationDrawerFragment调用的接口,用于通知导航抽屉列表视图中所选位置的MainActivity。 我感到困惑的是,在Mainactive中有一个静态片段,它是使用NavigationDrawer片段中接口提供的位置调用的。 P

  • 我浏览了一下网站,我找不到我的问题的答案,我试图让我的导航抽屉在活动之间切换,而不是碎片。我尝试了开关语句,所有做的就是崩溃的应用程序,我不知道如何获得抽屉的独立元素,以便设置它们,如果一个被按下,它将转到这个页面,如果另一个被按下它会转到这个页面等。 这是我的密码, } 我一整天都在做这件事,试图修复它,让它工作起来,但运气不好。我花了很长时间才把真正的抽屉打开,但看到它全部消失,我会感到很遗憾

  • 编辑:我的滑动标签碎片ATabs似乎有问题。没有使用ATabs片段,只需使用导航抽屉在片段A1和B之间切换,一切都很好!可以添加列表项。编辑的主要活动: 但当我使用ATabs片段(见下面的MainActivity)并切换到它并返回时,就不可能再添加ListItems了。尽管Logcat显示日志。v(LOG_标签,“添加项”) 每次按add()。 我不知道是什么导致了这个问题。如果ATabs需要是一

  • 是否可以在android中使用导航抽屉,但我不想更新片段,而是想在活动之间切换,作为我在应用程序中的导航方式。