2

空のLinearLayoutを宣言し、onCreateメソッドで、5回繰り返すループを持つ関数を呼び出して、別のレイアウトを膨らませ、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" ); 
}

このアクティビティが初めて作成されると、プログレスバーとテキストビューが適切な値で表示されます。ただし、デバイスを回転させると、TextViewは適切な値で表示されますが、すべてのProgressBarには、最後のProgressBarに対応する進行状況が表示されます。onCreateが最初に呼び出されたときにこれが機能するのに、デバイスが回転した後にonCreateメソッドが呼び出されたときに機能しないのはなぜですか?

すべてのProgressBarが同じ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", integer)、おそらくすべてのプログレスバーが同じキーを持つことになります。

しかし、値がどのように保存されているかに関係なく、これidは各プログレスバーを他のバーから区別するための手段です。どちらがどちらであるかを知るシステムはどのようになっていますか?

プログレスバーの数はカテゴリの数に依存するため、おそらくアクティビティのライフサイクルを自分で処理する必要があります。おそらく、独自のonSaveInstanceState()onRestoreInstanceState()関数を実装して、各カテゴリのパーセンテージを復元する必要があるときにそれらを区別できるように保存できるようにする予定です。

于 2013-01-10T19:25:53.763 に答える