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 开发人员文档和我的个人经验)
您需要使用 Android Studio 3.6 canary11+(我目前使用的是 Android Studio 4,它对我来说做得很好)
你可以从这里找到它:https : //developer.android.com/studio/archive
您需要将 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)
android {
...
viewBinding {
enabled = true
}
}
Run Code Online (Sandbox Code Playgroud)
tools:viewBindingIgnore="true"属性添加到该布局文件的根视图中: <LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
如果为模块启用了视图绑定,则会为模块包含的每个 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根视图。
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)
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)
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 访问视图
:--------------------------------------这是针对 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)
ViewBindings 是在 Google IO/19演讲中引入的。它将在 Android Studio 3.6 中提供,正如您所提到的,您使用的是 Android Studio 3.4.2,因此它无法工作。请阅读本文中的 ViewBindings 部分以获取更多参考。
| 归档时间: |
|
| 查看次数: |
20931 次 |
| 最近记录: |