2012-05-15 72 views
3

View包含方法setId(int)。我的問題是,如何以編程方式爲對象提供一個不會覆蓋R中任何資源ID的Id?以編程方式爲視圖創建資源ID

+3

可能重複:http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts下面是一個例子,從我的應用程序中提取 – Rodrigo

回答

2

的Android文檔按照documentationView.generateViewId()在API級17加到將產生適合於在使用setId(int)的值。該值不會與構建時生成的ID值相沖突,適用於R.id。我試用View.generateViewId()來了解它的行爲。這是我的發現。

  • 生成的ID將從1開始,在每次被調用時通過遞增(1,2,3,...)
  • generateViewId()將保持最後ID返回和將在整個從那裏繼續應用生命週期。例如,如果設備旋轉前最後一個ID爲4,後旋轉將下一個ID 5.

需要注意的是,舉例來說,如果你是通過調用generateViewId()設立的觀點在你的應用的onCreate()方法運行是非常重要的每次在設備旋轉後,默認情況下onCreate()會再次被調用,並且您的視圖將收到與旋轉之前不同的ID。

Android有一個功能,可自動恢復您的意見狀態 - 例如,你進入到一個EditText視圖文本,檢查CheckBox的狀態 - 設備旋轉後,但如果意見有持續性的ID它纔會起作用。因此,在上面的例子中,這種狀態恢復將不起作用 - 您的EditText視圖將失去輸入,並且必須再次鍵入需要輸入的任何內容 - 因爲視圖每次生成時都會接收到不同的ID。 要解決此問題,您需要在活動生命週期中維護ID。

我發現Android爲數十億的規模的XML中定義的對象分配了ID。這是從我的應用程序中取得的一個真實生活ID,只有幾個預定義的ID:2131427423.因此,它似乎可以自行決定使用低ID,而不需要調用generateViewId()。在我簡單的應用程序中,我通過從1開始分配ID來模擬它,然後將其加1。

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); 
     } 
    } 
}