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

Posted

技术标签:

【中文标题】更改在运行时添加的 ProgressBar 的宽度【英文标题】:Change the width of a ProgressBar added at runtime 【发布时间】:2011-06-27 20:11:49 【问题描述】:

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

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

我也尝试过设置 progressBar LayoutParams 但又没有,我尝试将小部件包装在另一个布局中,但仍然没有运气。

谁能帮忙,因为我不知道该怎么做?如果有使用 XML 的解决方案,它可以工作,但我必须在运行时设置维度和位置。


对于 Progress XML,我使用了以下内容。

<ProgressBar
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_
      android:layout_
      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();

【问题讨论】:

我想一个解决方案是复制小部件的源代码并实现缺少的方法。似乎是一个疯狂的解决方案,一定有办法做到这一点。 只是为了确认一下:您正在寻找的是酒吧风格,而不是微调风格?找出样式/形状的定义位置并复制和调整它们可能就足够了。 【参考方案1】:

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

<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_
    android:layout_
    android:layout_alignParentEnd="true"
    android:layout_alignParentTop="true"
    android:visibility="visible"/>

当你给进度条充气时,你

getLayoutParams().height = 25

getLayoutParams().width = 25

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

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

【讨论】:

【参考方案2】:

R.layout.activity 包括:

<ProgressBar
        android:id="@+id/progress"
        android:layout_
        android:layout_
        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() 方法的调用很重要,因为在重绘视图以将更改考虑在内时。虽然不直观,但它确实可以通过批量更改获得更好的性能。

【讨论】:

我试过你建议的方法,但对尺寸没有任何影响。 我详细介绍了两种你需要使用的方法,单独调用一个是行不通的。我刚刚使用此代码和 ProgressBar 构建了一个测试活动,它工作正常。因此,我建议您确保 a) 您编写的代码正在执行,并且 b) 代码正在对正确的进度条进行大小调整。我已经更新了答案以包含代码。 我还没有机会尝试您的代码,但是我完全在代码中定义了布局。所以我创建了一个RelativeLayout,然后添加了一个ProgressBar 的子视图。然后使用 setContentView 添加RelativeLayout。没有layout.xml 这不应该有任何区别,XML 保存在内存中的对象、类型和结构完全相同,就像您在代码中创建它一样。您可能正在设置(或未设置)与更改大小的代码冲突的属性 - 请尝试完全按照我的示例设置属性。 我看到你添加了你的代码。我的工作和你的工作还没有,所以我认为你需要查看两段代码之间的每一个差异,并缩小到底有什么冲突。我注意到您已将 layout_width 设置为 fill_parent - 这肯定与您设置宽度相冲突,因为一个会优先于另一个。【参考方案3】:

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

否则,您可以从 XML 扩展 ProgressBar 视图。

【讨论】:

我尝试了你的建议,我可以改变小部件的高度,但不能改变宽度。据我所知,最大和最小宽度属性必须相同才能使尺寸生效。最大尺寸属性不能在运行时更改,它不会暴露。 你的ProgressBar是哪个方向的?进度条方向的大小通常由布局决定。 这个不对,可以在代码中设置参数,使用LayoutParams @Ollie 我的意思是尺寸将由布局派生/确定。在代码中使用 XML 或 LayoutParams 基本上是相同的。还是我误会了你?

以上是关于更改在运行时添加的 ProgressBar 的宽度的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 从另一个 Widget 更改容器宽度

Crystal Report 允许用户在运行时更改列的宽度

在运行时更改使用 Three.js 创建的 3D Cube 的宽度/高度/长度

增加由progressbar.js 创建的饼图的大小(宽度和高度)

大数据表添加scroll-x并更改页面宽度

增加progressbar.js创建的饼图(宽度和高度)的大小