2013-07-10 42 views
1

我的應用程序使用選項卡,每個選項卡Fragment(從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

我甚至嘗試對這個片段期間,把後臺的活動(使用home按鈕)並恢復它,嵌套的片段仍然顯示。當我在我的應用程序的選項卡之間切換時真的發生。

+1

當你需要嵌套的片段( )'。 'R.id.calendarframelayout'是來自'R.layout.reservation_calendar_layout'的視圖的ID,還是標籤所在佈局的ID?此外,通過'ViewPager'實現的簡單標籤或標籤? – Luksprog

+0

@Luksprog我在ViewPager中使用選項卡。 R.id.calendarframelayout是R.layout.reservation_calendar_layout中包含的framelayout的ID。另外,我應該如何使用'getChildFragmentManager'?好像我不能使用支持lib中的Fragment。 – nathan

+0

檢查我的這個答案http://stackoverflow.com/a/13381792/493939,看看它是否可以幫助你。 – Luksprog

回答

0

而不是增加在的onCreate片段一旦創建了片段,它只會被調用,在onCreateView創建它,但檢查片段是你用`getChildFragmentmanager空第一

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:E/AndroidRuntime(16917):\t在fr.epitech.test_esi.fragments.ReservationCalendarFragment.onCreateView(ReservationCalendarFragment .java:27) – nathan

+0

我實際上使用支持庫v4。 – nathan

+0

我嘗試使用支持庫v13,但仍然一樣。 – nathan