【问题标题】:ViewFlipper vs FragmentsViewFlipper 与片段
【发布时间】:2012-01-25 19:33:55
【问题描述】:

我有一个带有 ViewFlipper 的 Activity,它使用我的数据在一堆视图(页面)之间翻转。

我正在考虑使用片段 API 在我的视图之间切换。这样做有什么好处?

我是否可以通过使用 Fragment 来提高性能,因为 ViewFlipper 本质上会切换可见性标志,并且 Fragment 实际上会在您添加/删除它们时替换视图层次结构?

谁能给我们更多的见解?

谢谢!

【问题讨论】:

  • 如果你想进行性能分析,你应该自己做。 Stack 通常不擅长回答这类问题。

标签: android android-fragments viewflipper


【解决方案1】:

编辑:我在这里说的是 ViewPager,而不是 ViewFlipper。

使用 ViewPager 的好处是使用起来非常简单。您只需创建一个 FragmentPagerAdapter 并填写几个简单的字段。下面是我编写的一个示例,用于显示从父类传递的项目。

public static class DashboardPagerAdapter extends FragmentPagerAdapter {

    private static final int NUM_ITEMS_PER_SCREEN = 12;

    private List<View> mAllItems;
    private int mNumScreens;

    public DashboardPagerAdapter(FragmentManager fm, List<View> allItems) {
        super(fm);
        mAllItems = allItems;
        mNumScreens = (int) Math.ceil(mAllItems.size()
                / (float) NUM_ITEMS_PER_SCREEN);
        Log.d(TAG, "num screens: " + mNumScreens);
    }

    @Override
    public int getCount() {
        return mNumScreens;
    }

    @Override
    public Fragment getItem(int position) {
        DashboardScreenFragment screen = DashboardScreenFragment
                .newInstance();

        for (int i = position * NUM_ITEMS_PER_SCREEN; i < (position + 1)
                * NUM_ITEMS_PER_SCREEN; i++) {
            if (i >= mAllItems.size()) {
                break;
            }
            screen.addChild(mAllItems.get(i));
        }
        return screen;
    }
}

而且设置起来超级简单:

    final DashboardPagerAdapter adapter = new DashboardPagerAdapter(
            getFragmentManager(), mAllButtons);

与@sebap123 所说的相反,您可以使用带有支持库的 Android v4 及更高版本的 Fragments;有关详细信息,请参阅http://developer.android.com/sdk/compatibility-library.html,但实际上只是将 jar 文件放入您的 /libs 目录中。

顺便说一句,请注意,对于 ViewPager,每个“页面”本身就是一个片段。

至于是否有性能改进,这取决于您将其与什么进行比较。我强烈建议仅在担心性能问题之后尝试 ViewPager。正如 Donald Knuth 所说,“我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。”

无论如何,如果您有大量页面,请参阅http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html 以获得更合适的适配器。

【讨论】:

  • 我说的是使用 ViewFlipper 在片段之间翻转。我指的是使用 FragmentManager 添加/删除片段与使用仅翻转视图(不再是片段!)的 ViewFlipper 之间的比较。
  • 区别在于视觉效果。如果您希望用户能够在屏幕之间水平滑动,您应该使用 ViewFlipper。如果您只是想添加和删除片段(例如使用按钮),您应该使用 FragmentManager。
  • 哇,你知道我刚刚意识到了什么吗?我一直在谈论 ViewPager,而不是 ViewFlipper。 ViewFlipper 完全不同,对不起。我将编辑并用 ViewPager 替换“ViewFlipper”,而不是删除整个内容,即使它没有直接回答问题。
【解决方案2】:

Fragment 是Activity 中的一种行为或用户界面的一部分。
您可以在一个操作中组合多个片段以创建多级用户界面并在多个操作中重用片段。您可以将片段想象成一个模块化的活动部分,它有自己的生命周期,接收自己的输入事件,您可以在工作期间添加或删除它(有点像辅助活动 em>,您可以在不同的操作中重复使用)。

片段必须始终嵌入到动作中,片段生命周期直接取决于宿主生命周期。比如一个action暂停的时候,也就是里面的所有fragment,以及action销毁的时候,以及所有的fragment。但是,在执行动作的同时(处于恢复生命周期的状态),您可以独立控制每个片段,例如,添加或删除它们。当你执行这样一个fragment事务时,你也可以将它添加到back stack,它由activity控制——activity中前一个stack中的每一个entry都是一个fragment事务发生的记录。后退堆栈允许用户通过按 BACK 按钮取消片段事务(向后移动)。

但是ViewFlipper 是一个动作。所以它只是一个 ViewGroup。一个简单的ViewAnimator,它将在添加到其中的两个或多个视图之间进行动画处理。一次只显示一个孩子。如果需要,您可以定期在每个孩子之间自动切换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2020-10-03
    相关资源
    最近更新 更多