为什么ProgressBar的id必须是唯一的?

时间:2013-01-10 17:23:55

标签: android android-progressbar layout-inflater

我声明了一个空的LinearLayout,在我的onCreate方法中,我调用了一个函数,该函数有一个循环,重复五次以膨胀另一个布局并将其添加到我的LinearLayout。

private void setupList() {
    LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout itemList = (LinearLayout) findViewById( R.id.itemList );
    itemList.removeAllViews();
    for ( Category category :: categories ) {
        View rowView = layoutInflater.inflate(R.layout.category_row, null);
        initializeRow( rowView, category.percentComplete );
        itemList.addView( rowView );
    }
}

然后在我的initializeRow方法中,我初始化了一个我刚刚膨胀的视图中的TextView和ProgressBar。

private void initializeRow( final View view, final int percentComplete ) {
    TextView topicView = ((TextView) view.findViewById(R.id.topic));
    topicView.setText( category.title );

    ProgressBar progressBar = (ProgressBar) view.findViewById( R.id.progressBar );
    progressBar.setMax( 100 );
    progressBar.setProgress( percentComplete );

    TextView textView = (TextView) view.findViewById( R.id.progressText );
    textView.setText( percentComplete "% Complete" ); 
}

第一次创建此活动时,将显示具有正确值的进度条和文本视图。但是,如果我旋转设备,TextViews将显示正确的值,但所有ProgressBars都会显示与上一个ProgressBar对应的进度。为什么在最初调用onCreate时这是有效的,而在设备旋转后调用onCreate方法时却没有?

我意识到所有ProgressBars都具有相同的ID。但是在我的代码中,我通过使用我膨胀的视图的findViewById来获取对特定ProgressBar的引用。我通过调用

为每个ProgressBar提供了一个唯一的ID,从而实现了这个目的
    progressBar.setId( progressBarIds[ position ] );

在我的initializeRow方法中。我很好奇,如果这个行为是ProgressBar中的一些错误的结果,或者是否有一些关于我不理解的layoutInflaters或ProgressBars的规则。

1 个答案:

答案 0 :(得分:1)

onCreate与轮换事件之间的差异在于onCreate中您只能对只有1个进度条的视图进行实际膨胀。当您致电view.findViewById( R.id.progressBar );时,只能找到1个可以找到的进度条。然后将其值设置为percentComplete。

当您旋转手机时,Android会销毁并创建活动。然后它还尝试恢复活动的控件/视图的值。它将视图的值和ID保存在一个包中,然后尝试从那里恢复它们。我怀疑由于所有进度条都具有相同的id,因此从bundle中读取值时,只有该id赋值。即对于每个控件,它检查其id,并尝试在bundle中找到相应的值。因为它们都具有相同的id,所以它们都具有相同的值。

请考虑这是保存到捆绑包的代码:bundle。putInt(“valueKey”,整数),可能所有进度条最终都具有相同的密钥。

但无论价值是如何存储的,id都是告诉每个进度条appart与其他人的关系。系统如何知道哪一个是哪个?

由于进度条的数量取决于类别的数量,因此您可能需要自己处理activity lifecycle。可能会实现您自己的onSaveInstanceState()onRestoreInstanceState()函数,以便您可以在需要还原它们时告诉它们appart的方式存储每个类别百分比。