在Xoom上编程创建的Android ProgressBar(圆形)不可见(在其他地方都可以工作!)

5

问题

我遇到了一个奇怪的问题,无法解决,需要其他人帮忙看一下。我已经动态创建了一个ProgressBar视图,在各种设备和AVD上都可以工作,除了我的Motorola Xoom。


屏幕截图

所有的屏幕截图上方都有设备名称,并且与ADT抓取的内容相比缩小了约50%,除了Nexus 10,因为它具有超高分辨率,所以只缩小了25%。ProgressBar的红色背景是为了调试目的而添加的,以显示视图是否可见。我添加了左侧和顶部填充以使其居中。

以下是从不起作用的Xoom开始,然后是演示在其他所有设备上都正常工作的Nexus 10(AVD),Nexus 7,Galaxy Nexus和HTC Droid Incredible的屏幕截图。在截图之后,我会添加我的代码。

Motorola Xoom不能工作

进度条不起作用!但请注意视图可见(我们看到了红色背景)。

Motorola Xoom

其他设备上正常工作

所有这些设备上都可以看到圆形进度。

模拟的三星Nexus 10

Simulated Samsung Nexus 10

ASUS Nexus 7

ASUS Nexus 7

Samsung Galaxy Nexus

Samsung Galaxy Nexus

HTC Droid Incredible

HTC Droid Incredible


现在是代码

这将创建包含它的父视图:

    RelativeLayout discoverListLayout = new RelativeLayout(mContext);
    discoverListLayout.setLayoutParams(params);
    discoverListLayout.addView(mDiscoverList);

mDiscoverList是最终显示的列表视图。在列表加载完之前,ProgressBar会显示在其上方。

现在创建并设置进度条。我在onGlobalLayout中设置了padding,因为否则对象的宽度和高度都为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);
        }
    });

所以除了摩托罗拉Xoom之外,一切都像冠军一样运作? 我将非常感激任何有关解决此问题的见解或建议。 如果需要提供任何其他信息,请告诉我。
谢谢!
*补充说明:值得注意的奇怪事情(可能不太相关,但以防万一):如果我将ProgressBar宽度设置为match_parent(并且不添加宽度填充),则它在其他所有地方也可以工作,但在Xoom上它会显示但会失真,因为它被拉伸到宽度(仅限于Xoom)。
1个回答

6

我真的不知道为什么这样做会有所区别。

但是尝试使用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,因此您需要确保导入RelativeLayout.LayoutParams
我无法确定是什么原因导致Xoom上填充出现故障,但这是另一种将ProgressBar居中的方法,似乎不受导致Xoom上出现问题的任何错误影响。

好的,是的,这个方法有效了,但我也说不清为什么。或者更准确地说,我说不出为什么其他方法不起作用。这一定是魔法!:) 谢谢你的所有帮助。 - Geeks On Hugs
2
顺便说一句,有问题的不是填充,而是GlobalLayout事件。在尝试这个修复方法之前,我尝试了全局布局事件之外的填充,这在Xoom上运行良好。在这个修复方法出现之前,我打算想办法有条件地测试Xoom,并为Xoom放入一个硬编码填充量,并对其余部分使用备用处理方式。但这一切都被解决了。顺便说一下,在尝试相对布局参数之前,我尝试了params.gravity = Gravity.CENTER,但那样做并没有起作用。再次感谢。 - Geeks On Hugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接