5

Viewメソッドが含まれていますsetId(int)。私の質問は、どのリソースIDと重複しないIDをプログラムでオブジェクトに提供するかということRです。

4

1 に答える 1

5

ドキュメントによると、 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);
        }
    }
}
于 2017-02-25T14:03:27.587 に答える