Прогресс ProgressBar неправильно отображается при повороте или изменении размера - PullRequest
0 голосов
/ 24 сентября 2018

Я использую ProgressBar, чтобы отобразить процент вопросов, заданных в моем приложении.

Однако я сталкиваюсь со странной проблемой, когда метод действия onCreate снова вызывается (вращается, изменяет размер ..), отображение прогресса ProgressBar становится очень странным.

Я отлаживаю код, но все в порядке, значения setMax () и setProgress () также верны.

Первая загрузка:

enter image description here

Экран изменения размера:

enter image description here

Мой 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);
    }

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы накачиваете несколько видов с одним и тем же идентификатором в макет.Обычно представления автоматически восстанавливают свое состояние, но в этом случае состояние переопределяется «последним» представлением с заданным идентификатором в макете, поэтому все представления (с этим конкретным идентификатором) в конечном итоге «восстанавливаются» из него, что вызывает повреждение состояния сохранения.

Восстановление состояния происходит в (супер) onRestoreInstanceState методе, который вызывается после onCreate, поэтому установленные вами значения теряются.

Для предотвращения такого поведения отключите сохранение состояния с помощью setSaveEnabled(false) на представлениях, которые вы добавляете в макет.

...