Android開發 - inflate方法與建立檢視解析

阿俊学JAVA發表於2024-07-20
  • 簡介

    • 在Android開發過程中,很多地方都不可避免的使用到inflate方法,如在給Fragment進行CreateView(建立檢視)時,我們通常是inflater.inflate(R.layout.xxx, container, false)來呼叫inflate方法的,不難發現,inflate方法的作用是將一個 xml 佈局檔案變成一個 view 物件。
  • 注意事項

    1. 這玩意是用來將 xml 轉換為 view

    2. 這玩意不能直接new初始化,透過ActivitySystemService獲取,你也可以自定義他的源方法

    3. 因為效能問題,他只能把寫在layout裡被預處理過的 xml 轉換為 view ,不能隨便找個 xml 檔案就讓他轉換

  • 引數解析

    • inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) 方法有三個引數

      1. resource:檢視資源,由於檢視是R類內的layout管控,通常傳參形式為R.layout.xxxx代表檢視佈局的 **xml **檔案

      2. root:容器,view和它的關係就是水與水容器的關係,顯而易見,它是管控檢視xml檔案內控制元件的width、height等等屬性的,如果為null,那部分屬性就會失去效用,甚至直接導致編譯的程式崩潰,通常傳承形式為 ViewGroup 型別的物件,例如在此方法呼叫之前定義一個變數ViewGroup viewGroup = findViewById(R.id.xx)xx代表最高階別檢視的ID,後面進行傳參viewGroup即可。也可以直接在getView無法獲取到檢視資源時(findViewById無法使用)過載onCreateView方法編輯它進行繫結檢視資源:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container) {
            View view = inflater.inflate(R.layout.xx, container, false);
            myGetView(view);	//繫結指定view
            return view;
        }
        
        public void myGetView(View view){
            //在這裡進行view的功能操作
        }
        
      3. attachToRoot布林值型別的引數,ture/false,代表是否需要一鍵addView。例如通常情況下想要看到自己佈局的檢視是需要addView進行新增檢視的:

        public class MainActivity extends AppCompatActivity {
            @override
            protected void oncreate(Bundle savedInstancestate){
                super.oncreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ViewGroup viewGroup = findViewById(R.id.viewgroup);
                View view = getLayoutInflater().inflate(R.layout.xx, viewGroup, false);
                viewGroup.AddView(view)
            }
        }
        

        傳入true引數即可省略AddView步驟:

        public class MainActivity extends AppCompatActivity {
            @override
            protected void oncreate(Bundle savedInstancestate){
                super.oncreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ViewGroup viewGroup = findViewById(R.id.viewgroup);
                View view = getLayoutInflater().inflate(R.layout.xx, viewGroup, true);
            }
        }
        

相關文章