Лаг при переключении вкладок в BottomNavigationView - PullRequest
3 голосов
/ 26 февраля 2020

У меня есть Activity, которая содержит BottomNavigationView, и эта нижняя черта помогает активности отображать три фрагмента. Эти фрагменты загружаются хорошо, и я использую AsyncTask для выполнения каждой тяжелой операции, в то время как в потоке пользовательского интерфейса я показываю 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);
        }
    }

В gif ниже, если вы посмотрите внизу навигационное изображение внизу, вы можете увидеть, что для отображения фрагмента требуется время. Но после попытки загрузить фрагмент во второй раз, он загружается, как ожидалось. enter image description here

Как сделать фрагмент так, чтобы он загружался правильно?

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

вы можете использовать навигацию Jetpack для простой навигации Bottombar

Простая навигация снизу с навигацией Jetpack:

Давайте начнем с включения библиотеки навигации Jetpack в ваши приложения, добавив эти строки в сборку приложения. gradle file:

def nav_version = "2.1.0"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

Сначала мы создадим простой нижний поток навигации. Для этого вам нужно сначала добавить NavHostFragment в ваш файл макета отдельного упражнения. Добавьте это в файле activity_main. xml внутри тега FrameLayout.

<fragment
  android:id="@+id/fragNavHost"
  android:name="androidx.navigation.fragment.NavHostFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:defaultNavHost="true"
  app:navGraph="@navigation/bottom_nav_graph" />

Появится сообщение об ошибке «Не удается разрешить символ @ navigation / bottom_nav_graph.»

    <?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/bottom_nav_graph.xml"
    app:startDestination="@id/homeFragment2">

    <fragment
        android:id="@+id/homeFragment2"
        android:name="com.wajahatkarim3.bottomnavigationdemo.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/searchFragment2"
        android:name="com.wajahatkarim3.bottomnavigationdemo.SearchFragment"
        android:label="fragment_search"
        tools:layout="@layout/fragment_search" />

    <fragment
        android:id="@+id/notificationsFragment2"
        android:name="com.wajahatkarim3.bottomnavigationdemo.NotificationsFragment"
        android:label="fragment_notifications"
        tools:layout="@layout/fragment_notifications" />

    <fragment
        android:id="@+id/profileFragment2"
        android:name="com.wajahatkarim3.bottomnavigationdemo.ProfileFragment"
        android:label="fragment_profile"
        tools:layout="@layout/fragment_profile" />
</navigation>

Its время добавить код в нашем классе деятельности. Откройте файл MainActivity.kt и создайте в нем метод setupViews (). Вызовите это в onCreate () действия. Добавьте эти строки в метод setupVeiws ().

    fun setupViews()
{
    // Finding the Navigation Controller
    var navController = findNavController(R.id.fragNavHost)

    // Setting Navigation Controller with the BottomNavigationView
    bottomNavView.setupWithNavController(navController)

    // Setting Up ActionBar with Navigation Controller
    // Pass the IDs of top-level destinations in AppBarConfiguration
    var appBarConfiguration = AppBarConfiguration(
        topLevelDestinationIds = setOf (
            R.id.homeFragment,
            R.id.searchFragment,
            R.id.notificationsFragment,
            R.id.profileFragment
        )
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
}
0 голосов
/ 26 февраля 2020

У меня была такая же проблема. У меня есть два варианта.

  1. Использовать пост-задержку при вызове LoadData или
  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
   }

И удалите эти строки в своем nav_host_fragment:

app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation"
...