我有一个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");
}
当切换选项卡时,我发现了一个问题,我添加到选项卡的片段来自ListFragment
,我将在创建以下代码时加载数据,此init函数将从服务加载所有数据,并且更新listView,这次它将滚动到视图的顶部。现在,当我切换到另一个选项卡,然后切换回来时,此功能再次调用,因此视图跳转到顶部。我实际上想知道,如何保持Fragment的状态,所以当我换回时,它仍然处于它确实拥有的最新位置。感谢。
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
init();
}
我正在寻找一个避免使用listView位置技巧Maintain/Save/Restore scroll position when returning to a ListView的解决方案,是否能够保存片段状态,所以下次我们可以重新调整它,因为它看起来像Activity
吗?目前,它必须是ActionBar Navigation Tab + Fragments。
这个应用程序在Android 2.3中创建并使用了TabHost,现在我将其转换为基于Android 4.0 Actionbar的应用程序。在TabHost中,它为每个Activity
使用ListView
,现在我将它们更改为Fragment。 github.com中的所有源代码,我的私人仓库,如果您愿意提供帮助,我可以添加您的帐户,这样您就可以随时查看并随时查看。
答案 0 :(得分:0)
这个问题有很多答案,请查看complete rundown。它使用android.support.v4.app.Fragment
,你必须使用它,如果你这样做Android 2.3
2013年8月谷歌发布了ActionBarCompat,让你可以回到2.1设备 (ActionBarSherlock是ActionBarCompat的旧替代品)
在这里阅读前两页:
vogella- Using the Android action bar (ActionBar) - Tutorial