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

Gee*_*ugs 5 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不工作

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

摩托罗拉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);
Run Code Online (Sandbox Code Playgroud)

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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你!

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

Foa*_*Guy 6

老实说,我不知道它会如何或为何有所作为.

但是尝试使用RelativeLayout.CENTER_IN_PARENT将ProgressBar放入屏幕的中心,而不是手动将顶部和左侧填充设置为屏幕大小的一半.

所以代替:

mDiscoverLoading.setPadding((getView().getWidth() / 2) - (mDiscoverLoading.getWidth() / 2),(getView().getHeight() / 2) - (mDiscoverLoading.getHeight()), 0, 0);
Run Code Online (Sandbox Code Playgroud)

使用

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
mDiscoverLoading.setLayoutParams(lp); 
Run Code Online (Sandbox Code Playgroud)

请注意,LayoutParams对象有几个不同的"版本",您需要确保这RelativeLayout.LayoutParams是您导入的那个,因为在这种情况下,您的父级是RelativeLayout.

我无法真正告诉你是什么导致填充在Xoom上出现错误,但这是另一种方法,你可以将ProgressBar放到中心,这似乎不会受到导致问题的任何错误的影响. XOOM.

  • 顺便说一句,这不是像GlobalLayout事件那样多的错误.在我尝试此修复之前,我在全局布局事件之外尝试了填充,并且在Xoom上工作正常.在此修复程序出现之前,我将弄清楚如何有条件地测试Xoom并为Xoom添加硬编码填充量,并使用备用处理.但这照顾了一切.FWIW我在尝试相对布局参数之前尝试了params.gravity = Gravity.CENTER,但是没有用.谢谢了. (2认同)