我正在使用动作栏和带有片段的选项卡导航。
每个选项卡都包含一个带有列表视图的片段X,当单击列表中的一个项目时,片段X被另一个带有项目详细信息的片段取代。
当我在FragmentY中时,如何设置ActionBar
的Up按钮以加载FragmentX?
文档显示导航应该在活动
之间完成,但ActionBar
的导航选项卡允许在Fragments
之间导航,而不是活动
。
我错过了什么?
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// When swiping between different sections, select the corresponding
// tab. We can also use ActionBar.Tab#select() to do this if we have
// a reference to the Tab.
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
// Create a tab with text corresponding to the page title defined by
// the adapter. Also specify this Activity object, which implements
// the TabListener interface, as the callback (listener) for when
// this tab is selected.
LinearLayout view = (LinearLayout) getLayoutInflater().inflate(R.layout.tab, null);
ImageView icon = (ImageView) view.findViewById(R.id.icon);
icon.setImageResource(tabIconList[i]);
TextView title = (TextView) view.findViewById(R.id.title);
title.setText(tabTitleList[i]);
actionBar.addTab(actionBar.newTab()
.setCustomView(view)
.setTabListener(this));
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in
// the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment = null;
switch(position){
case 0:
fragment = new MyListFragment1();
break;
case 1:
fragment = new MyListFragment2();
break;
case 2:
fragment = new MyListFragment3();
break;
default: fragment = new MyListFragment1();
}
return fragment;
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title1).toUpperCase(l);
case 1:
return getString(R.string.title2).toUpperCase(l);
case 2:
return getString(R.string.title3).toUpperCase(l);
}
return null;
}
}
}
我最终没有使用ActionBar
。约束太多(我有另一个问题,我想在ActionBar
上方添加一个View
,这似乎很复杂)。
从头开始做自己的布局要简单得多。
加载碎片时激活向上导航。然后在OnOptions ItemSelected上拦截向上导航,只需弹出Backback并启动FragmentX。
我对SO进行了快速搜索,发现了这个,这启发了我。
我有一个应用程序,它使用选项卡进行导航。通过这些选项卡,我在布局中使用和。 我已经在应用程序的主中配置了这些内容。在这里,我为添加了一个页面更改监听器,并更改了关于位置的选项卡。当按下选项卡时,我也会以另一种方式进行操作。这都没问题。 然后我就有了标签中的内容。它们都扩展了类。第一个必须根据设备改变布局。在横向平板电脑()上,我有一个包含两个片段的布局,而其他设备只有一个片段。这是由appiate
我已经实现了ActionBarsherlock的示例com.actionBarsherlock.sample.fragments,所有这些都工作得很好,直到当所选选项卡有子片段时设备方向发生变化。 一切都好: 一切都很好,可以旋转设备没有问题。现在,如果我在Fragment2中选择一个列表项来推入Fragment2Child1,在我旋转设备之前,一切都是好的。 设备旋转时不良: tab1->Fra
我正在尝试在我的android应用中实现一个选项卡导航,但是我想在每个选项卡中运行一个不同的activity。我一直在读android开发页面,他们坚持使用片段导航活动。根据我的理解,你不能有一个片段类本身,它必须包含在一个activity中。 是否可以为每个选项卡创建一个新的activity,并在onTabSelected()函数中运行该activity,同时从正在运行的activity中的片段
就我一直在寻找的情况而言,我没有为我的代码提出一个好的最终解决方案。我试图实现类似这样的布局: 动作栏 null
我想更改片段选项卡的大小。有什么办法吗??我们可以更改使用视图寻呼机和片段创建的片段选项卡的大小??