0

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

Я работаю над приложением, которое имеет навигацию на ящике (навигационная панель Майка Пенза). Выбирая любой из элементов, пользователь переходит к соответствующему фрагменту. Фрагменты прекрасно работают и сохраняют свое состояние при изменении ориентации. Однако у одного из фрагментов есть кнопка, которая заменяет текущий фрагмент новой. Когда новый фрагмент находится на экране, и если пользователь меняет ориентацию устройства, отображается предыдущий фрагмент.

Процесс: Выдвижные Пункт Select> Фрагмент A> Кнопка> Фрагмент B> Изменить ориентацию> Фрагмент А.

Edit: Это как первый фрагмент называется: (переключатель)

case R.string.drawer_item_a: 
     FragmentA A = FragmentA.newInstance(); 
     getSupportFragmentManager().beginTransaction() 
      .replace(R.id.container, A) 
      .commit(); 
     break; 

Это как второй фрагмент называется:

@Override 
    public void onClick(View v) { 
     FragmentManager fm = getActivity().getSupportFragmentManager(); 
     FragmentB B = FragmentB.newInstance(); 
     fm.beginTransaction() 
      .replace(R.id.container, B, String.valueOf(R.string.settings_pin_request)) 
      .commit(); 
    } 

Выдвижные

result = new Drawer() 
      .withActivity(this) 
      .withToolbar(mToolbar) 
      .withActionBarDrawerToggle(true) 
      .addDrawerItems(
        new PrimaryDrawerItem().withName("FragmentA"), 
     new PrimaryDrawerItem().withName("FragmentB") 
      ) 
      .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) { 

        if (drawerItem instanceof Nameable) { 
         mCurrentDrawerItem = position; 

         // Display appropriate fragment 
         switch (((Nameable) drawerItem).getNameRes()) { 
        case R.string.drawer_item_a: 
        FragmentA A = FragmentA.newInstance(); 
        getSupportFragmentManager().beginTransaction() 
         .replace(R.id.container, A) 
         .commit(); 
        break; 
        case R.string.drawer_item_b: 
        FragmentA A = FragmentA.newInstance(); 
        getSupportFragmentManager().beginTransaction() 
         .replace(R.id.container, A) 
         .commit(); 
        break; 

         } 
         mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes())); 
        } 
       } 
      }).build(); 

    // Set the current drawer item 
    result.setSelection(mCurrentDrawerItem); 

Метод onResume() реализует логику для синхронизации пользователя. Для состояний фрагментов ничего не написано.

+0

сообщении код, как у вызвать различный фрагмент, чтобы поместить его в макет рамки при изменении ориентации. – DJphy

+0

@DJphy Проверьте изменение. – Superiom

+0

Показать код ящика.Также покажите onResume «MainActivity». – luiscosta

ответ

0

Ответ основан на версии, используемой в этом вопросе (MaterialDrawer v3.x.y). Ответ потребует некоторых изменений для работы с последними MaterialDrawer v4.x.y


Если приложение создается и не активировать его ящик не будет стрелять OnDrawerItemClickListener. Вы можете включить его с помощью флага withFireOnInitialOnClick(true). Это позволит вам иметь всю логику переключения фрагментов в пределах OnDrawerItemClickListener

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

Вы можете использовать этот код для этого:

// Set the current drawer item 
result.setSelection(mCurrentDrawerItem); 

Назад к вашему OnDrawerItemClickListener, насколько ваш код, который вы публикуемую выше показывает использовать переключатель на основе R.string. с помощью метода getNameRes(). Это не будет работать, поскольку вы не устанавливаете имя элементов через ресурс, но непосредственно в виде строки. .withName("FragmentA"). вы должны использовать их в обоих случаях. А лучшее решение (и я настоятельно рекомендую это) является то, что вы переключаете ваш код и OnDrawerItemClickListener для переключения на основе идентификатора вы установили на DrawerItems

result = new Drawer() 
    .withActivity(this) 
    .withToolbar(mToolbar) 
    .withActionBarDrawerToggle(true) 
    .addDrawerItems(
      new PrimaryDrawerItem().withName("FragmentA").withIdentifier(1), 
      new PrimaryDrawerItem().withName("FragmentB").withIdentifier(2) 
    ) 
    .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) { 
       if(drawerItem != null) { 
        Fragment f = null; 
        switch(drawerItem.getIdentifier) { 
        case 1: 
        f = FragmentA.newInstance(); 
        break; 
        case 2: 
        f = FragmentA.newInstance(); 

        break; 
        } 

        if (drawerItem instanceof Nameable) { 
        mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes())); 
        } 
       } 
      } 
     } 
    }).build();