簡體   English   中英

Android-Actionbar標簽和片段可保存標簽之間的斷裂狀態

[英]Android - Actionbar tabs and fragments save fragement state between tabs

我有一個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");
}

當切換選項卡時,我發現一個問題,我添加到選項卡中的Fragment來自ListFragment ,當按以下代碼創建時,我將加載數據,此init函數將從服務加載所有數據,並更新listView,這一次將滾動到視圖頂部。 現在,當我切換到另一個選項卡,然后又切換回該選項卡時,此函數再次被調用,因此視圖跳到頂部。 我實際上想知道如何保持Fragment的狀態,所以當我切換回去時,它仍然處於它的最后位置。 謝謝。

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

        init();

    }

我正在尋找一種避免使用listView位置技巧的解決方案, 當返回到ListView時 ,可以保持/保存/還原滾動位置 ,它能夠保存片段狀態,因此下次我們可以像Activity一樣重新設置它的位置嗎? 目前,它必須是ActionBar導航選項卡+片段。

此應用最初是為Android 2.3創建的,並使用了TabHost,現在我將其轉換為基於Android 4.0 Actionbar的應用。 在TabHost中,它為每個ListView使用Activity ,現在我將它們更改為Fragment。 github.com(我的私人倉庫)中的所有源代碼,如果您願意提供幫助,我可以添加您的帳戶,以便您可以git cloen並隨時對其進行審查。

這個問題有很多答案,請點擊這里查看完整的摘要 它使用android.support.v4.app.Fragment ,如果您在Android 2.3上執行此操作,則必須使用that

2013年8月,Google發布了ActionBarCompat,可讓您將其返回2.1設備。
(ActionBarSherlock是ActionBarCompat的舊替代方法)

在此處閱讀前兩頁:
vogella-使用Android操作欄(ActionBar)-教程

當然還有公告:
ActionBarCompat和I / O 2013應用程序源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM