如何使用View Binding代替butterknife?

问题描述 投票:0回答:1

我正在更新一个应用程序。在新程序中,我打算使用视图绑定,因为 butterknife 库不起作用。我的代码如下。我该如何使用新方法? 前面的代码使用了 butterknife 库。通过将程序更新到新版本,将无法使用该库并同步它。经过一番搜索,我发现更好的解决方案是使用方法二。但我在重写代码时遇到了问题。如果可能,指导进行必要的更改。 谢谢

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        app:cardCornerRadius="10dp"
        app:cardElevation="8dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical"
            android:padding="10dp"
            >

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:id="@+id/baseDialog_imgDialog"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_alignParentRight="true"
                    />

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignTop="@id/baseDialog_imgDialog"
                    android:layout_toLeftOf="@id/baseDialog_imgDialog"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/baseDialog_tvTitle"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="right"
                        android:textColor="@android:color/black"
                        android:textSize="18sp" />

                    <TextView
                        android:id="@+id/baseDialog_tvDescription"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:textColor="@color/black"
                        android:textSize="16sp" />
                </LinearLayout>

            </RelativeLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:gravity="center"
                android:weightSum="2.5">

                <TextView
                    android:id="@+id/baseDialog_btnNo"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="10dp"
                    android:layout_weight="1"
                    android:background="@drawable/bkg_blue_curved"
                    android:gravity="center"
                    android:paddingTop="10dp"
                    android:paddingBottom="10dp"
                    android:textColor="@android:color/white"
                    android:textSize="18sp" />

                <TextView
                    android:id="@+id/baseDialog_btnYes"

                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_weight="1"
                    android:background="@drawable/strocked_simple"
                    android:gravity="center"
                    android:paddingTop="10dp"
                    android:paddingBottom="10dp"
                    android:textColor="@color/black"
                    android:textSize="18sp" />


            </LinearLayout>


        </LinearLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

Java 类:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.example.R;
import com.example.interfase.MyClickHolder;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;


public class TowOptionDialog extends BaseDialog {
    private String noButtonText, yesButtonText, titleText, bodyText;
    private Drawable imageLink;

    MyClickHolder myClickHolde;

    public void setMyClickHolde(MyClickHolder myClickHolde) {
        this.myClickHolde = myClickHolde;
    }

    @BindView(R.id.baseDialog_tvTitle)
    TextView tvTitle;

    @BindView(R.id.baseDialog_tvDescription)
    TextView tvDescription;

    @BindView(R.id.baseDialog_btnNo)
    TextView btnNo;

    @BindView(R.id.baseDialog_btnYes)
    TextView btnYes;

    @BindView(R.id.baseDialog_imgDialog)
    ImageView imgBaseDialog;

    @OnClick(R.id.baseDialog_btnYes)
    void yesButton() {
        myClickHolde.onClicked(null, 1);
        dismiss();
    }

    @OnClick(R.id.baseDialog_btnNo)
    void noButton() {
        dismiss();

    }


    public TowOptionDialog(@NonNull Context context,
                           String noButtonText,
                           String yesButtonText,
                           String titleText,
                           String bodyText,
                           Drawable imageLink) {
        super(context);
        this.noButtonText = noButtonText;
        this.yesButtonText = yesButtonText;
        this.titleText = titleText;
        this.bodyText = bodyText;
        this.imageLink = imageLink;
    }

    public TowOptionDialog(@NonNull Context context,
                           String titleText,
                           String bodyText
    ) {
        super(context);
        this.noButtonText = "No";
        this.yesButtonText = "Yes";
        this.titleText = titleText;
        this.bodyText = bodyText;
        this.imageLink = null;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_two_button);
        ButterKnife.bind(this);

        tvTitle.setText(titleText);
        tvDescription.setText(bodyText);
        imgBaseDialog.setImageDrawable(imageLink);
        imgBaseDialog.setVisibility(imageLink == null
                ? View.GONE : View.VISIBLE
        );
        btnYes.setText(yesButtonText);
        btnNo.setText(noButtonText);
    }
android android-studio view android-databinding android-viewbinding
1个回答
0
投票

首先删除现有的 Butterknife 库并将 viewBinding 添加到您的 build.gradle 中:

android {
    ...
    viewBinding {
        enabled = true
    }
}

然后你必须设置你的根视图, 创建一个像这样的全局变量:

private ActivityMainBinding binding

例如,如果我使用 MainActivity viewBinding 自动生成类似“ActivityMainBinding”的内容,那么您可以在 onCreate 函数中初始化此变量。

private ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    // Now you can access your views using the binding object
    binding.tvHeader.setText("Hello, ViewBinding!");
}

初始化后,您可以使用各自的 ID 调用任何小部件,例如,我使用这样的绑定来调用我的 TextView 'tvHeader'

binding.tvHeader.setText("Hello, ViewBinding!");

© www.soinside.com 2019 - 2024. All rights reserved.