Android 如果容器布局在滚动视图中,则重心不起作用

Android center gravity is not working if container layout is in a scrollview

我正在创建一个放置在 LinearLayout 垂直中心的 ProgressBar(其他布局不起作用;我需要使用 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
    }
} 

如果我用 LinearLayout 扩展 ContainerView,一切正常。

如果我用 ScrollView 扩展 ContainerView,ProgressBar 会水平居中而不是垂直居中。

这种双重行为背后的原因是什么?我的目标是在下载某些数据期间显示 ProgressBar;下载数据后,我需要在 LinearLayout 中显示它。

(注意:使用ScrollView的原因是下载的数据可能太大而无法适应小屏幕。这看起来像是ListView的用例,但还有一些其他原因阻止我使用ListView .)

你可以有这样的结构;

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

最初您的 ProgressBar 是不可见的,但是一旦开始下载,您就可以将其设置为可见状态。我们可以使用 centerInParent 作为 ProgressBar,因为我们有 RelativeLayout.

你可以直接替换

linearLayout.setGravity(Gravity.CENTER);

linearLayout.setGravity(Gravity.CENTER | Gravity.TOP);

我在为我的父 ScrollView 设置了以下属性后它开始工作了:

android:fillViewport="true"