java - 在抽屉导航 fragment 之间切换很慢

标签 java android performance android-fragments xamarin

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

问题是用户点击后显示新的fragment时间过长,卡住了。 加载时间最长的 fragment 是一个 fragment ,其中还包含带有子 fragment 的选项卡(一个 fragment 包含一个 RecyclerView)。
有什么办法可以加快 fragment 的加载速度吗? (也许事先初始化它们,如果可能的话?)

这是我的代码:

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(包含选项卡的 fragment ):

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;

    }
}

希望有人能帮助我。

谢谢。

最佳答案

参见 this解决方案。只需使用一个线程来加载 fragment 子项。当更改您的 onItemClick 时。

layoutDrawer.closeDrawer(linearDrawer);
setLastPosition(posicao);
new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            setFragmentList(lastPosition);
        }
    }, 0);

关于java - 在抽屉导航 fragment 之间切换很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568175/

相关文章:

java - org.apache.tiles.template.NoSuchAttributeException : Attribute 'body' not found

java - 您可以像 Java 应用程序一样部署用 smalltalk/squeak/pharo 编写的应用程序吗?

Android Room 数据库迁移没有正确处理

reactjs - React Native 应用程序中的 Redux 非常慢,有大量数据

java - 你能在 Java 中锁定本地对象吗?

java - 从字符串转换 map 对象 "[a:12,b:[a:b,c:d]]"

java - 如何在简单的非 Activity java 类中创建类似于 onDestroy 的方法?

android - 使用上下文菜单在编辑器中插入文本和图片

sql - postgres 中的缓慢更新脚本

javascript - 将 undefined 分配给构造函数中的属性