这是我在RecycleView适配器类中使用的代码。我不知道这是使用视图绑定的正确方法还是不正确。如果您有更好的解决方案,请回答我。谢谢你。
@Override
public CategoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.common_circle_image, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull CategoryAdapter.MyViewHolder holder, final int position) {
holder.binding.img.setBackgroundResource(addAdapterData.get(position).getItemUrl());
holder.binding.txt.setText(addAdapterData.get(position).getItemName());
}
@Override
public int getItemCount() {
return addAdapterData.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
CommonCircleImageBinding binding;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
binding = CommonCircleImageBinding.bind(itemView);
binding.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
commonItemClick.onItemClick(getAdapterPosition(),"");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我想知道在同一个班级使用R.layout.layout_name和使用是否正确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....
我目前正在尝试新的 ViewBindings,但我没有让它们工作。我在Android Studio 3.6.1。我刚刚创建了一个新项目并添加viewBinding.enabled = true到我的模块中build.gradle。但是当我尝试访问MainActivityBinding该类时,它说它无法解析该符号。自动完成找不到任何类似于绑定类的东西。我也尝试过使用 Kotlin 的不同项目,但没有成功。AS4.0也没有帮助。我需要做什么来生成ViewBinding类?
我的 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
viewBinding {
enabled = true
}
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 29
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation …Run Code Online (Sandbox Code Playgroud) 为什么在 Fragment 中实现Android 视图绑定时清除 in 很重要binding?onDestroyView
如文档所示,在片段中使用视图绑定,以及 Android 架构组件示例,binding在 中启动onCreateView,并在 中清除onDestroyView。
binding与在不清除的情况下启动相比,实施此操作有什么好处onDestroyView?如果没有显式清除实例变量binding,则应在 Fragment 销毁时将其清除。
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 …Run Code Online (Sandbox Code Playgroud) android android-layout android-lifecycle kotlin android-viewbinding
我的基础片段:
abstract class BaseFragment<ViewModel : BaseViewModel, Binding : ViewBinding> : Fragment() {
protected abstract val viewModel: ViewModel
private var _binding: Binding? = null
protected val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
_binding = Binding.inflate(inflater, container, false) //This line not working
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initialize()
setupListeners()
observe()
}
abstract fun initialize()
abstract fun setupListeners()
abstract fun observe()
override fun onDestroyView() …Run Code Online (Sandbox Code Playgroud) 我使用 Android Studio 3.6-RC1 和构建工具版本 3.6.0-rc01 并遇到了 ViewBinding 功能的问题:
我有带有以下标记的 activity_test.xml 文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/view_merged"
layout="@layout/merge_view" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
和 merge_view.xml 带有以下标记:
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Merge view" />
</merge>
Run Code Online (Sandbox Code Playgroud)
活动代码如下所示:
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityTestBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.viewMerged.label.text = "New text"
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试从合并布局访问 TextView 时,应用程序抛出异常并显示消息 java.lang.NullPointerException: Missing required view with ID: viewMerged.
生成的绑定类如下所示:
public final class ActivityTestBinding implements ViewBinding {
@NonNull
private final …Run Code Online (Sandbox Code Playgroud) 通过数据绑定,我们有一个 DataBindingUtil 类,它有一个可以处理任何布局 id 的 inflate 方法:
binding = DataBindingUtil.inflate<ViewDataBinding>(inflater, layoutId, parent, false)
Run Code Online (Sandbox Code Playgroud)
对于视图绑定,似乎没有 ViewBindingUtil 类。Inflate 方法旨在在具体绑定类型上调用。但是如果您事先不知道具体的绑定类型怎么办?一种解决方案是在 layoutId 上运行 when 语句:
binding = when (layoutId) {
R.id.layout1 -> Layout1Binding.inflate(...)
R.id.layout2 -> Layout2Binding.inflate(...)
R.id.layout3 -> Layout3Binding.inflate(...)
etc...
}
Run Code Online (Sandbox Code Playgroud)
但与单行数据绑定相比,这是很多代码。有没有更好的办法?我找到了这个 3rd 方库,但它看起来像使用反射:https : //github.com/matsudamper/ViewBindingUtil
我正在制作一个基类,以便所有孩子的绑定都将设置在基类中
我已经做到了这一点
abstract class BaseActivity2<B : ViewBinding?, T : BaseViewModel?> : AppCompatActivity() {
private var viewBinding: B? = null
private var baseViewModel: T? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法在 oncreat() 中绑定视图,通常我们将视图绑定中的布局绑定为
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
Run Code Online (Sandbox Code Playgroud)
但我正在寻找基本活动的通用方式
我在选项卡布局中有 2 个片段,使用 ViewBinding 在它们之间快速切换会导致视图返回为 null。这是因为构建 FragmentXBinding 类的延迟吗?
使用示例:
chatadapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
binding.chatRecyclerView.smoothScrollToPosition(0);
}
});
Run Code Online (Sandbox Code Playgroud)
错误:
java.lang.NullPointerException: Attempt to read from field 'androidx.recyclerview.widget.RecyclerView com.iku.databinding.FragmentChatBinding.chatRecyclerView' on a null object reference
Run Code Online (Sandbox Code Playgroud) Android 中的View Binding被大力提倡作为findViewById()Kotlin 扩展甚至是 Kotlin 扩展的更好替代品,但由于某种原因,最基本的功能,如View在 Android Studio 的布局编辑器中按其 ID搜索 a的用法不起作用。
即使在官方 Ach 组件示例存储库中的视图绑定示例中,它也不起作用。
我们这里有:
fragment_blank.xml具有TextView与IDtextViewFragment如下:<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".InflateFragment">
<TextView
android:id="@+id/textViewFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
InflateFragment.kt将文本设置为此的片段TextView:override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding = FragmentBlankBinding.inflate(inflater, container, false)
fragmentBlankBinding = binding
binding.textViewFragment.text = getString(R.string.hello_from_vb_inflatefragment)
return …Run Code Online (Sandbox Code Playgroud) android ×10
kotlin ×2
abstraction ×1
androidx ×1
data-binding ×1
findviewbyid ×1
java ×1
jetpack ×1