2014-01-10 4 views
7

Так что это сложный вопрос, но я постараюсь сделать его максимально простым.Детский фрагмент в представлении фрагмента пейджера исчезает после обмена

Чтобы начать, у меня есть основное действие с пейджером вида. В нем есть 2 страницы, с двумя вкладками в панели действий, связывающими каждую страницу. У меня также есть ящик, который имеет 4 варианта, первые 2 - 2 страницы в пейджере представления, а второй 2 - это страницы, которые не являются. Если вы выберете один из вторых 2, я настроил свой ViewPager для замены фрагментов на 2 других. Все эти фрагменты являются одноточечными, так что переключение туда и обратно не вызывает проблем с памятью.

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

Это журнал аварии для его

01-10 15:55:05.272: E/MessageQueue-JNI(21034): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(android.support.v4.app.Fragment)' on a null object reference 

Если я играю немного с кодом, я получаю что-то вроде этого. Эти две ошибки являются те, которые я, кажется, производят больше всего:

01-10 16:00:13.072: E/AndroidRuntime(22227): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.ClassLoader android.support.v4.app.FragmentActivity.getClassLoader()' on a null object reference 

Я могу продолжать называть заменить() на виде рамы, так что не собирается уходить. Поэтому я предполагаю, что это не проблема. Это

Для этого есть соответствующий код.

код фрагмента:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.calculator, container, false); 
    final FragmentManager fragmentManager = getChildFragmentManager(); 
    if(afFrag == null && topFrag == null){ 
     afFrag = CalculatorAfFragment.getInstance(); 
     topFrag = CalculatorTopFragment.getInstance(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit(); 
    } 
    RadioGroup typeGroup = (RadioGroup) view.findViewById(R.id.type_buttons);   
    typeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      if (checkedId == R.id.af_button){ 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit(); 
      } 
      else if (checkedId == R.id.top_button){ 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       fragmentTransaction.replace(R.id.calc_frame, topFrag, "topFrag").commit(); 
      } 
     } 
    }); 
    return view; 

FragmentStatePagerAdapter код:

@Override 
    public Fragment getItem(int position) { 
     if(tools){ 
      return toolsFragmentsList.get(position); 
     } else { 
      return guidesFragmentsList.get(position); 
     } 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    public void swapFragments(int position){ 
     if (tools){ 
      tools = false; 
      stores = false; 
      notifyDataSetChanged(); 
      this.setPrimaryItem(mPager, position-1, getItem(position - 1)); 
     } else { 
      tools = true; 
      notifyDataSetChanged(); 
      this.setPrimaryItem(mPager, position-4, getItem(position - 4)); 
     } 
    } 
+0

У вас есть сообщение об ошибке «getClassLoader()», так что должно быть там, где проблема. Убедитесь, что экземпляр, в котором вы называете «getClassLoader()», полностью инициализируется в это время. – Sulfkain

+0

, пожалуйста, покажите больше журнала logcat, мне показалось странным, что сообщение является наиболее актуальным. – mobilepotato7

ответ

0

Попробуйте установить уникальный идентификатор на ViewPager через mPager.setId(View.generateViewId()).

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