切换BottomNavigationView中的标签时滞后 [英] Lag when switching tabs in BottomNavigationView
问题描述
我有一个包含BottomNavigationView的Activity,此bottomnav帮助该活动显示三个片段.这些片段加载得很好,并且我使用AsyncTask来执行所有繁重的操作,而在UI线程中,我将显示一个ProgressBar,直到一切加载完毕.
我的片段有一个怪异的行为:第一次加载片段时,要花一些时间才能真正显示它,而不是用进度条立即显示它.
这件事只会在第一次发生,并且只会在这个片段中发生.
片段代码仅包含以下内容:
I have an Activity that contains a BottomNavigationView, and this bottomnav helps the activity to display three fragments. These fragments load well, and I use an AsyncTask to do every heavy operation, while in the UI thread, I show a ProgressBar until everything loads.
There is a weird behaviour with my fragment: The first time I load the fragment it takes some time to actually display it, instead of displaying it instantly with a progressbar.
This thing only happens the first time, and only in this fragment.
The fragment code only contains this:
@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);
}
}
在下面的gif中,如果查看底部的bottomnavigation视图,则可以看到显示该片段需要花费时间.但是,在尝试第二次加载片段之后,它会按预期加载.
In the gif below, if you look at the bottomnavigationview at the bottom, you can see that it takes time to display the fragment. But after trying to load the fragment a second time, it loads as expected.
如何制作片段以正确的方式加载?
How could I make the fragment to load the right way?
推荐答案
我遇到了同样的问题.我有两个选择.
I had the same problem. I have two options.
- 在调用LoadData时使用postdelay或
- 首先手动添加所有片段.您可以自己管理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
}
并在nav_host_fragment中删除这些行:
And remove these lines in your nav_host_fragment:
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation"
这篇关于切换BottomNavigationView中的标签时滞后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!