View
メソッドが含まれていますsetId(int)
。私の質問は、どのリソースIDと重複しないIDをプログラムでオブジェクトに提供するかということR
です。
1 に答える
ドキュメントによると、 APIレベル17でView.generateViewId()
追加すると、での使用に適した値が生成されますsetId(int)
。この値は、ビルド時にaaptforによって生成されたID値と衝突しませんR.id
。
View.generateViewId()
私はそれがどのように動作するかを調べるために実験しました。これが私の発見です。
- 生成されたIDは1から始まり、呼び出されるたびに増分されます(1、2、3 ...)
generateViewId()
最後に返されたIDを維持し、アプリのライフサイクル全体を通じてそこから継続します。たとえば、デバイスローテーション前の最後のIDが4だった場合、ローテーション後の次のIDは5になります。
onCreate()
たとえば、実行時にアプリのメソッドでビューをgenerateViewId()
毎回呼び出すことで設定している場合、デバイスが回転した後、デフォルトonCreate()
で再度呼び出され、ビューは回転前とは異なるIDを受け取ることに注意してください。
Androidには、デバイスのローテーション後にビューの状態(たとえば、EditTextビューに入力したテキスト、チェックボックスのチェック状態)を自動的に復元する機能がありますが、ビューのIDが永続的である場合にのみ機能します。したがって、上記の例では、この状態の復元は機能しません。ビューが生成されるたびに異なるIDを受け取るため、EditTextビューは入力を失い、もう一度入力する必要があるものを入力する必要があります。この問題を回避するには、アクティビティのライフサイクルを通じてIDを維持する必要があります。
Androidは、XMLで定義されたオブジェクトに数十億のIDを割り当てることがわかりました。これは、私のアプリから取得した実際のIDであり、事前定義されたIDは2131427423です。したがって、を呼び出さずに、自分の裁量で低いIDを使用するのはかなり安全なようですgenerateViewId()
。私のシンプルなアプリでは、1から始まり1ずつIDを割り当てることでそれを模倣し、機能しました。これが私のアプリから抽出した例です:
public class MainActivity extends AppCompatActivity {
// since our lastAllocatedViewId will reset on device rotation
// regenerated views will receive the same ID
private int lastAllocatedViewId = 0;
private ArrayList<QuizQuestions> quizQuestions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// read quizQuestions from xml at runtime;
quizQuestions = parseQuizQuestionsXml();
// we will dynamically add quiz question views to this view
// depending on how many quizQuestions are in the XML config
LinearLayout container = (LinearLayout) findViewById(R.id.quiz_questions_container);
// generate a view for each quiz question
for (int i = 0; i < quizQuestions.size(); i++) {
LinearLayout quizQuestionView = (LinearLayout) inflater.inflate(R.layout.quiz_question_template, parent, false);
quizQuestionView.setId(lastAllocatedViewId++);
(...) // do some work on our newly generated view
// then add it to the quiz questions container
container.addView(quizQuestionView);
}
}
}