Хобрук: Ваш путь к мастерству в программировании

Переключение целых фрагментов в NavigationDrawer

Я прорабатывал пример кода NavigationDrawer с сайта developer.android.com и пытался реализовать его как навигацию для одного из моих приложений. Однако я столкнулся с проблемой, когда дело дошло до переключения фрагментов в главном окне, поскольку пример кода повторно использует один и тот же фрагмент и просто переключает представление изображения. Вот код из примера:

private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }
}

private void selectItem(int position) {
    // update the main content by replacing fragments
    Fragment fragment = new PlanetFragment();
    Bundle args = new Bundle();
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
    fragment.setArguments(args);

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

где PlanetFragment — это общий фрагмент только с изображением и без каких-либо функций, что не применимо к моему приложению. Поэтому вместо этого я попытался заменить первый блок метода selectItem случаем/переключателем:

public void selectItem(int position){
Fragment fragment;
switch(position){
    case 1: fragment = new Fragmentscreentest(); break;
    case 2: fragment = new Fragmentstatusbar(); break;
    case 3: fragment = new Fragmentfullscreen(); break;
    default: fragment = new Fragmentscreentest(); break;
}
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

и добавил к моим фрагментам тот же пустой конструктор, что и у PlanetFragment:

public Fragmentstatus() {
    // Empty constructor required for fragment subclasses
}

Это не работает, всякий раз, когда я открываю приложение, оно показывает только значок приложения и заголовок на панели действий, без содержимого, без действий на панели действий, без панели навигации, без ничего, а затем оно вылетает примерно через секунду. С исходным кодом работает и все показывает, но работает только для одного фрагмента.

Как я могу переключать фрагменты в NavigationDrawer?


  • Опубликуйте трассировку стека сбоя из вашего logcat. 18.06.2013
  • Спасибо, уже исправил, Ответ от mike.b93 и исправление несвязанной ошибки получилось. 18.06.2013

Ответы:


1

Взгляните на мой код:

private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            selectItem(position);
        }
    }

private void selectItem(int position) {

        switch (position) {

            case 0:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new MainActivityFragment())
                        .commit();
                break;

            case 1:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new DbListViewFragment())
                        .commit();
                break;

            case 2:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new StatisticsFragment())
                        .commit();
                break;

            case 3:

                fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, new CalculatorFragment(), "calculator")
                        .commit();
                break;

        }

Я использую переключатель-кейс. позиция 0 — это самый первый элемент в моем ListView внутри ящика.

Взято из моего ответа на этот вопрос: клик отключен после первого события

РЕДАКТИРОВАТЬ:

Если вы хотите выбрать один фрагмент в начале, вы можете сделать это так в конце вашего метода onCreate:

if (savedInstanceState == null) {
            selectItem(0);
        }

0 - это позиция вашего желаемого фрагмента

18.06.2013
  • Спасибо, это и исправление совершенно не связанной ошибки в моем скрипте помогли мне. Я бы проголосовал, но не могу из-за моего статуса нового пользователя, хотя принял ответ. 18.06.2013
  • @MarcelUlbrich рад помочь, не стесняйтесь голосовать, как только вам будет разрешено: D 18.06.2013
  • Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..