Android центр тяжести не работает, если макет контейнера находится в виде прокрутки

Я создаю ProgressBar для размещения в вертикальном центре LinearLayout (другие макеты не будут работать; мне нужно использовать LinearLayout). Вот некоторый код:

LinearLayout linearLayout = new LinearLayout(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT);
linearLayout.setLayoutParams(layoutParams);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setGravity(Gravity.CENTER);

//add progressbar
ProgressBar progressBar = new ProgressBar(context);
progressBar.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT));
linearLayout.addView(progressBar);

У меня есть ContainerView, который будет содержать LinearLayout, созданный выше. Что-то вроде этого:

public class ContainerView extends ScrollView {
    public ContainerView(Context context) {
        super(context);
        initView(context);
    }

    private void initView(Context context){
        addView(linearLayout);     //which is created in the snippet above
    }
} 

Если я расширяю ContainerView с LinearLayout, все работает нормально.

Если я расширяю ContainerView с ScrollView, ProgressBar центрируется по горизонтали, но не по вертикали.

В чем причина этого двойного поведения? Моя цель - показать ProgressBar во время загрузки некоторых данных; как только данные загружены, мне нужно показать их в LinearLayout.

(Примечание. Причиной использования ScrollView является то, что загружаемые данные могут быть слишком большими, чтобы уместиться на маленьком экране. Это может показаться примером использования ListView, но есть и другие причины, которые мешают мне использовать ListView.)

3 ответа

Решение

Я получил его после установки следующего атрибута для моего родительского ScrollView:

android:fillViewport="true"

Вы можете иметь такую ​​структуру;

<RelativeLayout>
 <ProgressBar/>      
  <ScrollView>
   <LinearLayout>
    ..
   </LinearLayout>
  </ScrollView>
</RelativeLayout>

Изначально ваш ProgressBar будет невидимым, но как только ваша загрузка начнется, вы можете установить его в видимое состояние. И мы можем использовать centerInParent за ProgressBar как у нас RelativeLayout,

Вы можете просто заменить

linearLayout.setGravity(Gravity.CENTER);

с

linearLayout.setGravity(Gravity.CENTER | Gravity.TOP);
Другие вопросы по тегам