使用AppCompat时如何在ActionBar下方显示不确定的水平进度条?

8
我一直在寻找有关如何使用AppCompat将不确定的水平进度条放置在操作栏下方的答案。我能够让水平进度条出现,但它位于操作栏顶部。我希望它在操作栏下面,就像Gmail那样(除了下拉刷新)。我使用以下代码使进度条出现:
supportRequestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main_activity);
setSupportProgressBarIndeterminate(Boolean.TRUE);
setSupportProgressBarVisibility(true);

但这样会将水平进度条放置在操作栏的顶部。有没有人知道如何将进度条放置在操作栏下方?


1
有一个解决方案是建议使用:https://dev59.com/T2Yr5IYBdhLWcg3wIG1u#15073680,但这个解决方案基本上打败了尝试使用AppCompat的整个目的。是否有人能够使用AppCompat将进度条定位在操作栏下面? - user2382843
难以置信,这样一个常见的问题竟然没有简单的解决方案…… - SpaceMonkey
1个回答

5

最近我遇到了类似的问题,通过创建自己的进度条并通过操作内容视图的getTop()来对齐解决了这个问题。

首先创建你自己的进度条。

final LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, 20); //Use dp resources


mLoadingProgressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
mLoadingProgressBar.setIndeterminate(true);
mLoadingProgressBar.setLayoutParams(lp);

将其添加到窗口(装饰视图)中。
final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
decor.addView(mLoadingProgressBar);

为了将其放置在正确的位置,我使用了一个ViewTreeObserver,它监听视图是否已经被放置(也就是 View.getTop() 不是 0)。

final ViewTreeObserver vto = decor.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        final View content = getView(android.R.id.content);

        @Override
        public void onGlobalLayout() {
            int top = content.getTop();

            //Dont do anything until getTop has a value above 0.
            if (top == 0)
                return;

            //I use ActionBar Overlay in some Activities, 
            //in those cases it's size has to be accounted for
            //Otherwise the progressbar will show up at the top of it
            //rather than under. 

            if (getSherlock().hasFeature((int) Window.FEATURE_ACTION_BAR_OVERLAY)) {
                top += getSupportActionBar().getHeight();
            }

            //Remove the listener, we dont need it anymore.
            Utils.removeOnGlobalLayoutListener(decor, this);

            //View.setY() if you're using API 11+, 
            //I use NineOldAndroids to support older 
            ViewHelper.setY(mLoadingProgressBar, top);
        }
    });

希望这对您有所帮助。祝您好运!

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