【问题标题】:One Fragment with multi inner fragments for many tabs一个带有多个内部片段的片段,用于许多选项卡
【发布时间】:2013-03-10 11:44:19
【问题描述】:

我想要一个选项卡布局,其中 在每个选项卡上都有两个片段,上面的一个显示任务的进度通过在 3 个选项卡中提供输入来完成,从开始到结束,以及该进度片段下方的另一个主要片段将接受输入。

这使得每个选项卡中的标题和细节,标题片段和细节片段(每个选项卡上的输入片段不同)!

我用了两天的所有方法:(

我的解决方案 我尝试了一个包含两个主要片段的框架布局的布局,该布局从 ViewPager 添加到两个选项卡中,如下所示:

public static class ScreenSlidePagerAdapter extends
        FragmentStatePagerAdapter {

    public static ArrayList<Fragment> tabs_fragments = new ArrayList<Fragment>(
            3);

    public ScreenSlidePagerAdapter(FragmentManager fm,
            ArrayList<Fragment> tabs) {
        super(fm);
        ScreenSlidePagerAdapter.tabs_fragments = tabs;

    }

    @Override
    public Fragment getItem(int arg0) {
        return tabs_fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return tabs_fragments.size();
    }

    @Override
    public int getItemPosition(Object object) {
        if (tabs_fragments.contains(object)) {
            return POSITION_UNCHANGED;
        }
        return POSITION_NONE;
    }

    public static void setItem(Fragment fr, int position) {
        if (position <= 2 && position >= 0) {
            tabs_fragments.remove(position);
            tabs_fragments.add(position, fr);
        } else
            Log.d("adding tab", "wrong tab position to add fragment at");
    }
}

在活动开始时,我执行此操作,请参阅我在主片段中使用的标签位置,用于加载不同标签位置的详细片段:

    mPager = (ViewPager) findViewById(R.id.pager);
    // fragments for pagers
    ArrayList<Fragment> tabs = new ArrayList<Fragment>();
    tabs.add(new FrEventDetails());
    tabs.add(new FrEventDetails());
    tabs.add(new FrRuleSave());
    mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager(), tabs);
    mPager.setAdapter(mPagerAdapter);

    bar = getActionBar();
    bar.setTitle("Add Rule");
    bar.setSubtitle("select event for rule");
    bar.setDisplayShowTitleEnabled(true);
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    bar.setDisplayHomeAsUpEnabled(true);

    bar.addTab(bar.newTab().setText("Select Event")
            .setTabListener(new TabListener(mPager)));
    bar.addTab(bar.newTab().setText("Select Action")
            .setTabListener(new TabListener(mPager)));
    bar.addTab(bar.newTab().setText("Save Rule")
            .setTabListener(new TabListener(mPager)));

    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
    mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            // When swiping between pages, select the
            // corresponding tab.
            if (bar.getSelectedNavigationIndex() != position)
                bar.setSelectedNavigationItem(position);
            tab = position;
        }

然后当这个片段附加到活动时,我添加一个进度布局(标题(对于一个框架布局并基于选定的选项卡,为细节框架布局添加另一个片段(用于输入)。 显示在这里:

public class FrEventDetails extends Fragment {
Context context;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = (Context) activity;
    int tab = AddRule1.tab;
    android.app.FragmentTransaction ft = activity.getFragmentManager()
            .beginTransaction();
     ft.add(R.id.fr_rule_progress_container, new FrProgress());

    if (tab == 1) {
        ft.replace(R.id.fr_event_input_container, new FrActionSelect(),
                "cell1_1").commit();
    } else if (tab == 0) {
        ft.replace(R.id.fr_event_action_container, new FrEventSelect(),
                "cell1_2").commit();
    }

}

注意* 这个主要片段的布局很简单,包含两个框架布局。

结果: 它在第一个选项卡上精美地显示标题和细节,但在第二个选项卡上,只有主要片段, 当我滑动到第三个片段并返回时,第二个片段被漂亮地填充(显示 1 秒后),但第一个片段现在是空的。 我不明白该怎么办。
请给这两天泪流满面的问题一些解决方案

【问题讨论】:

    标签: android android-layout android-fragments android-viewpager android-framelayout


    【解决方案1】:
    1. 要在开始时同时显示所有选项卡,请增加 PagerOffSetLimit(在这种情况下为 2 以表示 3 个选项卡)
    2. 要刷新片段状态或在当前选项卡旁边的选项卡中调用片段上的某些方法,请使用 Pager.instantiateItem 方法。
      1. 一秒延迟是因为您在 xml 中有 animateLayoutChanges。

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多