1

Когда начинается действие, он загружает NavigationDrawer, а внутри есть 3 раздела. В первом есть RecyclerView, который работает правильно. Второй имеет PagerSlidingTabStrip, который имеет проблемы. У третьего есть код, который изменяет PreferenceManager и работает хорошо.Странное поведение PagerSlidingTabStrip внутри NavigationDrawer

Теперь проблема заключается в том, что метод getItem()CustomPagerAdapter вызывается только один раз, т.е. только в первый раз, когда я нажимаю раздел «Пользователь» от NavigationDrawer, но после навигации, когда я попытаюсь открыть его снова, getItem() не вызывается, поэтому внутри ViewPager ничего не инициализируется.

Затем я должен открыть приложение, и PagerSlidingTabStrip будет работать один раз.

Прошу вас, руководствоваться. В чем может быть проблема?

UPDATE: Я сделал несколько тестов и обнаружили, что getItem() из FragmentPagerAdapter вызывается только один раз в первый раз я запускаю раздел 2, то при попытке запустить его снова не называется. Почему так?

NavigationDrawer разделы:

@Override 
    public void onNavigationDrawerItemSelected(int position) { 
     // update the main content by replacing fragments 
     FragmentManager fragmentManager = getFragmentManager(); 
     switch(position) { 
      case 0: //Events 
       fragmentManager.beginTransaction().replace(R.id.container, 
         EventsRecyclerViewFragment.newInstance(position + 1)) 
         .addToBackStack(null).commit(); 
       break; 

      case 1: //User 
       fragmentManager.beginTransaction().replace(R.id.container, 
         UserFragment.newInstance(position + 1)) 
         .addToBackStack(null).commit(); 
       break; 

      case 2: //Logout 
       prefs = PreferenceManager.getDefaultSharedPreferences(this); 
       if(prefs.getBoolean(KEY_LOGIN, false)) { 
        prefs.edit().remove(KEY_LOGIN).apply(); 
        prefs.edit().remove(KEY_USERNAME).apply(); 
        prefs.edit().remove(KEY_PASSWORD).apply(); 
        Intent intent = getIntent(); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
        finish(); 
        startActivity(intent); 
        Customs.mToast(getBaseContext(), "Logged-out"); 
       } 
       break; 
     } 
} 

2-я секция - UserFragment:

static class UserFragment extends Fragment { 

     private static final String ARG_SECTION_NUMBER = "section_number"; 

     public static UserFragment newInstance(int sectionNumber) { 
      UserFragment fragment = new UserFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_user, container, false); 
      context = view.getContext(); 
      prefs = PreferenceManager.getDefaultSharedPreferences(view.getContext()); 
      return view; 
     } 

     @Override 
     public void onViewCreated(View view, Bundle savedInstanceState) { 

      ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 
      mViewPager.setAdapter(new CustomAdapter(getFragmentManager(),context)); 

      PagerSlidingTabStrip pagerSlidingTabStrip = (PagerSlidingTabStrip)view.findViewById(R.id.sliding_tabs); 
      pagerSlidingTabStrip.setViewPager(mViewPager); 
     } 
    } 

FragmentPagerAdapter - CustomAdapter:

public class CustomAdapter extends FragmentPagerAdapter { 

    private SharedPreferences prefs; 
    private Context context; 
    private static final String KEY_USERNAME = "username", 
      KEY_PASSWORD = "password", KEY_LOGIN = "loggedin"; 

    public CustomAdapter(FragmentManager fm, Context context) { 
     super(fm); 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     if(!prefs.getBoolean(KEY_LOGIN, false)) { 
      prefs.edit().remove(KEY_USERNAME).apply(); 
      prefs.edit().remove(KEY_PASSWORD).apply(); 
      String[] pageTitle = {"Login", "Register"}; 
      return pageTitle[position]; 
     } 
     String[] pageTitle = {"Update", "Register"}; 
     return pageTitle[position]; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch(position) { 
      case 0: 
       if(!prefs.getBoolean(KEY_LOGIN, false)) { 
        prefs.edit().remove(KEY_USERNAME).apply(); 
        prefs.edit().remove(KEY_PASSWORD).apply(); 
        return LoginFragment.newInstance(position + 1); 
       } 
       else { 
        return UpdateFragment.newInstance(position + 1); 
       } 

      case 1: 
       return RegisterFragment.newInstance(position + 1); 
     } 
     return null; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     //container.removeView((View) object); 
     FragmentManager manager = ((Fragment)object).getFragmentManager(); 
     FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment)object); 
     trans.commit(); 
    } 
} 

NavigationDrawer:

NavigationDrawer

первый раз открыл пользователя из NavigaiontDrawer:

1st time opened User from NavigaiontDrawer

второй раз открыл пользователя из NavigaiontDrawer:

2nd time opened User from NavigaiontDrawer

ответ

0

Хорошо, проблема решена. Я только что изменился с FragmentPagerAdapter на FragmentStatePagerAdapter.

Проблема с FragmentPagerAdapter состояла в том, что он создает Fragments только один раз и в следующий раз, когда он восстанавливает его. Это должно было работать нормально, но опять-таки у меня есть слой NavigationDrawer по Pager, поэтому, когда я изменил разделы с NavigationDrawer, что-то перепуталось, а FragmentPagerAdapter не извлекает фрагменты и не создает новые.

+0

Если кто-нибудь может объяснить это поведение, пожалуйста, сделайте это, мне очень любопытно узнать. – Ryan

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