在运行时更改添加的 ProgressBar 的宽度

8

我正在从代码中构建UI,可以成功地添加ProgressBar小部件,但是我无法将小部件的尺寸更改为我需要的值,它始终保持默认大小(约50dp)。我已经尝试了以下代码;

    ProgressBar progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal);
    progressBar.setMinimumHeight(20);
    progressBar.setMinimumWidth(100);

我也尝试过设置progressBar的LayoutParams,但仍然没有效果。我还尝试将小部件包装在另一个布局中,但仍然没有成功。
有人可以帮忙吗?我看不出该怎么做。如果有使用XML的解决方案,那么它可能有效,但我必须在运行时设置尺寸和位置。
对于进度条的XML,我使用了以下代码。
<ProgressBar
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent"
      android:layout_height="10dp"
      android:indeterminateOnly="false"
      android:progressDrawable="@android:drawable/progress_horizontal"
      android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
      android:maxWidth="1000dp"
   />

然后,解压它的代码如下。这是我们讨论的内容的混合体。
    LayoutInflater layoutInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ProgressBar progressBar = (ProgressBar)layoutInflater.inflate(R.layout.progress_bar, null);
    progressBar.setMinimumHeight(10);
    progressBar.setMinimumWidth(200);
    progressBar.setLayoutParams(new RelativeLayout.LayoutParams(200, 10);

    progressBar.setMax(100);
    progressBar.setProgress(getScrollBarValue());
    progressBar.setIndeterminate(isIndeterminate());
    progressBar.getLayoutParams().width = 200;
    progressBar.invalidate();

我猜解决方案是复制小部件的源代码并实现缺失的方法。这似乎是一个疯狂的解决方案,肯定有更好的方法。 - Snowwire
只是确认一下:您要寻找的是条形样式,而不是旋转器样式吗?找出样式/形状定义的位置并复制和调整它们可能就足够了。 - sstn
3个回答

9

R.layout.activity包含以下内容:

<ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:visibility="visible"
        style="@android:style/Widget.ProgressBar.Large.Inverse"
/>

然后是代码:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    ProgressBar bar = (ProgressBar)findViewById(R.id.progress);
    bar.getLayoutParams().height = 500;
    bar.invalidate();
}

调用invalidate()方法非常重要,因为这时视图会重新绘制以考虑到更改。虽然不直观,但它可以通过批处理更改来提高性能。


我尝试了你建议的方法,但对大小没有任何影响。 - Snowwire
我详细说明了你需要使用的两种方法,仅调用其中一种是行不通的。我刚刚使用这段代码构建了一个测试活动,并使用ProgressBar进行了测试,结果很好。因此,我建议你确保a)正在执行你编写的代码,b)代码正在对正确的进度条进行大小调整。我已更新我的答案以包含该代码。 - Ollie C
我现在正在工作,所以今晚要试一下。等我试完后会告诉你。 - Snowwire
我可以确认这个不起作用 - 至少在2.1版本的bar样式上不行 - spinner样式是可调整大小的。除此之外,在onCreate()中调用invalidate()是不必要的 - 你想要在哪个视图中进行无效化? - sstn
终于搞定了。我使用了一个包含LinearLayout和ProgressBar子元素的布局XML的组合来实现它。然后在运行时进行了填充,并使用progressBar.getLayoutParams().width=200来获取宽度。invalidate调用是不必要的。这是在运行2.2的Nexus One上完成的。我还需要在其他平台上进行测试。感谢大家的帮助,正是你们的帖子让我成功了。 - Snowwire
显示剩余4条评论

0

还有minWidth/minHeight/maxWidth/maxHeight参数,但是(我认为)它们只能通过XML或样式/主题进行设置。

否则,您可以从XML中填充ProgressBar视图。


我尝试了你建议的方法,我可以改变小部件的高度,但无法改变宽度。据我所知,最大和最小宽度属性必须相同才能生效。最大尺寸属性不能在运行时更改,因为它没有暴露出来。 - Snowwire
你的进度条是哪个方向的?通常情况下,进度条方向上的大小应该由布局来确定。 - sstn
这不是真的,你可以在代码中设置参数,使用LayoutParams。 - Ollie C
@Ollie 我的意思是大小将由布局派生/确定。在代码中使用XML或LayoutParams是一样的,基本上是这样。或者我误解了你的意思? - sstn

0

那么,您需要为进度条定义自己的样式:

<style name="SmallProgressBar" parent="android:Widget.ProgressBar">
    <item name="android:minHeight">10dip</item>
    <item name="android:maxHeight">35dip</item>
</style>

在这里,您可以设置进度条的最小和最大高度和宽度以及其他酷炫功能。

现在,您可以在xml布局样式中进行设置:

<ProgressBar
    android:id="@+id/custom_edit_text_progress_bar"
    style="@style/SmallProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentTop="true"
    android:visibility="visible"/>

当你填充进度条时,你

getLayoutParams().height = 25

getLayoutParams().width = 25

用于进度条的设置高度和宽度。

注意: 不能超出您在样式中定义的高度和宽度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接