viewpager与navigationdrawer [英] viewpager with navigationdrawer
问题描述
我试图使用和不使用导航抽屉内viewpager实施片段。这里就是我想要实现的:
i'm trying to implement fragments with and without viewpager inside a navigation drawer. here's what I'm trying to achieve:
1)用抽屉式导航应用,而在3菜单:仪表盘,费用,收入
1) an app with navigation drawer, with 3 menus: dashboard, expenses, income
2)仪表盘是只是一个页面(或者我应该叫什么)和NO viewpager
2) 'dashboard' is just a normal fragment with one page (or what should I call it) and NO viewpager
3)费用和放大器;收入是其中包含viewpager另一个片段;费用有2 viewpager页(每日,经常性),而收入有3 viewpager页(每天,反复发作,报告)
3) expenses & income are another fragments which contains viewpager; expenses have 2 viewpager pages (daily, recurring), while income have 3 viewpager pages (daily,recurring,report)
所以这里是我的code的一部分(我只是修改了code,当我们选择一个NavigationDrawer项目的Android工作室测试生成):
so here's a portion of my code (I just modified the code that Android Studio beta generates when we select a NavigationDrawer project):
MyActivity.java
public class MyActivity extends ActionBarActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.commit();
}
}
NavigationDrawerFragment.java
public class NavigationDrawerFragment extends Fragment {
private void selectItem(int position) {
Fragment fragment = null;
mCurrentSelectedPosition = position;
if (mDrawerListView != null) {
mDrawerListView.setItemChecked(position, true);
}
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position);
}
switch (position) {
case 0:
fragment = new Dashboard();
break;
case 1:
fragment = new Expenses();
break;
case 2:
fragment = new Income();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
} else {
Log.e("NavigationDrawerFragment.java", "Error in creating fragment");
}
}
}
Expenses.java
public class Expenses extends Fragment{
private class MyPageAdapter extends FragmentPagerAdapter{
private final String[] TITLES = { "Daily", "Recurring"};
public MyPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return ExpensesDaily();
case 1:
return ExpensesRecurring;
}
}
}
}
但我还没有搞清楚如何实现expenses.java正被当我们选择NavigationDrawer'费'菜单中调用。 Expenses.java应实施ViewPager,它应该有2页,这是每日&安培;周期性。任何帮助得多AP preciated。谢谢
but I still haven't figure out how to implement expenses.java which are being called when we select 'expenses' menu from NavigationDrawer. Expenses.java should implement ViewPager, and it should have 2 pages, which is Daily & Recurring. Any help are much appreciated. thanks
更新#1:
我试图让Expenses.java扩展FragmentActivity但似乎使用code,我们不能调用从NavigationDrawer另一项活动:
I tried to make Expenses.java extends FragmentActivity but it seems we can't call another activity from NavigationDrawer using the code:
switch (position) {
case 0:
fragment = new Dashboard();
break;
case 1:
fragment = new Expenses();
break;
case 2:
fragment = new Income();
break;
default:
break;
}
即使这是可以做到,那不是我想要的,因为打开另一个活动是像打开一个新的窗口,对吧?
even if it could be done, that's not what I want because opening another activity is like opening a new window, right?
推荐答案
您有困难的部分是,你希望自己的某些顶级片段,即ExpensesFragment和IncomeFragment,多采用碎片进行的页面 ViewPager
(因为你已经定义了一个 FragmentPagerAdapter
实现)。
The part you are having trouble with is that you want some of your top-level Fragments, namely ExpensesFragment and IncomeFragment, to use more fragments for the pages of the ViewPager
(since you've already defined a FragmentPagerAdapter
implementation).
在实例化 FragmentPagerAdapter
,你给它一个 FragmentManager
。我相信你需要使用 getChildFragmentManager()
中的顶级片段
,例如像这样:
When you instantiate the FragmentPagerAdapter
, you give it a FragmentManager
. I believe you need to use getChildFragmentManager()
in the top-level Fragment
, for example like so:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
MyPageAdapter adapter = new MyPageAdapter(getChildFragmentManager());
viewPager.setAdapter(adapter);
}
这将提供具体到这个特殊的片段,并用于管理嵌套片段一个FragmentManager实例。
This will provide a FragmentManager instance specific to this particular Fragment and used for managing nested fragments.
这篇关于viewpager与navigationdrawer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!