2013-01-10 3 views
2

필자의 onCreate 메소드에서 5 번 반복되는 루프가있는 함수를 호출하여 다른 레이아웃을 부 풀린 다음 LinearLayout에 추가하는 빈 LinearLayout을 선언했습니다.ProgressBar의 고유 ID가 필요한 이유는 무엇입니까?

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에 대한 참조를 얻고 있습니다. 내 initializeRow 메서드에서

progressBar.setId(progressBarIds[ position ]); 

을 호출하여 각 ProgressBar에 고유 한 ID를 부여하여이 작업을 수행 할 수있었습니다. 이 동작이 ProgressBar의 버그의 결과인지 또는 내가 이해하지 못하는 layoutInflaters 또는 ProgressBars에 대한 규칙이 있는지 궁금합니다.

답변

1

onCreate과의 차이점은 onCreate에서 1 개의 진행 표시 줄 만있는보기를 비약적으로 확장한다는 것입니다. view.findViewById(R.id.progressBar);으로 전화하면 발견 할 수있는 진행 바가 하나 밖에 없습니다. 그런 다음 값을 percentComplete로 설정합니다.

휴대 전화를 회전하면 Android가 활동을 파괴하고 만듭니다. 또한 활동의 ​​제어 /보기 값을 복원하려고 시도합니다. 뷰의 값과 ID를 번들에 저장 한 다음 뷰에서 값을 복원하려고 시도합니다. 나는 모든 progressbars가 동일한 id를 가지고 있기 때문에, 번들에서 값을 읽을 때 그 id에 할당 된 값만있는 것으로 의심된다. 나는. 모든 컨트롤에 대해 ID를 확인하고 번들에서 해당 값을 찾으려고 시도합니다. 그들 모두가 같은 id를 갖기 때문에, 모두 같은 값을 얻습니다.

번들에 저장하는 코드는 다음과 같습니다. 번들. putInt ("valueKey", 정수), 아마도 모든 진행 막대가 결국 동일한 키를 갖게됩니다.

값을 저장하는 방법에 관계없이 id은 각 진행률 표시 줄에 다른 값을 표시하는 것을 의미합니다. 어떤 시스템이 시스템을 어떻게 알 수 있습니까?

진행률 막대의 수가 항목 수에 따라 다르므로 activity lifecycle을 직접 처리해야합니다. 아마도 자신의 onSaveInstanceState()onRestoreInstanceState() 기능을 구현하여 각 범주 백분율을 복원해야 할 때이를 알려주는 방식으로 저장할 수 있습니다.

관련 문제