如何在Android中使用视图绑定

sie*_*era 19 android findviewbyid android-viewbinding

我一直在使用findViewById然后使用ButterKnife 来绑定视图。最近,我看到了这篇文章:https : //proandroiddev.com/new-in-android-viewbindings-the-difference-from-databinding-library-bef5945baf5e,我不太确定如何使用它。

我尝试这样做,但它似乎在 Android Studio 3.4.2 中不起作用

val binding = MainActivityBinding.inflate(layoutInflater) setContentView(binding.root)

然后使用这些值,例如:

binding.button....

binding.textView....

Sow*_*wlM 32

您应该做几件事,我尝试将其整理并列出:(基于此链接中的Android 开发人员文档和我的个人经验)

  1. 您需要使用 Android Studio 3.6 canary11+(我目前使用的是 Android Studio 4,它对我来说做得很好)

    你可以从这里找到它:https : //developer.android.com/studio/archive

  2. 您需要将 Gradle 包装器升级到 Gradle“5.6.4”,将 Gradle 构建工具升级到“3.6.0-rc01”,更高版本也可以使用,所以不要害怕更新

    distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
Run Code Online (Sandbox Code Playgroud)
    dependencies {

        ...
        classpath 'com.android.tools.build:gradle:3.6.0-rc01'

    }
Run Code Online (Sandbox Code Playgroud)
  1. 要在模块中启用视图绑定,请将 viewBinding 元素添加到其 build.gradle 文件中,如以下示例所示:
    android {
    ...
      viewBinding {
        enabled = true
      }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 如果您希望在生成绑定类时忽略布局文件,请将该tools:viewBindingIgnore="true"属性添加到该布局文件的根视图中:
    <LinearLayout
        ...
        tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)
  1. 如果为模块启用了视图绑定,则会为模块包含的每个 XML 布局文件生成一个绑定类。每个绑定类都包含对根视图和所有具有 ID 的视图的引用。绑定类的名称是通过将 XML 文件的名称转换为驼峰式大小写并在末尾添加“绑定”一词来生成的。

    例如,给定一个名为 的布局文件result_profile.xml

    <LinearLayout ... >
        <TextView android:id="@+id/name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/button"
            android:background="@drawable/rounded_button" />
    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

生成的绑定类称为ResultProfileBinding。这个类有两个字段:一个TextView被调用的name和一个Button被调用的button。的ImageView在布局具有没有ID,所以在绑定类给它没有提及。

每个绑定类还包含一个getRoot()方法,为相应布局文件的根视图提供直接引用。在这个例子中,类中的getRoot()方法ResultProfileBinding返回LinearLayout根视图。

  1. 要设置用于活动、片段或卡片视图适配器的绑定类的实例,请执行以下步骤:
  • 在活动的 onCreate() 方法中:
    private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}
Run Code Online (Sandbox Code Playgroud)
  • 在片段的 onCreateView() 方法中:
    private FragmentHousesBinding binding;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        binding = FragmentHousesBinding.inflate(inflater, container, false);

        init();

        return binding.getRoot();
    }
Run Code Online (Sandbox Code Playgroud)
  • 在卡片视图适配器的 onCreateViewHolder() 方法中:
    HouseCardPropertyFragmnetBinding binding;

    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        binding = HouseCardPropertyFragmnetBinding.inflate(LayoutInflater
            .from(parent.getContext()), parent, false);

        return new Holder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull HouseAdapter.Holder holder, int position) {
        holder.bindData(getItem(position));
    }

    class Holder extends RecyclerView.ViewHolder {

        HouseCardPropertyFragmnetBinding view;

        Holder(@NonNull HouseCardPropertyFragmnetBinding v) {
            super(v.getRoot());
            view = v;
        }

        void bindData(Tag item) {
            view.tagTxt.setText(item.Name);

        }
    }
Run Code Online (Sandbox Code Playgroud)

就是这样,findViewById从现在起你就可以自由了;)


Reh*_*han 21

在大多数情况下,视图绑定取代 findViewById。

Java:将其添加到 Gradle 文件中

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

科特林

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

如果您希望在生成绑定类时忽略布局文件,请将 tools:viewBindingIgnore="true" 属性添加到该布局文件的根视图:

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

在活动中使用视图绑定

科特林

<LinearLayout
    ...
    tools:viewBindingIgnore="true" >
    ...
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

爪哇

private lateinit var binding: ResultProfileBinding
    
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}
Run Code Online (Sandbox Code Playgroud)

您现在可以使用绑定类的实例来引用任何视图:

科特林

private ResultProfileBinding binding;
    
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}
Run Code Online (Sandbox Code Playgroud)

爪哇

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

查看片段中的绑定

科特林

binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});
Run Code Online (Sandbox Code Playgroud)

爪哇

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
    
override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
    ): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }
    
override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
Run Code Online (Sandbox Code Playgroud)

您现在可以使用绑定类的实例来引用任何视图:

科特林

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

爪哇

private ResultProfileBinding binding;
    
@Override
public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}
    
@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}
Run Code Online (Sandbox Code Playgroud)


Umu*_*ALI 13

视图绑定仅在 Android Studio 3.6 Canary 11+ 中可用。首先,您使用android gradle插件版本3.6.0-alpha11+升级Android studio(您现在可以使用它们的测试版,稳定版本尚未发布,但您可以使用测试版)然后添加以下代码build.gradle

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

现在您可以像我们使用数据绑定一样使用:

private lateinit var binding: ActivityMainBinding

@Override
fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    binding.textView.text = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

就是这样。


小智 7

ViewBinding 仅适用于 Android Studio 3.6 及更高版本

1:- 您需要将 build.gradle 中的 gradle build toolold 升级到 3.6.1(项目级别)

 dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
             }
Run Code Online (Sandbox Code Playgroud)

2:- 您需要在 build.gradle(app) 中启用 viewBinding

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

启用视图绑定后,将为每个 XML 布局生成一个绑定类。绑定类的名称是通过将 XML 文件的名称转换为驼峰式大小写并在末尾添加“绑定”一词来生成的。

示例:- 如果布局文件命名为“ add_item_activity.xml ”,则绑定类的名称将为“ AddItemActivityBinding

3: -要设置为与活动使用绑定类的实例,结合创建类的实例,在这里我们将创建的“实例AddItemActivityBinding ”,将调用静态充气的绑定类生成的方法

通过调用 getRoot() 方法获取对根视图的引用,并在 setContentView() 方法中传递此根视图

public class AddItemActivity extends AppCompatActivity {
    private AddItemActivityBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = AddItemActivityBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        //now we can access views by their IDs 
        binding.tvTitleMyOrder.setText("Title goes here");

    }

}
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用绑定类的实例通过它们的 ID 访问视图


Abu*_*lid 6

:--------------------------------------这是针对 Kotlin 的 ----- ----------------------------:

您需要执行以下两个步骤:

1)在项目的模块中添加viewBinding:

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

在此输入图像描述

2) 添加绑定到您的 Activity 类:

private lateinit var binding: ActivitySplashBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(binding.root)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Saa*_*ash 4

ViewBindings 是在 Google IO/19演讲中引入的。它将在 Android Studio 3.6 中提供,正如您所提到的,您使用的是 Android Studio 3.4.2,因此它无法工作。请阅读本文中的 ViewBindings 部分以获取更多参考。