Android-Actionbar选项卡和片段保存选项卡之间的碎片状态

Android-Actionbar选项卡和片段保存选项卡之间的碎片状态,android,android-fragments,android-actionbar,Android,Android Fragments,Android Actionbar,我有一个android应用程序,上面有四个操作栏导航标签。正如本文所建议的,我已经为每一个添加了片段。成功了 // here I created an ActionBar Navigation Tabs from MainActivity public function initActionBar () { this.getActionBar().setDisplayShowHomeEnabled(false); this.getActionBar().setDispla

我有一个android应用程序,上面有四个操作栏导航标签。正如本文所建议的,我已经为每一个添加了片段。成功了

// here I created an ActionBar Navigation Tabs from MainActivity   
public function initActionBar () {

    this.getActionBar().setDisplayShowHomeEnabled(false);
    this.getActionBar().setDisplayShowTitleEnabled(false);

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(false);

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    String[] tabs = { "test", "test1", "test2", "test3" };

    ActionBar.Tab tab = actionBar.newTab().setText(tabs[0]).setTag("0");
    tab.setTabListener(new MainTabListener(new Testfragment()));
    actionBar.addTab(tab);

    ActionBar.Tab tab1 = actionBar.newTab().setText(tabs[1])
            .setTag("1");
    tab1.setTabListener(new MainTabListener(new Test1Fragment()));
    actionBar.addTab(tab1);
}

public class MainTabListener implements TabListener {

    ParentListFragment fragment;
    boolean added = false;

    public MainTabListener(ParentListFragment fragment) {
        this.fragment = fragment;
    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab arg0, FragmentTransaction ft) {

        ft.replace(R.id.jokeFragment, fragment);

    }

    @Override
    public void onTabUnselected(Tab arg0, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        ft.remove(fragment);
        //ft.detach(fragment);
        android.util.Log.v ("main tab listener", "detached");
    }

}
以下是来自TestFragment和Test1Fragment的主代码

@Override

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    init();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_test, null);
    return view;
}

public void init() {

    Posts.getInstance().setUpdateInfo();

    list = (PullToRefreshListView) this.getActivity().findViewById(
            R.id.list2);
    list.setTag("first");

    list.setOnRefreshListener(new OnRefreshListener<ListView>() {
        public void onRefresh(PullToRefreshBase<ListView> refreshView) {

            try {
                load("0");
            }

            catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    init2();
}

public void init2() {

    adapter = new JokeListAdapter(this.getActivity());
    adapter.posts = Posts.getInstance().posts0;
    list.getRefreshableView().setAdapter(adapter);

    footer = (RelativeLayout) ((LayoutInflater) this.getActivity()
            .getApplicationContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.view_list_footer, null, false);
    footer.setVisibility(LinearLayout.GONE);
    loadingMoreLogo = (ProgressBar) footer
            .findViewById(R.id.loadingMoreLogo);
    loadingMoreLogo.setVisibility(ProgressBar.GONE);

    listener = new OnButtonClickListener();
    Button button = (Button) footer.findViewById(R.id.buttonLoadMore);
    button.setTag("loadmore");
    button.setOnClickListener(listener);

    button = (Button) this.getActivity().findViewById(R.id.buttonJokeTag);
    button.setTag("tag");
    button.setOnClickListener(listener);

    button = (Button) this.getActivity().findViewById(
            R.id.buttonJokeRefresh);
    button.setTag("refresh");
    button.setOnClickListener(listener);

    Posts.getInstance().getDataFromDB(0);

    if (Posts.getInstance().posts0 != null) {
        adapter.posts = Posts.getInstance().posts0;
        adapter.notifyDataSetChanged();
        list.getRefreshableView().setAdapter(adapter);

        if (list.getTag() == "first") {
            list.setTag("");
            list.getRefreshableView().addFooterView(footer);
            footer.setVisibility(LinearLayout.VISIBLE);
        }
    }
    isNext = false;
    load("0");
}
我正在寻找一种避免使用listView位置技巧的解决方案,它是否能够保存片段状态,以便下次我们可以像
Activity
do那样解析它?现在,它必须是ActionBar导航选项卡+片段


这个应用最初是由Android 2.3创建的,使用了TabHost,现在我将它转换成基于Android 4.0 Actionbar的应用。在TabHost中,它对每个
ListView
使用
Activity
,现在我将它们改为Fragment。github.com中的所有源代码,我的私人回购,如果您愿意帮助,我可以添加您的帐户,这样您就可以git克隆它并随时查看。

这个问题有很多答案,请在这里查找。它使用的是
android.support.v4.app.Fragment
,如果你在android2.3上使用它,你必须使用它

2013年8月,谷歌发布了ActionBarCompat,它允许您在2.1设备上执行此操作。
(ActionBarSherlock是ActionBarCompat的老替代品)

阅读此处的前两页:

当然还有公告:

如果您显示所有代码,我们会更轻松谢谢,只是添加了它们。谢谢Erik,您太快了,让我检查一下。您好,刚刚检查过,我看到它使用了TabHost,但在我的应用程序中,我可能必须使用ActionBar导航选项卡,有什么办法吗?更新了我的答案,有一些事情您应该知道以节省您的时间。如果没有这个,在旧设备上安装安卓4.0 Actionbar是不可能的。
public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        init();

    }