2

我声明了一个空的 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 的规则。

4

1 回答 1

1

onCreate和旋转事件之间的区别在于,在onCreate您连续膨胀只有 1 个进度条的视图。当您调用时view.findViewById( R.id.progressBar );,只能找到 1 个可能的进度条。然后将其值设置为 percentComplete。

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

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

但不管值是如何存储的,这id都是将每个进度条与其他进度条分开的方法。系统如何知道哪个是哪个?

由于进度条的数量取决于类别的数量,您可能必须自己处理活动生命周期。可能会实现您自己的onSaveInstanceState()onRestoreInstanceState()功能,以便您可以存储每个类别百分比,以便您可以在需要恢复它们时告诉它们。

于 2013-01-10T19:25:53.763 回答