爲了讓LayoutInflater按照預期工作,我遇到了很多麻煩,其他人也這樣做:How to use layoutinflator to add views at runtime?。爲什麼LayoutInflater會忽略我指定的layout_width和layout_height佈局參數?
爲什麼LayoutInflater不理我指定佈局參數?例如。爲什麼我的資源XML中的layout_width
和layout_height
值不符合?
爲了讓LayoutInflater按照預期工作,我遇到了很多麻煩,其他人也這樣做:How to use layoutinflator to add views at runtime?。爲什麼LayoutInflater會忽略我指定的layout_width和layout_height佈局參數?
爲什麼LayoutInflater不理我指定佈局參數?例如。爲什麼我的資源XML中的layout_width
和layout_height
值不符合?
我已經研究過此問題,指的是LayoutInflater docs和設置小樣本示範項目。以下教程顯示如何使用LayoutInflater
動態填充佈局。
在我們開始之前看看LayoutInflater.inflate()
參數是這樣的:
R.layout.main_page
)attachToRoot
是true
),或者簡單地提供一組用於返回的層次結構的根LayoutParams
值(如果是attachToRoot
false
一個對象。 )attachToRoot:無論充氣層次結構應附加到根參數?如果爲false,則root僅用於爲XML中的根視圖創建LayoutParams
的正確子類。
返回:充氣層次結構的根視圖。如果提供root並且attachToRoot
是true
,則這是根;否則它就是膨脹的XML文件的根源。
現在的樣本佈局和代碼。
主要佈局(main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
添加到該容器是一個獨立的TextView,作爲紅色的小正方形可見如果佈局參數被成功地從XML應用(red.xml
):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
現在LayoutInflater
使用與調用幾個變化參數
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
參數變化的實際結果記錄在代碼中。
摘要:調用LayoutInflater
時未指定根將導致膨脹調用,忽略XML中的佈局參數。調用帶有根不相等null
和attachRoot=true
不加載佈局參數膨脹,但再次返回根對象,其防止進一步的佈局改變到加載的對象(除非你可以找到它使用findViewById()
)。 你最有可能想使用調用約定因此這個人是:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
爲了幫助佈局問題時,hierarchy viewer強烈推薦。
優秀的答案。在Android上工作了3年,並且還在計數,並且仍然有一些可以從中學習。 – 2012-09-27 17:03:04
andig是正確的,LayoutInflater忽略你的layout_params的一個常見原因是因爲未指定根目錄。許多人認爲你可以傳入null作爲根。這對於一些場景是可以接受的,例如對話框,在創建時您無法訪問root。然而,一個好的規則是,如果你有root權限,把它交給LayoutInflater。
我寫了一個深入的博客文章關於這一點,你可以看看這裏:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
道道通確實是傷害還是我挑錯了地方?只是想我會分享我的結果。必須承認教程沒有具體提到常見問題頁面。 – andig 2011-02-17 09:43:14
請參閱常見問題第一個問題的最後一段。將其作爲問題發佈,然後將教程發佈爲答案。當然,你可以編輯這個問題,並在答案中粘貼教程。如果你解決這個問題,我會保持樂觀。 – bigstones 2011-02-17 10:22:52