首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android RelativeLayout 代碼動態添加按鈕對齊失效:LayoutParams 設置時機修復

     編輯:程式設計綜合問答

錯誤代碼


wkParams[1].addRule(RelativeLayout.RIGHT_OF, wk[0].getId());
relativeLayout.addView(wk[1], wkParams[1]); // wk[0] 尚未 addView,ID 未在佈局樹中

根因

RelativeLayout 依賴**已存在於佈局樹中的 View ID** 計算位置。調用 addView 時,參考 View 必須**已添加**。

修正順序


// 1. 先添加參考 View
relativeLayout.addView(wk[0], wkParams[0]);

// 2. 再設置依賴參考 View 的 LayoutParams
wkParams[1].addRule(RelativeLayout.RIGHT_OF, wk[0].getId());
// 或 wkParams[1].addRule(RelativeLayout.RIGHT_OF, wk[0].getId());

// 3. 最後添加依賴 View
relativeLayout.addView(wk[1], wkParams[1]);

完整最佳實踐模板


Button btn1 = new Button(this);
btn1.setId(View.generateViewId()); // API 17+ 唯一 ID
RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp1.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
relativeLayout.addView(btn1, lp1);

Button btn2 = new Button(this);
btn2.setId(View.generateViewId());
RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lp2.addRule(RelativeLayout.RIGHT_OF, btn1.getId()); // 參考已添加的 btn1
relativeLayout.addView(btn2, lp2);

關鍵點總結

操作正確時機
setId()addView 之前
addRule(RIGHT_OF, refId)參考 View addView 完成後
addView(child, params)Params 所有規則設置完畢後

**RelativeLayout 佈局參數依賴「已在樹中」的錨點 View**。動態添加時,**先加錨點,再加依賴者**——這是唯一鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved