Android, объединяющий нижнюю навигацию с вкладками (Действия против фрагментов) - PullRequest
0 голосов
/ 28 декабря 2018

Адское сообщество,

Я новичок в Android и не могу найти хороший ответ на эту проблему:

Я хочу использовать нижнюю навигацию, и некоторые элементы должны такжеиспользовать вкладки.

Теперь мой вопрос: каков наиболее распространенный (лучший) способ реализации этого?

Я в замешательстве, если мне следует использовать действия или фрагменты для этой навигации.

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

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 28 декабря 2018

Лучший подход - использовать Fragment s для обоих.Если вы используете Activity для каждого экрана, доступного из нижней части навигации, вам нужно будет поставить BottomNavigationView в каждом и дублировать много кода, а также настроить переходы между этими действиями.

Действиядолжны рассматриваться как точки входа вашего приложения: при нажатии на значок приложения в панели запуска запускается основное действие, определенное в манифесте.Для всего остального (части пользовательского интерфейса, части потока навигации ...) вы можете использовать Fragment s.

Вот пример организации действий и фрагментов для решения вашего случая:

MainActivity
     |--- TopLevelFragment1
     |--- TopLevelFragment2
     |           |--- TabFragment1
     |           |--- TabFragment2
     |           |--- TabFragment3
     |
     |--- TopLevelFragment3
     |--- TopLevelFragment4

Как видно из приведенной выше схемы, Activity может содержать дочерние фрагменты, а фрагменты также могут иметь вложенные фрагменты (также называемые «дочерними фрагментами»).TopLevelFragmentN - это фрагменты, которые отображаются при выборе элемента в BottomNavigationView.TabFragmentN - это фрагменты, которые отображаются при выборе вкладки из TopLevelFragment2.

Давайте погрузимся в реализацию.Я не проверял следующие фрагменты кода, они просто предоставлены для руководства.Вот пример кода для действия:

main_activity.xml

<CoordinatorLayout android:id="@+id/coordinator_layout">
  <FrameLayout android:id="@+id/fragment_host"><!-- TopLevelFragments will be displayed here --></FrameLayout>
  <BottomNavigationView android:id="@+id/bottom_nav"/>
</CoordinatorLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        // Retrieve a reference to the BottomNavigationView and listen for click events.
        BottomNavigationView bottomNav = findViewById<BottomNavigationView>(R.id.bottom_nav);
        bottomNav.setOnNavigationItemSelectedListener(item -> {
            // Depending on the clicked item, change the displayed TopLevelFragment.
            switch(item.getItemId()) {
                case R.id.top_level_1:
                    showTopLevelFragment(new TopLevelFragment1());
                    return true;
                case R.id.top_level_2:
                    // Do the same with other TopLevelFragments
                    return true;
                default:
                    return false;
            }
        }

        // Show the first TopLevelFragment by default.
        showTopLevelFragment(new TopLevelFragment1());
    }

    private void showTopLevelFragment(Fragment fragment) {
        // Use the fragment manager to dynamically change the fragment displayed in the FrameLayout.
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_host, fragment)
            .commit();
    }
}

Пожалуйста, обратитесь к документации попонять, как определять элементы в BottomNavigationView.

Теперь давайте сосредоточимся на TopLevelFragment2, который содержит вкладки.Это обычный шаблон для использования TabLayout с ViewPager, так что вы можете перемещаться от одной вкладки к другой, проводя пальцем влево или вправо.

top_level_fragment_2.xml

<ConstraintLayout android:id="@+id/constraint_layout">    
    <AppBarLayout android:id="@+id/appbar_layout">
        <Toolbar android:id="@+id/toolbar"/>
        <TabLayout android:id="@+id/tab_layout"/>
    </AppBarLayout>
    <ViewPager android:id="@+id/tab_pager"/>
</ConstraintLayout>

TopLevelFragment2.java

public class TopLevelFragment2 extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.top_level_fragment_2, container, false);
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        MyTabPagerAdapter tabPager = new MyTabPagerAdapter(getFragmentManager());

        ViewPager viewPager = getView().findViewById(R.id.tab_pager);
        viewPager.setAdapter(tabPager);

        // Display a tab for each Fragment displayed in ViewPager.
        TabLayout tabLayout = getView.findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
    }

    static class MyTabPagerAdapter extends FragmentPagerAdapter {
        MyTabPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 3; // One for each tab, 3 in our example.
        }

        @Override
        public Fragment getItem(int position) {
            switch(position) {
                case 0:
                    return new TabFragment1();
                case 1:
                    // Return a new instance of the fragment associated with the tab at position 1
                default:
                    throw new IllegalArgumentException();
            }
        }
    }
}

После этих шагов все, что вам нужно сделать, это написать код для других фрагментов.

...