【问题标题】:Fragment added programmatically disappear以编程方式添加的片段消失
【发布时间】:2013-07-10 15:00:43
【问题描述】:

我的应用程序使用标签,每个标签都是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

我什至尝试停留在这个片段上,将活动置于后台(使用主页按钮)并恢复它,嵌套片段仍然显示。当我在应用程序的选项卡之间切换时确实会发生这种情况。

【问题讨论】:

  • 当你想要嵌套片段时,你使用getChildFragmentmanager()R.id.calendarframelayout 是来自 R.layout.reservation_calendar_layout 的视图的 id 还是选项卡所在的布局的 id?此外,通过ViewPager? 实现的简单选项卡或选项卡
  • @Luksprog 我在 ViewPager 中使用标签。 R.id.calendarframelayout 是 R.layout.reservation_calendar_layout 中包含的框架布局的 id。另外,我应该如何使用getChildFragmentManager?看来我不能将它与支持库中的 Fragment 一起使用。
  • 检查我的这个答案stackoverflow.com/a/13381792/493939,看看它是否对你有帮助。
  • @Luksprog atm 我希望能够使用 getChildFragmentManager :) 我正在努力。

标签: android android-fragments fragment


【解决方案1】:

不要在 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);
    }
}

【讨论】:

  • java.lang.NoSuchMethodError: fr.epitech.test_esi.fragments.ReservationCalendarFragment.getChildFragmentManager 07-10 17:34:54.321: E/AndroidRuntime(16917): 在 fr.epitech.test_esi.fragments。 ReservationCalendarFragment.onCreateView(ReservationCalendarFragment.java:27)
  • 我实际上使用支持库 v4。
  • 我尝试使用支持库 v13 但还是一样。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多