在BottomNavigationView 中切换选项卡时出现延迟

Rus*_*ato 8 java android android-fragments

我有一个包含BottomNavigationView 的Activity,这个bottomnav 帮助Activity 显示三个片段。这些片段加载良好,我使用 AsyncTask 来执行每个繁重的操作,而在 UI 线程中,我会显示一个 ProgressBar 直到所有内容加载完毕。
我的片段有一个奇怪的行为:我第一次加载片段需要一些时间来实际显示它,而不是用进度条立即显示它。
这件事只发生在第一次,而且只发生在这个片段中。
片段代码仅包含以下内容:

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        new LoadData(getView(), getContext()).execute();
    }

private class LoadData extends AsyncTask<Void, Void, Void> {

        private View v;
        private Context context;

        public LoadData(View v, Context context) {
            items = new ArrayList<>();
            this.v = v;
            this.context = context;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            setItems(context); //Heavy operation
            adapter = new DashAdapter(items, context);
            return null;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //shows progressbar
            progress = v.findViewById(R.id.DFProgress);
            progress.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            setPager();
            //sets viewPager and hides progressbar
            progress.setVisibility(View.GONE);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在下面的gif中,如果您查看底部的bottomnavigationview,您可以看到显示片段需要时间。但是在尝试第二次加载片段后,它按预期加载。 在此处输入图片说明

我怎样才能让片段以正确的方式加载?

Kas*_*mir 5

我有同样的问题。我有两个选择。

  1. 调用 LoadData 时使用 postdelay 或
  2. 首先手动添加所有片段。您自己管理 navigationItemSelected。

像这样:

val firstFragment: Fragment = FirstFragment()
val secondFragment: Fragment = SecondFragment()
val thirdFragment: Fragment = ThirdFragment()

val navView: BottomNavigationView = findViewById(R.id.nav_view)

var active = firstFragment
fm.beginTransaction().add(R.id.nav_host_fragment, thirdFragment, "3").hide(thirdFragment).commit()
fm.beginTransaction().add(R.id.nav_host_fragment, secondFragment, "2").hide(secondFragment).commit()
fm.beginTransaction().add(R.id.nav_host_fragment, firstFragment, "1").commit()

navView.setOnNavigationItemReselectedListener {  }
navView.setOnNavigationItemSelectedListener { item ->
       when (item.itemId) {
           R.id.navigation_first -> {
               fm.beginTransaction().hide(active).show(firstFragment).commit()
               active = firstFragment

           }
           R.id.navigation_second -> {
               fm.beginTransaction().hide(active).show(secondFragment).commit()
               active = secondFragment
           }
           R.id.navigation_third -> {
               fm.beginTransaction().hide(active).show(thirdFragment).commit()
               active = thirdFragment
           }
       }
        true
   }
Run Code Online (Sandbox Code Playgroud)

并在您的 nav_host_fragment 中删除这些行:

app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation"
Run Code Online (Sandbox Code Playgroud)