我的应用程序使用选项卡,每个选项卡都是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编程方式添加第一个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我甚至尝试留在这个片段上,将活动放在后台(使用主页按钮)并恢复它,嵌套片段仍然显示。 当我在应用程序的选项卡之间切换时,确实会发生这种情况。
My application uses tabs, each tab is Fragment (from android.app.Fragment). I want to use nested fragments in one of those.
Here is the top level fragment supposed to contains the nested 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); } }}
It adds programmatically the first fragment using a FragmentTransaction. It actually works (i mean, the nested fragment is added and i can see it) but each time i switch to another tab (so another fragment is displayed) and go back to it, the nested fragment has disappeared.
Here is the code of the 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; } The nested fragment CalendarFragment extends android.support.v4.app.Fragment My activity is a FragmentActivityI even tried stay on this fragment, put the activity in background (using home button) and resume it, the nested fragment is still displayed. It's really happen when i switch between the tabs of my application.
最满意答案
而不是在onCreate中添加仅在创建片段时调用的片段,而是在onCreateView中创建它,但是先检查片段是否为null
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); } }Instead of adding the fragment in onCreate which would only be called once the fragment is created, create it in onCreateView but check if the fragment is null first
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); } }更多推荐
发布评论