我声明了一个空的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的规则。
答案 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的方式存储每个类别百分比。