viewpager与navigationdrawer [英] viewpager with navigationdrawer

查看:161
本文介绍了viewpager与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项目的Andr​​oid工作室测试生成):

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆