[英]Runtime added View does not know it's location
我在運行時將View
添加到RelativeLayout
中,效果很好,但是現在我想在該View
左側顯示一個TextView
,但是我無法檢索此View
的頂部或左側以計算TextView
的位置。
我的代碼是
private void displayGuitar() {
for (GuitarString guitarString: guitar.getGuitarStrings()) {
GuitarStringView guitarStringView = new GuitarStringView(context, attributeSet, guitarString);
this.addView(guitarStringView);
// Add Note name
TextView noteNameView = new TextView(context);
RelativeLayout.LayoutParams noteParams =
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
noteParams.addRule(LEFT_OF, guitarStringView.getId());
Log.w("string top", String.valueOf(guitarStringView.getTop()));
Log.w("string left", String.valueOf(guitarStringView.getLeft()));
noteParams.setMargins(0, 0, 2, 0);
noteNameView.setLayoutParams(noteParams);
noteNameView.setText(guitarString.getTunedNote().getNoteName(0));
this.addView(noteNameView);
}
}
這導致TextViews全部出現在彼此的頂部(在正確的X位置),但是由於兩個Log語句都返回0,所以我無法設置Top邊距。如何確定GuitarStringView
的Top位置是什么?
編輯根據laalto的建議,我現在為guitarStringView
生成了ID,並確認已分配該ID。 但是,如果我使用LEFT_OF
, RIGHT_OF
等,則不會顯示TextView
,但是如果我使用ALIGN_PARENT_RIGHT
它們會很好顯示嗎? 現在的代碼如下
private void displayGuitar() {
for (GuitarString guitarString: guitar.getGuitarStrings()) {
GuitarStringView guitarStringView = new GuitarStringView(context, attributeSet, guitarString);
int viewId = guitarStringView.generateViewId();
guitarStringView.setId(viewId);
this.addView(guitarStringView);
// Add Note name
TextView noteNameView = new TextView(context);
RelativeLayout.LayoutParams noteParams =
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
noteParams.addRule(RelativeLayout.LEFT_OF, viewId);
noteNameView.setLayoutParams(noteParams);
noteNameView.setText(guitarString.getTunedNote().getNoteName(0));
this.addView(noteNameView);
}
}
編輯2最初接受的修復沒有起作用,因為我沒有覆蓋我的GuitarStringView
的onMeasure()
,根據文檔默認值為100x100。
首先,您的guitarStringView
沒有id, getId()
將返回-1
,即NO_ID
。 因此LEFT_OF
規則不起作用,因為它沒有引用任何實際的ID。 要解決此問題,只需為視圖設置一些ID。
其次,視圖尚未測量或布局,因此這就是尺寸和位置為零的原因。
將addRule與LEFT_OF,RIGHT_OF或BELOW中的任何一個一起使用,將不再顯示TextView
字符串視圖可能已經占據了所有水平空間。 添加另一個約束,例如ALIGN_PARENT_LEFT
以使文本視圖的左邊緣與父級相對布局的左邊緣對齊。
您說的是“在運行時”,這意味着您可能在onCreate或onResume中調用此方法。 這些方法應按預期在onWindowFocusChanged(boolean)中開始表現。
看到另一個問題: getRight,getLeft,getTop返回零
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.