簡體   English   中英

添加的運行時View不知道它的位置

[英]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_OFRIGHT_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最初接受的修復沒有起作用,因為我沒有覆蓋我的GuitarStringViewonMeasure() ,根據文檔默認值為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM