查看SetVisibility无法使用PagerAdapter

时间:2013-08-02 18:26:44

标签: android android-layout android-view

编辑:经过更多调查后发现,这与ViewPager无关。问题是在XML中的ViewGroup上设置可见性属性,然后尝试在运行时更改它。我原来的问题就是这样。有关详细信息,请参阅我的回答below

我的布局包含ViewPager和自定义PagerIndicator类。在ViewPager的第0页,我希望指标为View.GONE。在其他页面上,我希望它是View.VISIBLE。这是我的代码,在onCreate期间调用:

void setupPager() {
    mPager.setAdapter(new TutorialPagerAdapter());
    mPager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageSelected(int currentPage) {
            Log.d(TAG, String.valueOf(currentPage));
            if (currentPage == 0) {
                mPagerIndicator.setVisibility(View.GONE);
            } else {
                mPagerIndicator.setVisibility(View.VISIBLE);
            }
            mPagerIndicator.setCurrentPage(currentPage);

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

{x}中的mPagerIndicator设置为android:visibility="invisible"。当我在页面之间滚动时,我可以看到正在调用回调,页码是正确的。但是,寻呼机不会出现。

这就是奇怪的地方:我加载了SDK附带的Android Hierarchy Viewer。当它从模拟器POOF加载视图层次结构时,指示符出现。它在物理设备上似乎也不是问题。 (编辑:经过一些更多的测试后,它似乎是2.3的问题,因为它不会发生在更高版本的设备上,但会发生在2.3.6手机上。)

知道为什么会这样吗?假设这只是模拟器的一个怪癖,或者我是否应该担心它在某些设备上不起作用,这是否合理?任何黑客让它出现?层次结构查看器可能会强制它自己刷新什么?

2 个答案:

答案 0 :(得分:0)

你的意思是“它似乎不是物理设备上的问题”?您的意思是您看到指示符OK,或者指示符在HierarchyViewer中可见吗?

在您的代码中,一切看起来都不错。听起来你的指标只是被另一个视图覆盖 - 也许是ViewPager - 但它存在得很好,因此你可以在HierarchyViewer中看到它。

尝试删除上面的代码以切换可见性,然后将PagerIndicator设置为xml中的View.VISIBLE。如果你仍然看不到它,那就是你的问题。

答案 1 :(得分:0)

Android 2.3.3+中存在涉及ViewGroups可见性的问题。在XML中设置ViewGroupandroid:visibility=X似乎设置了所有子视图的可见性。但是,在运行时更改可见性时,它不会将其应用于子视图。因此,从goneinvisibile的可见性开始将导致稍后设置可见性失败。

解决方案是在我的自定义视图中覆盖setVisibility,以便在其所有子视图中设置可见性:

@Override
public void setVisibility(int visibility) {
    super.setVisibility(visibility);
    for (ImageView image : mImages) {
        image.setVisibility(visibility);
    }
}

感谢http://www.kittehface.com/2011/03/view-visibility-bug-on-android-233.htmlandroid setVisibility does not display if initially set to invisble让我指出正确的方向。