Android:具有单个活动的多个页面

时间:2016-01-25 15:25:26

标签: java android

我是初学Android开发人员(自1995年以来我是Windows开发人员),我正在开发我的第一个应用。 我有一个二维数据数组(类似于[2] [])。 基本上它代表了需要在设备屏幕上显示的三组不同的数据。 不幸的是,虽然其中两个可以使用网格来表示,但第三个集合必须以完全不同的方式表示。 所以我需要的是一个三页的活动;在前两个我想使用一个公共布局,填充所需的数据,而在第三个页面我必须使用完全不同的布局。

我发现了这个:ViewPager Without Fragments,但遗憾的是我对在三个页面上处理用户输入的代码放置位置感到困惑。

作为Android的初学者,我实际上对这种情况下的一般方法有点困惑。 在我平时的开发经验中,我将创建一个带有选项卡式控件的窗口,三个选项卡,前两个中的网格以及第三个中的一些自定义控件。 这三个控件将存在于同一范围内#34; (我的窗口)并将在窗口加载期间填充。

据我所知,在Android中我必须遵循一种完全不同的方法,但是,正如我所说,我感到困惑:片段?没有碎片?还有什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

要在同一活动中实现多个页面,您需要使用片段。在您的情况下,我们将需要3个片段。您的活动布局文件应包含 ViewPager ,该文件将保留活动中的片段。如果您还希望通过标签访问片段,也可以添加 TabLayout 。 活动布局示例如下:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="your.package.name.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:contentInsetLeft="0dp"
            app:contentInsetStart="0dp"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:titleTextColor="@color/colorAccent"
            />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:background="@color/grey"
            app:tabGravity="fill"
            app:tabIndicatorColor="@color/colorAccent"
            app:tabIndicatorHeight="5dp"
            app:tabSelectedTextColor="@color/colorAccent"
            app:tabTextColor="@color/black"/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>


</android.support.design.widget.CoordinatorLayout>

完成此操作后,您需要在Activity类中创建 FragmentPagerAdapter 类。此适配器将管理ViewPager的实例化,该实例将片段保存在Activity中。 这是一个示例FragmentPagerAdapter SubClass

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.

            Log.d(LOG_TAG, "postion " + position);
            if (position == 0) {
                return Fragment1.newInstance(position + 1);
            } else if (position == 1) {
                return Fragment2.newInstance(position + 1);
            } else {
                return Fragment3.newInstance(position + 1);
            }

        }

        @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 "Fragment1";
                case 1:
                    return "Fragment2";
                case 2:
                    return "Fragment3";


            }
            return null;
        }

    }

完成后,您现在可以在Activity onCreate 方法中获取对ViewPager的引用,并按如下方式设置ViewPager适配器

@Override
    protected void onCreate(Bundle savedInstanceState) {

ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
       SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mSectionsPagerAdapter);

// setting the views to be accessed through tabs
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int currentTab = tab.getPosition();
                viewPager.setCurrentItem(currentTab);

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });


 }

希望这对你来说很清楚。有关详细信息,您还可以查看here

答案 1 :(得分:1)

您可以在Activity中处理用户输入,也可以将其分解为Fragments。两者都描述如下。

<强>活动

问题通常是您在活动的Views方法中获取布局中onCreate()的引用并执行任何设置(添加OnClickListener等),但是&在这种情况下,真的不可能,因为那时你的ViewPager还没有加载任何页面,这些页面上的视图还没有在视图层次结构中。 (当涉及ViewPager时,Android的视图和布局系统会相当混乱。)

相反,您必须获取引用并在适配器的instantiateItem()内执行设置,并且可能会使destroyItem()中的引用无效。

<强>片段

上述问题可能是框架中直接支持Fragments的原因(使用FragmentPagerAdapterFragmentStatePagerAdapter)。对于每个页面使用Fragment,您可以获取对该页面上的视图的引用并在onCreateView()(或onViewCreated())内执行设置,并且业务逻辑也可以封装在片段中。基本上,与活动的onCreate()不同,您不必担心与这些回调的时间相关的观点的存在。

另一个好处是,通过将逻辑封装在单独的片段中,您的应用程序具有一定程度的模块化。如果您可以在更大的屏幕上设想您的应用程序,可能有两个(甚至全部三个)您的&#34;页面&#34;一次可见,那么从一开始就使用碎片可能更好。