以编程方式添加的片段消失(Fragment added programmatically disappear)

系统教程 行业动态 更新时间:2024-06-14 17:01:34
以编程方式添加的片段消失(Fragment added programmatically disappear)

我的应用程序使用选项卡,每个选项卡都是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 FragmentActivity

I 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); } }

更多推荐

本文发布于:2023-04-20 18:51:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/c45056b1b1c25e85faf6a8b6ef7093fd.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:片段   方式   Fragment   disappear   programmatically

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!