Неопределенный горизонтальный ProgressBar НИЖЕ ActionBar с использованием AppCompat?

Я искал ответы о том, как разместить неопределенный горизонтальный индикатор выполнения под панелью действий с помощью AppCompat. Я могу отобразить горизонтальный индикатор выполнения, но он находится в верхней части панели действий. Я хочу, чтобы он находился под / под панелью действий, как это делает gmail (за исключением того, что не нужно обновлять).

Я использовал следующий код, чтобы появился индикатор выполнения:

supportRequestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main_activity);
setSupportProgressBarIndeterminate(Boolean.TRUE);
setSupportProgressBarVisibility(true);

но это помещает горизонтальную полосу выполнения в верхнюю часть панели действий. Кто-нибудь знает, как разместить индикатор выполнения под панелью действий?


person user2382843    schedule 06.02.2014    source источник
comment
Существует обходной путь, предложенный: stackoverflow.com/ вопросов/13934010/, но это решение в значительной степени противоречит самой цели использования AppCompat. Кто-нибудь может расположить индикатор выполнения под панелью действий с помощью AppCompat?   -  person user2382843    schedule 07.02.2014
comment
Невероятно, как такая распространенная проблема не имеет простого решения...   -  person SpaceMonkey    schedule 18.07.2015


Ответы (1)


Недавно я столкнулся с подобной проблемой и решил ее, создав свой собственный индикатор выполнения, а затем выровняв его, манипулируя 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);
        }
    });

Надеюсь, это имеет смысл для вас. Удачи!

person zoltish    schedule 11.04.2014