ProgressBar 的进度在旋转或调整大小时显示错误

ProgressBar's progress display wrongly when rotated or resized

我正在使用 ProgressBar 来显示在我的应用程序中完成的问题的百分比。

但是我遇到了一个奇怪的问题,当 activity 的 onCreate 的方法再次被调用(旋转、调整大小......)时,ProgressBar 的进度显示变得很奇怪。

我调试了代码,但是一切正常,setMax() 和setProgress() 的值也是正确的。

首次加载:

调整屏幕大小:

我的onCreate方法:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_practice_type_list);

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(this.LAYOUT_INFLATER_SERVICE);

        Bundle b = getIntent().getExtras();
        int practiceType = b.getInt("practiceType");
        int level = b.getInt("level");

        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        ArrayList<BookInfoByTypeModel> bookInfo = databaseAccess.getBookInfoByType(level, practiceType);
        databaseAccess.close();

        ScrollView scrollView = (ScrollView)findViewById(R.id.practice_type_layout_scrollview);
        LinearLayout topParent = new LinearLayout(this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;

        topParent.setLayoutParams(params);
        topParent.setOrientation(LinearLayout.VERTICAL);

        View viewTypeItem;
        TextView tvTypeThumbnail;
        TextView tvTypeName;
        TextView tvTypeCount;
        ProgressBar pbTypeProgressPercent;
        TextView tvTypeProgressText;

        for (int i = 0; i < bookInfo.size(); i++) {
            BookInfoByTypeModel book = bookInfo.get(i);

            viewTypeItem = inflater.inflate(R.layout.type_item, scrollView, false);
            tvTypeThumbnail = (TextView) viewTypeItem.findViewById(R.id.type_thumbnail);
            tvTypeName = (TextView) viewTypeItem.findViewById(R.id.type_name);
            tvTypeCount = (TextView) viewTypeItem.findViewById(R.id.type_count);
            pbTypeProgressPercent = (ProgressBar) viewTypeItem.findViewById(R.id.type_progress_percent);
            tvTypeProgressText = (TextView) viewTypeItem.findViewById(R.id.type_progress_text);

            switch (book.getType()){
                case 0:
                    tvTypeThumbnail.setText("字");
                    tvTypeName.setText("漢字・語彙");
                    break;
                case 1:
                    tvTypeThumbnail.setText("漢");
                    tvTypeName.setText("漢字");
                    break;
                case 2:
                    tvTypeThumbnail.setText("語");
                    tvTypeName.setText("語彙");
                    break;
                case 3:
                    tvTypeThumbnail.setText("文");
                    tvTypeName.setText("文法");
                    break;
                case 4:
                    tvTypeThumbnail.setText("読");
                    tvTypeName.setText("読解");
                    break;
                case 5:
                    tvTypeThumbnail.setText("聴");
                    tvTypeName.setText("聴解");
                    break;
                case 6:
                    tvTypeThumbnail.setText("総");
                    tvTypeName.setText("総合");
                    break;
            }

            tvTypeCount.setText("問題集数:" + book.getBookCount());
            tvTypeProgressText.setText(book.getProgressCount() + "/" + book.getBookCount());
            pbTypeProgressPercent.setMax(book.getBookCount());
            pbTypeProgressPercent.setProgress(book.getProgressCount());
            topParent.addView(viewTypeItem);
        }

        scrollView.addView(topParent);
    }

我做错了什么?

您正在将具有相同 ID 的多个视图填充到布局中。通常视图会自动恢复它们的状态,但在这种情况下,状态会被布局中具有给定 ID 的 "last" 视图覆盖,因此所有视图(具有该特定 ID)最终都会 "restoring" 从它导致保存国家腐败。

onCreate 之后调用的 (super) onRestoreInstanceState 方法中正在恢复状态,这就是您设置的值丢失的原因。

要防止这种行为,请在要添加到布局的视图上使用 setSaveEnabled(false) 禁用状态保存。