2011-02-17 108 views
153

爲了讓LayoutInflater按照預期工作,我遇到了很多麻煩,其他人也這樣做:How to use layoutinflator to add views at runtime?爲什麼LayoutInflater會忽略我指定的layout_width和layout_height佈局參數?

爲什麼LayoutInflater不理我指定佈局參數?例如。爲什麼我的資源XML中的layout_widthlayout_height值不符合?

+0

道道通確實是傷害還是我挑錯了地方?只是想我會分享我的結果。必須承認教程沒有具體提到常見問題頁面。 – andig 2011-02-17 09:43:14

+3

請參閱常見問題第一個問題的最後一段。將其作爲問題發佈,然後將教程發佈爲答案。當然,你可以編輯這個問題,並在答案中粘貼教程。如果你解決這個問題,我會保持樂觀。 – bigstones 2011-02-17 10:22:52

回答

352

我已經研究過此問題,指的是LayoutInflater docs和設置小樣本示範項目。以下教程顯示如何使用LayoutInflater動態填充佈局。

在我們開始之前看看LayoutInflater.inflate()參數是這樣的:

  • 資源:一個XML佈局資源ID負載(例如,R.layout.main_page
  • :可選觀點是所生成的分層結構的父(如果attachToRoottrue),或者簡單地提供一組用於返回的層次結構的根LayoutParams值(如果是attachToRootfalse一個對象。 )
  • attachToRoot:無論充氣層次結構應附加到根參數?如果爲false,則root僅用於爲XML中的根視圖創建LayoutParams的正確子類。

  • 返回:充氣層次結構的根視圖。如果提供root並且attachToRoottrue,則這是根;否則它就是膨脹的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中的佈局參數。調用帶有根不相等nullattachRoot=true不加載佈局參數膨脹,但再次返回根對象,其防止進一步的佈局改變到加載的對象(除非你可以找到它使用findViewById())。 你最有可能想使用調用約定因此這個人是:

loadedView = LayoutInflater.from(context) 
       .inflate(R.layout.layout_to_load, parent, false); 

爲了幫助佈局問題時,hierarchy viewer強烈推薦。

+18

優秀的答案。在Android上工作了3年,並且還在計數,並且仍然有一些可以從中學習。 – 2012-09-27 17:03:04

4

andig是正確的,LayoutInflater忽略你的layout_params的一個常見原因是因爲未指定根目錄。許多人認爲你可以傳入null作爲根。這對於一些場景是可以接受的,例如對話框,在創建時您無法訪問root。然而,一個好的規則是,如果你有root權限,把它交給LayoutInflater。

我寫了一個深入的博客文章關於這一點,你可以看看這裏:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

相關問題