【问题标题】:Navigation Drawer with Activities - Basic Concept带有活动的导航抽屉 - 基本概念
【发布时间】:2013-12-18 04:07:45
【问题描述】:

我有一个在过去几天无法解决的基本问题(即使在谷歌搜索和 SOing 中进行了许多示例/解释之后)。

我有 5 个不同的 Activity ,每个 Activity 都是独立的,每个 Activity 都有自己的布局文件。现在,我想将 Navigation Drawer 添加为我的应用程序菜单。

据我所知,2个推荐的方法是:

1) 将这 5 个活动合并为一个 MainActivity,并使用 5 个片段加载 5 个不同的布局。但是我很难将这 5 个合并为 1 个。如果我将所有方法都加载到一个 Activity 中,会不会有任何性能问题?

2) 拥有一个包含抽屉的 BaseActivity,并将所有其他活动扩展到 Base Activity。但是我已将所有活动扩展到 NavDrawer 类(包含抽屉),但无法正常工作。单独的抽屉工作正常(仅当我运行 NavDrawer 时)。我是否需要对现有活动的布局 xml 进行任何更改?

很抱歉,如果这是非常基本的,但我在两天内未能掌握这个概念后发布此内容!

如果你愿意,我可以附上我的代码,但抽屉代码是基本的东西,根据教程。

谢谢,

我正在使用的参考资料:
1)http://developer.android.com/training/implementing-navigation/nav-drawer.html 2)http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

【问题讨论】:

  • 你是如何加载 5 个活动的?还是5个碎片?问题是,使用导航抽屉,您将只使用单个片段,而使用 fragment.replace 方法,您将销毁当前片段并将新片段应用到该位置。
  • 好的,所以我应该重写我当前的代码将这 5 个 Activity 类转换为一个,然后添加导航抽屉? (目前我的应用程序中没有任何抽屉)。
  • 如果您关注 AndroidHive 链接,它将是您的最佳选择……相信我 :)

标签: android android-fragments navigation-drawer


【解决方案1】:

我可以建议您将ViewPageractionbar tabs 一起使用。因为在 viewpager 的帮助下,所有五个片段都可以看到同一个导航抽屉。为了提高效率,ViewPager 创建当前页面,此外它还始终准备您的下一页和上一页。以便在用户滑动页面时显示内容的速度更快。我总是遵循相同的,我不认为它是低效的。

我的一个应用程序的代码 sn-p 如下:

public class MainActivity extends ActionBarActivity {


    String[] titles;

    ViewPager viewPager;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private String[] mListTitles;

    public PagerTabStrip titleStrip;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            viewPager = (ViewPager) findViewById(R.id.pager);

            TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());
            viewPager.setAdapter(titleAdapter);
            viewPager.setCurrentItem(0);

            mTitle = mDrawerTitle = getTitle();
            mListTitles = getResources().getStringArray(R.array.drawerlist_array);
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerList = (ListView) findViewById(R.id.left_drawer);

            mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
            // sets up the drawer's list view with items and click listener
            mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mListTitles));
            mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

            // enables ActionBar app icon to behave as action to toggle nav drawer
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);


            mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
            mDrawerLayout, /* DrawerLayout object */
            R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
            R.string.drawer_open, /* "open drawer" description for accessibility */
            R.string.drawer_close /* "close drawer" description for accessibility */
            )
            {
                public void onDrawerClosed(View view)
                {
                    getSupportActionBar().setTitle(mTitle);

                }

                public void onDrawerOpened(View drawerView)
                {
                    getSupportActionBar().setTitle(mDrawerTitle);

                }
            };
            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null)
            {
                selectItem(0);
            }


        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {

            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu)
        {

            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            return super.onPrepareOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            // The action bar home/up action should open or close the drawer.
            // ActionBarDrawerToggle will take care of this.
            if (mDrawerToggle.onOptionsItemSelected(item))
            {
                return true;
            }
            else{

                return false;
            }
        }


        class TitleAdapter extends FragmentPagerAdapter{
            private String titles[] = new String[]{"Expenses","Savings","Income"};
            private Fragment frags[] = new Fragment[titles.length]; 

            public TitleAdapter(FragmentManager fm) {
                    super(fm);
                    frags[0] = new Fragment1();
                    frags[1] = new Fragment2();
                    frags[2] = new Fragment3();
            }

            @Override
            public CharSequence getPageTitle (int position){
                    Log.v("TitleAdapter - getPageTitle=", titles[position]);
                    return titles[position];
            }

            @Override
            public Fragment getItem(int position) {
                    Log.v("TitleAdapter - getItem=", String.valueOf(position));
                    return frags[position];
            }

            @Override
            public int getCount() {
                    return frags.length;
            }

    }



        /* The click listner for ListView in the navigation drawer */
        private class DrawerItemClickListener implements ListView.OnItemClickListener
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                selectItem(position);
            }
        }

        private void selectItem(int position)
        {

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            setTitle(mListTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        }

        @Override
        public void setTitle(CharSequence title)
        {
            mTitle = title;
            getSupportActionBar().setTitle(mTitle);
        }

        /**
         * When using the ActionBarDrawerToggle, you must call it during
         * onPostCreate() and onConfigurationChanged()...
         */

        @Override
        protected void onPostCreate(Bundle savedInstanceState)
        {
            super.onPostCreate(savedInstanceState);
            // Sync the toggle state after onRestoreInstanceState has occurred.
            mDrawerToggle.syncState();
        }

        @Override
        public void onConfigurationChanged(Configuration newConfig)
        {
            super.onConfigurationChanged(newConfig);
            // Pass any configuration change to the drawer toggls
            mDrawerToggle.onConfigurationChanged(newConfig);
        }


    }

【讨论】:

  • 嗨,谢谢你的例子。由于我在android编码方面缺乏经验,我仍然无法掌握一件事。我应该将所有代码合并到 MainActivity 中吗?我的不同应用页面有不同的 java-layout 对(如“添加记录”页面、“编辑记录”页面、“显示记录”页面、“设置”页面等。然后使用片段加载不同的布局?因为我是无法将我的活动转换为片段(因为如果我扩展到片段而不是活动,许多方法都不起作用)。
  • 您不需要将所有代码合并到mainactivity中。相反,如果您可以观察我的示例,我有 3 个片段,在您的情况下是 5 个片段。这样在每个片段中您都有自己的布局,例如添加记录一页,设置一页。要编辑记录,您必须仅从显示记录页面提供编辑功能。您必须加载完全不同的活动来编辑和保存。我建议你检查一些应用程序,如 googleplay 应用程序等,
  • 好的,谢谢...最后一个问题..假设我通过片段加载布局 edit_record.xml 。现在,如何在 edit_record.java 文件中添加我以 Activity 形式编写的该页面的功能?按照您的建议,我现在正在检查一些应用程序以供参考。
  • 假设您在显示记录片段中有记录列表,并且在长时间单击列表视图项目时,您将获取该特定记录的详细信息并使用 putExtra 或类似方法将其放入意图中,然后用 startActivity 启动 EditActivity。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2014-04-14
相关资源
最近更新 更多