5

问题

我有一个奇怪的问题,我无法弄清楚,需要一些其他的眼睛来看看。我已经动态创建了一个 ProgressBar 视图,它可以在各种设备和 AVD 上运行,除了我的 Motorola Xoom。


截图

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

下面的屏幕截图从 Xoom 开始,它无法工作,然后是 Nexus 10 (AVD)、Nexus 7、Galaxy Nexus 和 HTC Droid Incredible,展示了它在其他任何地方都能正常工作。拍摄后,我将添加我的代码。

摩托罗拉 Xoom 不工作

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

摩托罗拉 Xoom

在其他设备上正常工作

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

模拟三星 Nexus 10

模拟三星 Nexus 10

华硕 Nexus 7

华硕 Nexus 7

三星 Galaxy Nexus

三星 Galaxy Nexus

HTC Droid 难以置信

HTC Droid 难以置信


现在代码

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

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

mDiscoverList 是最终显示的列表视图。ProgressBar 被加载在它上面,直到列表被加载。

现在创建并设置进度条。我在GlobalLayout 上设置了填充,否则对象的宽度和高度为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)。

4

1 回答 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.LayoutParams是您导入的那个,因为在这种情况下您的父级是一个 RelativeLayout。

我无法真正告诉您是什么导致 Xoom 上的填充出现错误,但这是您可以将 ProgressBar 置于中心的另一种方式,这似乎不受导致问题的任何错误的影响xoom。

于 2013-02-18T21:23:55.783 回答