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);