Android:以编程方式在布局中创建用户指定的#进度条

时间:2012-07-07 20:40:10

标签: android android-layout progress-bar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

//this is where I want the progressbars to be.
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

我想以编程方式在布局中创建用户指定数量的进度条,而不必在xml文件中指定它。请帮我解决这个问题。

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

我建议为这些进度条(实际上是任何小部件)放置一个容器

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <LinearLayout 
        android:id="@+id/linBars"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    </LinearLayout>
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

然后在您的代码中,即在您的活动中(基本上您需要访问Context对象)请记住,我为容器提供了id“linBars”。这可以是任何有效的Java标识符(它被放入R.id。)

 //Get the container
 LinearLayout container = (LinearLayout) findViewById(R.id.linBars);


 ProgressBar pbar = new ProgressBar(this);
 //Set any properties for it here (eg setInterpolator etc)
 container.addView(pbar); //ProgressBar and just about any widget is a subclass of View

我建议阅读ViewGroups,这是大多数“添加/删除小部件到容器”代码所在的位置。 LinearLayout是它的子类,你也可以使用其他的,但它可能是一堆ProgressBar实例的最佳选择。

回答您的评论如何参考创建的小部件?

两种方式各有利弊

  • 创建一个列表或数组来保存您的小部件,并在将它们添加到LinearLayout之前或之后将它们添加到列表/数组中。您可以随意引用它们,除非您需要清除OnDestroy中的所有内容并删除对它们的所有引用,否则您的程序将耗尽内存,如果它在其父项被销毁的小部件上调用某些内容,它将会要么什么也不做或爆炸(也就是抛出异常)。
  • ViewGroup实际上允许您访问其下的任何和所有小部件。遗憾的是,您无法保证您检索的窗口小部件的顺序或类型。方法是getChildAt(int index)getChildCount()。请记住,它会返回一个View对象,所以只有当您确定所有孩子都属于某种类型时才能安全地投射它。我给它的SDK链接中描述的另一个警告是,如果你指定的索引中没有子节点,它将返回null。在我们的示例中,我们知道添加的所有视图都是ProgressBar,因此我们可以执行类似下面的操作

获取所有进度条的示例:

  //Get the container
  LinearLayout container = (LinearLayout) findViewById(R.id.linBars);

  ProgressBar pbar;
  for (int i = 0; i < container.getChildCount(); i++) {
      pbar = (ProgressBar) container.getChildAt(i);
      //Do whatever to the progress bar here
  }

我觉得我还必须指出另一个问题。如果用户离开应用程序(即点击主页按钮,接听电话),一段时间后系统决定销毁活动以节省内存,然后用户导航回您的应用程序,进度条将消失,除非您保存信息在Bundle期间OnDestroy重新构建它们,并在OnCreate中检查Bundle中的项目,然后重新添加到linearLayout