Неопределенный горизонтальный ProgressBar НИЖЕ ActionBar, используя AppCompat?
Я искал ответы о том, как разместить неопределенную горизонтальную полосу прогресса под панелью действий с помощью AppCompat. Я могу отобразить горизонтальный индикатор выполнения, но он находится в верхней части панели действий. Я хочу, чтобы он находился под / под панелью действий, например, как это делает gmail (кроме как без обновления).
Я использовал следующий код для отображения индикатора выполнения:
supportRequestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main_activity);
setSupportProgressBarIndeterminate(Boolean.TRUE);
setSupportProgressBarVisibility(true);
но это помещает горизонтальный индикатор выполнения в верхней части панели действий. Кто-нибудь знает, как поместить индикатор выполнения ниже панели действий?
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);
}
});
Надеюсь, что это имеет смысл для вас. Удачи!