2013-07-10 4 views
1

В моем приложении используются вкладки, каждая вкладка - Fragment (from android.app.Fragment). Я хочу использовать вложенные фрагменты в одном из них.Фрагмент добавлен программным путем

Вот фрагмент верхнего уровня должен содержит вложенный фрагмент:

import android.app.Fragment; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import fr.epitech.test_esi.R; 

public class ReservationCalendarFragment extends Fragment { 
    public static final int stringId = R.string.calendar_tab; 
    public static final String tag = "reservation_calendar_frag"; 

    CalendarFragment t = new CalendarFragment(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FragmentManager fm = ((FragmentActivity) getActivity()) 
       .getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(R.id.calendarframelayout, t, CalendarFragment.tag); 
     ft.commit(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.reservation_calendar_layout, null); 
    } 
} 

}

Он добавляет программно первый фрагмент, используя FragmentTransaction. Он действительно работает (я имею в виду, что вложенный фрагмент добавлен, и я вижу его), но каждый раз, когда я переключаюсь на другую вкладку (так отображается другой фрагмент) и возвращаюсь к ней, вложенный фрагмент исчезает.

Вот код CalendarFragment:

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Locale; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CalendarView; 
import android.widget.CalendarView.OnDateChangeListener; 
import fr.epitech.test_esi.R; 

public class CalendarFragment extends Fragment { 

    public static final String tag = "calendar_frag"; 

    private SimpleDateFormat _df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View fragView = inflater.inflate(R.layout.calendar_layout, null); 
     CalendarView calendarView = (CalendarView) fragView 
       .findViewById(R.id.calendar); 
     calendarView.setOnDateChangeListener(new OnDateChangeListener() { 

      @Override 
      public void onSelectedDayChange(CalendarView view, int year, 
        int month, int dayOfMonth) { 
       Calendar c = Calendar.getInstance(); 

       c.set(year, month, dayOfMonth); 
       Log.d("DATE", c.getTime().toString()); 
      } 
     }); 
     return fragView; 
    } 
  • вложенной фрагмент CalendarFragment расширяет android.support.v4.app.Fragment
  • Моя деятельность является FragmentActivity

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

+1

Если вы хотите, вложенные фрагменты, которые вы используете 'getChildFragmentmanager () '. 'R.id.calendarframelayout' является идентификатором представления из' R.layout.reservation_calendar_layout' или является идентификатором макета, на котором расположены вкладки? Кроме того, простые вкладки или вкладки, реализованные через «ViewPager»? – Luksprog

+0

@Luksprog Я использую вкладки в ViewPager. Параметр R.id.calendarframelayout является идентификатором рамки, содержащейся в R.layout.reservation_calendar_layout. Кроме того, как я должен использовать 'getChildFragmentManager'? Кажется, я не могу использовать его с Fragment из lib. – nathan

+0

Проверьте этот ответ http://stackoverflow.com/a/13381792/493939 и посмотрите, поможет ли он вам. – Luksprog

ответ

0

Вместо добавления фрагмента в OnCreate, который будет называться только после того, как фрагмент создан, создайте его в onCreateView, но проверить, если фрагмент является нулевым первым

public class ReservationCalendarFragment extends Fragment { 
    public static final int stringId = R.string.calendar_tab; 
    public static final String tag = "reservation_calendar_frag"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     CalendarFragment t = (CalendarFragment) getChildFragmentManager() 
      .findFragmentByTag(CalendarFragment.tag); 

     if(t == null) { 
      t = new CalendarFragment(); 
     } 
     FragmentTransaction transaction = getChildFragmentManager() 
       .beginTransaction(); 
     ft.add(R.id.calendarframelayout, t, CalendarFragment.tag); 
     ft.commit(); 
     return inflater.inflate(R.layout.reservation_calendar_layout, null); 
    } 
} 
+0

java.lang.NoSuchMethodError: fr.epitech.test_esi.fragments.ReservationCalendarFragment.getChildFragmentManager 07-10 17: 34: 54,321: Е/AndroidRuntime (16917): \t на fr.epitech.test_esi.fragments.ReservationCalendarFragment.onCreateView (ReservationCalendarFragment .java: 27) – nathan

+0

Я фактически использую библиотеку поддержки v4. – nathan

+0

Я пытаюсь использовать библиотеку поддержки v13, но все равно. – nathan

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