问题
我遇到一个奇怪的问题,我无法弄清楚,需要其他眼睛才能看到。我已经动态创建了一个ProgressBar View ,除了Motorola Xoom之外,它还可以在多种设备和AVD上运行。
屏幕截图
除了Nexus 10的25%的超高分辨率外,所有屏幕截图的设备名称均在其上方,并且比通过ADT抓取的内容减少了约50%。为调试目的添加了ProgressBar的红色背景,以显示该 View 在那里并且可见。我添加了左侧和顶部填充以使其居中。
下面的屏幕快照从Xoom无法使用开始,然后是Nexus 10(AVD),Nexus 7,Galaxy Nexus和HTC Droid Incredible,表明它在其他地方都可以使用。拍摄后,我将添加我的代码。
摩托罗拉Xoom无法正常工作
进度栏不起作用!但是请注意,该 View 是可见的(我们看到红色背景)。
在其他设备上正常工作
在所有这些设备上都可以看到圈子进度。
模拟三星Nexus 10
华硕Nexus 7
三星Galaxy Nexus
HTC Droid Incredible
现在的代码
这将创建包含它的父 View :
RelativeLayout discoverListLayout = new RelativeLayout(mContext);
discoverListLayout.setLayoutParams(params);
discoverListLayout.addView(mDiscoverList);
mDiscoverList是最终显示的 ListView 。 ProgressBar将被加载在其顶部,直到列表被加载。现在创建并设置进度条。我将填充设置为onGlobalLayout,因为否则对象的宽度和高度为0。
mDiscoverLoading = new ProgressBar(mContext);
params.height = ViewPager.LayoutParams.WRAP_CONTENT;
params.width = ViewPager.LayoutParams.WRAP_CONTENT;
mDiscoverLoading.setLayoutParams(params);
mDiscoverLoading.setIndeterminate(true);
discoverListLayout.addView(mDiscoverLoading);
ViewTreeObserver vto = mDiscoverLoading.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
if (mDiscoverList.getCount() > 0) {
processLoadedList(true);
} else {
mDiscoverLoading.setBackgroundColor(getActivity().getResources().getColor(R.color.stitchoid_red));
mDiscoverLoading.setPadding((getView().getWidth() / 2) - (mDiscoverLoading.getWidth() / 2),(getView().getHeight() / 2) - (mDiscoverLoading.getHeight()), 0, 0);
}
ViewTreeObserver obs = mDiscoverLoading.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
因此,除了在Motorola Xoom上,一切都像冠军一样吗?对于能帮助解决此问题的任何见解或建议,我将不胜感激。请让我知道是否需要提供其他信息。*附录:一个奇怪的注意事项,可能不太相关,但以防万一:如果我将ProgressBar的宽度设置为match_parent(并且不添加宽度填充),它也可以在其他任何地方使用,但是在Xoom上确实可以显示,但是在拉伸(stretch)到一定宽度时会变形(仅适用于xoom)。
最佳答案
老实说,我不知道如何或为什么会有所作为。
但是,请尝试使用RelativeLayout.CENTER_IN_PARENT使ProgressBar进入屏幕中心,而不是手动将顶部和左侧填充设置为屏幕大小的一半。
因此,而不是:
mDiscoverLoading.setPadding((getView().getWidth() / 2) - (mDiscoverLoading.getWidth() / 2),(getView().getHeight() / 2) - (mDiscoverLoading.getHeight()), 0, 0);
用
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
mDiscoverLoading.setLayoutParams(lp);
请注意,LayoutParams对象有多个不同的“版本”,您将要确保
RelativeLayout.LayoutParams
是您导入的,因为在这种情况下,您的父级是RelativeLayout。我无法真正告诉您是什么导致Xoom上的填充发生错误,但这是将ProgressBar置于中心的另一种方法,它似乎不受任何导致该问题的错误的影响。 Xoom。