【问题标题】:Android center gravity is not working if container layout is in a scrollview如果容器布局在滚动视图中,Android 中心重心不起作用
【发布时间】:2016-03-04 06:52:38
【问题描述】:

我正在创建一个 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
    }
} 

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

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

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

(注意:使用 ScrollView 的原因是下载的数据可能太大而无法容纳小屏幕。这似乎是 ListView 的用例,但还有一些其他原因阻止我使用 ListView。)

【问题讨论】:

  • 即使使用 RelativeLayout 也不起作用。父 ScrollView 是问题所在。
  • 提示:如果你告诉人们不要对这个问题投反对票,他们中的很多人都会这样做。 “请不要投反对票”暗示这个问题可能需要投反对票。无论哪种方式,这只是不属于问题的噪音。我已在此处对其进行了编辑,并以其他方式提高了您问题的清晰度。请不要将其重新添加。对于人们如何决定投票,您无能为力。如果问题有用且清晰,您通常会得到更多的赞成票而不是反对票,这最终会弥补它。也不鼓励在 cmets 中抱怨它。
  • 我从不在我的问题中添加这样的请求。这个问题很特别。我阅读了 20 多个类似的问题。我不希望人们认为它是其中之一。很少有人只是复制代码,还有一些人投反对票 - 防止未来的读者认真对待它。我没有抱怨——我只是害怕我的问题得不到解决,因为人们甚至没有阅读我的问题。
  • 如果您要说“这不是重复的”,那么请说出 which 问题它不是重复的以及 为什么。来自stackoverflow.com/help/how-to-ask "包含没有帮助的相关问题的链接可以帮助其他人了解您的问题与其他问题有何不同。
  • 这个问题是being discussed on meta

标签: android android-layout scrollview layout-gravity android-gravity


【解决方案1】:

在将以下属性设置为我的父 ScrollView 后,我得到了它:

android:fillViewport="true"

【讨论】:

    【解决方案2】:

    你可以有这种结构;

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

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

    【讨论】:

    • 那么,我们不能在 ScrollView 中有一个 ProgressBar 吗?我知道这会起作用,但这无缘无故加深了我的等级制度。
    • @slowAndSteady 我不是 android 专家 :) 但我相信这就是 scollview 的行为方式 :) Scrollview 只是一个窗口,它在滚动时显示其高内容视图的不同部分 :) Contentview 的高度由您提供给它的内容决定 :) 在这种情况下,您只提供一个具有高度和宽度的进度条作为包装内容,因此内容视图的高度 = 进度条高度 :) 所以虽然您的重心可以工作,因为内容视图的高度 =进度条高度不会有任何区别 :) 我希望我从我在 iOS 滚动视图中的经验中得出我的观点是有道理的 :)
    【解决方案3】:

    你可以替换

    linearLayout.setGravity(Gravity.CENTER);
    

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

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 2011-05-02
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多