编辑:经过更多调查后发现,这与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手机上。)
知道为什么会这样吗?假设这只是模拟器的一个怪癖,或者我是否应该担心它在某些设备上不起作用,这是否合理?任何黑客让它出现?层次结构查看器可能会强制它自己刷新什么?
答案 0 :(得分:0)
你的意思是“它似乎不是物理设备上的问题”?您的意思是您看到指示符OK,或者指示符在HierarchyViewer中可见吗?
在您的代码中,一切看起来都不错。听起来你的指标只是被另一个视图覆盖 - 也许是ViewPager - 但它存在得很好,因此你可以在HierarchyViewer中看到它。
尝试删除上面的代码以切换可见性,然后将PagerIndicator设置为xml中的View.VISIBLE
。如果你仍然看不到它,那就是你的问题。
答案 1 :(得分:0)
Android 2.3.3+中存在涉及ViewGroups
可见性的问题。在XML中设置ViewGroup
和android:visibility=X
似乎设置了所有子视图的可见性。但是,在运行时更改可见性时,它不会将其应用于子视图。因此,从gone
或invisibile
的可见性开始将导致稍后设置可见性失败。
解决方案是在我的自定义视图中覆盖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.html和android setVisibility does not display if initially set to invisble让我指出正确的方向。