【问题标题】:Android 4.0.x and 4.1.x viewPager bug?Android 4.0.x 和 4.1.x viewPager 错误?
【发布时间】:2015-01-29 20:29:37
【问题描述】:

我在 android API 15 和 16 上的 viewPager 有问题,我的应用程序基本上是简单的远程控制机顶盒的三个屏幕,在第一个屏幕上您可以选择要控制的框,第二个和第三个只是带有控件的屏幕。现在的问题是,在所有其他版本的 android 上,一切都可以正常运行,但是在 API 15 和 16 上,当应用程序启动时,我无法使用带有框的屏幕,当我点击任何它检测到第二个屏幕上的操作时,它是控件,当我滑动到第三个屏幕然后返回时,再次调用第一个屏幕的 onCreateView 并且一切正常。这是第一屏和第二屏的图片 这是我的 viewPager 代码:

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.
            // Return a PlaceholderFragment (defined as a static inner class below).
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            switch (position) {
                case 0:
                    return boxesFragment;
                case 1:
                    return miscpadFragment;
                case 2:
                    if (metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM) {
                        return volPadFragment;
                    } else return numberPadFragment;
                case 3:
                    return numberPadFragment;
            }
            return null;
        }

        @Override
        public int getCount() {
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            switch(metrics.densityDpi){
                case DisplayMetrics.DENSITY_MEDIUM:
                    if (isTablet) {
                        return 2;
                    } else return 4;
                case DisplayMetrics.DENSITY_HIGH:
                    if (isTablet) {
                        return 2;
                    } else return 3;
                case DisplayMetrics.DENSITY_XHIGH:
                    if (isTablet) {
                        return 2;
                    } else return 3;
                case DisplayMetrics.DENSITY_XXHIGH:
                    return 3;
                case DisplayMetrics.DENSITY_TV:
                    return 2;
            }
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }

还有我也用于动画的 DepthPageTransformer:

public class DepthPageTransformer implements ViewPager.PageTransformer {
        private static final float MIN_SCALE = 0.8f;

        public void transformPage(View view, float position) {
            int pageWidth = view.getWidth();

            if (position < -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);

            } else if (position <= 0) { // [-1,0]
                // Use the default slide transition when moving to the left page
                view.setAlpha(1);
                view.setTranslationX(0);
                view.setScaleX(1);
                view.setScaleY(1);

            } else if (position <= 1) { // (0,1]
                // Fade the page out.
                view.setAlpha(1 - position);

                // Counteract the default slide transition
                view.setTranslationX(pageWidth * -position);

                // Scale the page down (between MIN_SCALE and 1)
                float scaleFactor = MIN_SCALE
                        + (1 - MIN_SCALE) * (1 - Math.abs(position));
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);

            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }
        }
    }

【问题讨论】:

    标签: android android-fragments android-viewpager android-4.0-ice-cream-sandwich


    【解决方案1】:

    所以我解决了我的问题,这是我从developers.google.com 下载的DepthPageTransformer 中的transformPage 方法,我将其修改如下:

    public void transformPage(View view, float position) {
                float translationX;
                float scale;
                float alpha;
    
                if (position >= 1 || position <= -1) {
                    // Fix for https://code.google.com/p/android/issues/detail?id=58918
                    translationX = 0;
                    scale = 1;
                    alpha = 1;
                } else if (position >= 0) {
                    translationX = -view.getWidth() * position;
                    scale = -0.2f * position + 1;
                    alpha = Math.max(1 - position, 0);
                } else {
                    translationX = 0.5f * view.getWidth() * position;
                    scale = 1.0f;
                    alpha = Math.max(0.1f * position + 1, 0);
                }
    
                view.setTranslationX( translationX);
                view.setScaleX(scale);
                view.setScaleY(scale);
                view.setAlpha(alpha);
            }
    

    一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2014-03-08
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多