以编程方式创建的Android ProgressBar(圆圈)在Xoom上不可见(无处不在!)

时间:2013-02-18 19:57:21

标签: java android android-layout android-progressbar android-gui

问题

我有一个奇怪的问题,我无法弄明白,需要一些其他的眼睛来看待。我已经动态创建了一个ProgressBar视图,除了我的Motorola Xoom之外,它还适用于各种设备和AVD。


截图

所有屏幕截图都有它们之上的设备名称,并且从它通过ADT获得的任何内容减少了大约50%,除了Nexus 10,因为它的超高分辨率是25%。添加了ProgressBar的红色背景以用于调试目的,以显示视图在那里并且可见。我添加了左边和顶部填充以使其居中。

下面的屏幕截图从Xoom开始,它不起作用,其次是Nexus 10(AVD),Nexus 7,Galaxy Nexus和HTC Droid Incredible,展示它在其他地方工作。在镜头之后,我将添加我的代码。

摩托罗拉Xoom不工作

进度条无效!但请注意视图是可见的(我们看到红色背景)。

Motorola Xoom

在其他设备上正常工作

在所有这些设备上都可以看到圈子进度。

模拟Samsung Nexus 10

Simulated Samsung Nexus 10

华硕Nexus 7

ASUS Nexus 7

三星Galaxy Nexus

Samsung Galaxy Nexus

HTC Droid难以置信

HTC Droid Incredible


现在代码

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

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

mDiscoverList是最终显示的列表视图。 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);
        }
    });

所以除了摩托罗拉Xoom之外,一切都像冠军一样!?我将不胜感激任何见解或建议,以帮助解决这个问题。如果我应该提供任何其他信息,请告诉我。

  

非常感谢!

*附录:一个奇怪的事情可能不是很相关,但以防万一:如果我将ProgressBar宽度设置为match_parent(并且不添加宽度填充)它也可以在其他地方工作但是然后在Xoom上确实显示但是因为它被拉伸到宽度(仅限xoom)而被扭曲。

1 个答案:

答案 0 :(得分: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.LayoutParams是您导入的版本,因为在这种情况下您的父级是RelativeLayout。

我无法真正告诉你是什么导致填充在Xoom上出错,但这是另一种方法,你可以将ProgressBar放到中心,这似乎不受任何导致在xoom上发布。