【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
文章目錄
- I . 視圖綁定 ( ViewBinding ) 界面的兩種方式
- II . Activity 界面中 應用 視圖綁定 ( ViewBinding )
- III . Dialog 對話框界面中 應用 視圖綁定 ( ViewBinding )
- IV . 自定義組件 應用 視圖綁定 ( ViewBinding )
- V . RecyclerView 列表布局 應用 視圖綁定 ( ViewBinding )
- VI . GitHub 代碼地址
I . 視圖綁定 ( ViewBinding ) 界面的兩種方式
1 . ViewBinding 視圖綁定類提供了兩種與界面的綁定方式 , 分別是
① XxxBinding.inflate( LayoutInflater )
② XxxBinding.inflate( LayoutInflater , ViewParent, attachToRoot )
兩種方式 ; ( XxxBinding 是視圖綁定類 )
2 . XxxBinding.inflate( LayoutInflater ) 與界面綁定 : 這種方式加載的布局與界面關聯性不大 , 需要調用額外的函數 , 將視圖綁定類與界面進行綁定 , Activity 界面 與 Dialog 對話框 , 就使用這種綁定方式 ;
3 . XxxBinding.inflate( LayoutInflater , ViewParent, attachToRoot ) 直接與界面綁定 : 自定義布局組件 和 RecyclerView 適配器中為條目加載布局選項 , 就是使用的這種方式 , 調用該方法后 , 可以直接與界面進行綁定 , 界面中顯示的就是 XxxBinding 對應的布局內容 ;
II . Activity 界面中 應用 視圖綁定 ( ViewBinding )
Activity 界面中 應用 視圖綁定 ( ViewBinding ) :
① 獲取視圖綁定類 : 使用 ActivityMainBinding.inflate(getLayoutInflater()) 只是單純的加載布局 ;
② 關聯界面 : 還需要調用 setContentView(binding.getRoot()) 方法 , 將 視圖綁定類與 Activity 界面關聯 , 此時才能通過視圖綁定類獲取組件 , 進而控制 UI 界面 ;
public class MainActivity extends AppCompatActivity {/*** 視圖綁定類 對象*/private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 1 . 獲取視圖綁定類binding = ActivityMainBinding.inflate(getLayoutInflater());// 2 . 關聯視圖綁定類 與 ActivitysetContentView(binding.getRoot());// 3 . 使用視圖綁定類設置binding.textView.setText("視圖綁定 ( ViewBinding ) 示例");// 4 . 視同視圖綁定類獲取按鈕 , 并未按鈕設置點擊事件binding.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ViewBindingDialog dialog = new ViewBindingDialog(MainActivity.this);dialog.show();}});// 5 . 設置 Recycler View// 5.1 為 RecyclerView 列表設置布局管理器LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(RecyclerView.VERTICAL);binding.recyclerView.setLayoutManager(layoutManager);// 5.2 為 RecyclerView 列表設置適配器binding.recyclerView.setAdapter(new Adapter());} }
III . Dialog 對話框界面中 應用 視圖綁定 ( ViewBinding )
Dialog 對話框界面中 應用 視圖綁定 ( ViewBinding ) : 該界面與 Activity 界面用法基本相同 ;
① 獲取視圖綁定類 : 使用 DialogBinding binding = DialogBinding.inflate(getLayoutInflater()) 只是單純的加載布局 ;
② 關聯界面 : 還需要調用 setContentView(binding.getRoot()) 方法 , 將 視圖綁定類與 Dialog 對話框界面關聯 , 此時才能通過視圖綁定類獲取組件 , 進而控制 UI 界面 ;
package kim.hsl.vb;import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView;import kim.hsl.vb.databinding.DialogBinding;public class ViewBindingDialog extends Dialog {public ViewBindingDialog(@NonNull Context context) {super(context);}public ViewBindingDialog(@NonNull Context context, int themeResId) {super(context, themeResId);}protected ViewBindingDialog(@NonNull Context context, boolean cancelable,@Nullable OnCancelListener cancelListener) {super(context, cancelable, cancelListener);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 1 . 獲取視圖綁定類DialogBinding binding = DialogBinding.inflate(getLayoutInflater());// 2 . 設置對話框布局setContentView(binding.getRoot());// 3 . 通過視圖綁定類訪問布局中的視圖組件binding.textView.setText("視圖綁定對話框示例 \nDialogBinding");// 4 . 設置對話框大小 ( 僅做參考 美觀處理 與主題無關 )WindowManager.LayoutParams params = getWindow().getAttributes();params.width = WindowManager.LayoutParams.MATCH_PARENT;params.height = 400;getWindow().setAttributes(params);} }效果展示 :
IV . 自定義組件 應用 視圖綁定 ( ViewBinding )
自定義組件 應用 視圖綁定 ( ViewBinding ) :
① 自定義組件首先是 ViewGroup 子類 , View 子類無法使用視圖綁定 ;
② 初始化視圖綁定類并關聯界面 : 使用 MyViewBinding binding = MyViewBinding.inflate(inflater, this, true) 進行視圖綁定初始化 , 及 關聯界面操作 , 其中的 this 就是 ViewGroup 類型的 , 即組件本身 , 調用上述方法 , 可以將兩個操作都完成 ;
package kim.hsl.vb;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Build; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout;import androidx.annotation.Nullable; import androidx.annotation.RequiresApi;import kim.hsl.vb.databinding.MyViewBinding;public class ViewBindingView extends LinearLayout {/*** 在代碼中創建組件調用該構造函數* @param context*/public ViewBindingView(Context context) {super(context);}/*** 在 xml 布局文件中使用該組件 , 并且還定義了自定義屬性 , 調用該構造函數* @param context* @param attrs*/public ViewBindingView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);// 1 . 獲取布局加載器LayoutInflater inflater = LayoutInflater.from(this.getContext());// 2 . 獲取視圖綁定類// 需要將視圖綁定類 與 本自定義 LinearLayout 進行關聯MyViewBinding binding = MyViewBinding.inflate(inflater, this, true);// 3 . 通過視圖綁定類訪問布局中的 TextView 布局binding.textView.setText("視圖綁定自定義組件示例\nMyViewBinding");}public ViewBindingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public ViewBindingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//繪制黃色背景canvas.drawColor(Color.YELLOW);} }
V . RecyclerView 列表布局 應用 視圖綁定 ( ViewBinding )
RecyclerView 列表布局 應用 視圖綁定 ( ViewBinding ) :
① 視圖綁定需要在 Adapter 適配器的 onCreateViewHolder( ) 方法中進行初始化 , 只有在這里才能拿到 ViewGroup parent 關聯組件的父類容器 ;
② 初始化視圖綁定類并關聯界面 : 使用 ItemBinding binding = ItemBinding.inflate(LayoutInflater.from(MainActivity.this) , parent, false) 進行視圖綁定初始化 , 及 關聯界面操作 , 其中的 this 就是 ViewGroup 類型的 , 即組件本身 , 調用上述方法 , 可以將兩個操作都完成 ;
③ 自定義 ViewHolder 構造函數 : public ViewHolder(ItemBinding binding) 傳入視圖綁定類 , 在構造函數中使用視圖綁定類初始化 ViewHolder 中的組件 , 注意別忘了先調用父類的方法 ;
class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {ItemBinding binding = ItemBinding.inflate(LayoutInflater.from(MainActivity.this) , parent, false);return new ViewHolder(binding);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.textView.setText("第 " + position + " 行");if(position % 2 == 0){holder.textView.setBackgroundColor(Color.YELLOW);}else{holder.textView.setBackgroundColor(Color.WHITE);}}@Overridepublic int getItemCount() {return 10;}class ViewHolder extends RecyclerView.ViewHolder{TextView textView;/*** 自定義的構造函數 , 需要傳入 視圖綁定類* @param binding* 列表項布局的視圖綁定類*/public ViewHolder(ItemBinding binding) {super(binding.getRoot());this.textView = binding.textView;}}}
效果展示 :
VI . GitHub 代碼地址
GitHub 代碼地址 : https://github.com/han1202012/001_JetPack_ViewBinding
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JetPack】为现有 Android
- 下一篇: 【Kotlin】apply 内联扩展函数