View
包含方法setId(int)
。我的問題是,如何以編程方式爲對象提供一個不會覆蓋R
中任何資源ID的Id?以編程方式爲視圖創建資源ID
3
A
回答
2
的Android文檔按照documentation,View.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);
}
}
}
-1
檢查出View.setId()
相關問題
- 1. C#以編程方式創建資源
- 2. 以編程方式指定資源ID
- 3. 以編程方式創建視圖
- 4. 以編程方式創建視圖
- 5. 以編程方式創建視圖
- 6. ios以編程方式創建視圖
- 7. iOS以編程方式創建視圖
- 8. WPF創建窗口以編程方式拋出資源
- 9. 如何以編程方式創建字符串資源
- 10. 以編程方式利用使用CloudFormation創建的資源
- 11. 以編程方式創建視圖iPhone編程
- 12. 以編程方式創建視頻?
- 13. 以編程方式創建流程圖
- 14. 以編程方式創建腳本組件作爲源程序
- 15. JSF以編程方式添加資源
- 16. 以編程方式定義StackPanel資源?
- 17. 以編程方式更改資源getString()
- 18. 如何以編程方式獲取android.R.id.content的資源ID?
- 19. Android:以編程方式遍歷資源ID
- 20. 在Android上以編程方式創建的樣式視圖
- 21. 以編程方式創建視圖後添加樣式
- 22. 以編程方式創建繪圖
- 23. 以編程方式創建UML類圖
- 24. 以編程方式創建圖像?
- 25. 試圖以編程方式創建rightBarButtonItem
- 26. 以編程方式創建GMF圖
- 27. 如何以編程方式創建iOS應用程序視圖
- 28. 以編程方式爲NSStatusBar.systemStatusBar創建NSMenu
- 29. 以編程方式爲Google API創建產品/客戶ID
- 30. 以編程方式爲Spring創建JNDI數據源
可能重複:http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts下面是一個例子,從我的應用程序中提取 – Rodrigo