Android 使用视图绑定,但没有“绑定”。全局类内的关键字

sla*_*boy 5 android kotlin android-viewbinding viewbinding

启用视图绑定后,使用:

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用ViewBinding,问题是我们需要binding.在访问每个视图之前使用前缀。有没有一种方法可以省略这个前缀,并直接访问类中的视图?

所以而不是:

binding.textview1.text = viewModel.name
binding.button1.setOnClickListener { viewModel.userClicked() }
Run Code Online (Sandbox Code Playgroud)

直接使用:

textview1.text = viewModel.name
button1.setOnClickListener { viewModel.userClicked() }
Run Code Online (Sandbox Code Playgroud)

显然我们可以使用with(binding)和使用每个方法,但是有没有办法在全局范围内将其应用于整个类?

fun method = with(binding){
    // now we can access the viewbinding
    textview1.text = viewModel.name
    button1.setOnClickListener { viewModel.userClicked() }
}

Run Code Online (Sandbox Code Playgroud)

是否有任何绑定设置,我们可以指定编译器从布局生成接口:

所以它会自动生成:


public interface Fragment1BindingInterface {

  @NonNull
  TextView getTextView1();
}

public final class Fragment1Binding implements ViewBinding, Fragment1BindingInterface {
  @NonNull
  private final RelativeLayout rootView;

  @Override
  @NonNull
  private final TextView _textView1;

  @Override
  @NonNull
  public TextView getTextView1() {
    return _textView1;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以在fragment类中实现Fragment1BindingInterface,并可以直接访问所有视图,而无需binding.每次都使用。虽然这会公开发表意见,但无论如何只是问可不可以?

Ivo*_*ers 2

这可能不是您想要的,但也许您认为无论如何这是一种改进,那就是列出您想要在班级顶部的所有视图,例如

private val textview1 by lazy { binding.textview1 }
private val button1 by lazy { binding.button1 }
Run Code Online (Sandbox Code Playgroud)

然后你就可以在课堂上按照你想要的方式使用它们。