2013-06-18 2 views
1

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

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

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

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

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

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

+0

Опубликовать трассировку стека аварии с вашего логарифма. – Akash

+0

Спасибо, уже исправлено. Ответ от mike.b93 и исправление несвязанной ошибки. –

ответ

7

Посмотрите на мой код:

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 внутри ящика.

Взятые из моего ответа на этот вопрос: DrawerLayout on click disabled after first event

EDIT:

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

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

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

+0

Спасибо, это и исправление полностью несвязанной ошибки в моем скрипте сделали трюк для меня. Я бы поднял ставку, но не мог из-за моего статуса нового пользователя, однако принял ответ. –

+1

@MarcelUlbrich рад помочь, не стесняйтесь повышать, как только вам разрешено: D –

Смежные вопросы