0

我想要一个选项卡布局,其中每个选项卡上有两个片段,上面的一个显示通过在 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();
    }

}

此主要片段的NOTE*布局很简单,包含两个框架布局。

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

4

1 回答 1

0
  1. To Show all Tabs at the same time in start, increase PagerOffSetLimit (to 2 in this case for 3 tabs)
  2. For refreshing state of fragment or calling some methods on your fragment in the tab beside your current tab, use the Pager.instantiateItem method.
    1. One second delay is because you have on the animateLayoutChanges in your xml.
于 2013-03-30T00:00:04.017 回答