标签: android-viewbinding

RecyclerView 适配器类中 Android 视图绑定的正确方法是什么?

这是我在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

java android android-recyclerview android-viewbinding

20
推荐指数
3
解决办法
1万
查看次数

如何在Android中使用视图绑定

我一直在使用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....

android findviewbyid android-viewbinding

19
推荐指数
6
解决办法
2万
查看次数

未生成视图绑定

我目前正在尝试新的 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)

android android-layout android-studio android-viewbinding

18
推荐指数
2
解决办法
8287
查看次数

Android View Binding - 清除Fragment生命周期中的绑定

为什么在 Fragment 中实现Android 视图绑定时清除 in 很重要bindingonDestroyView

如文档所示,在片段中使用视图绑定,以及 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

17
推荐指数
1
解决办法
1万
查看次数

如何使用视图绑定制作 BaseFragment

我的基础片段

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 kotlin jetpack androidx android-viewbinding

16
推荐指数
2
解决办法
4463
查看次数

如何从包含合并标记的布局访问视图包含在另一个布局中?

我使用 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)

android android-viewbinding

13
推荐指数
1
解决办法
4157
查看次数

视图绑定:有没有办法在给定布局 id 的情况下对布局进行泛型膨胀?

通过数据绑定,我们有一个 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

android android-databinding android-viewbinding

12
推荐指数
0
解决办法
419
查看次数

如何将抽象与 ViewBinding 与基本活动一起使用?

我正在制作一个基类,以便所有孩子的绑定都将设置在基类中

我已经做到了这一点

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)

但我正在寻找基本活动的通用方式

android abstraction generic-programming android-viewbinding

11
推荐指数
3
解决办法
3347
查看次数

快速片段切换视图绑定 null

我在选项卡布局中有 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)

data-binding android android-fragments android-viewbinding

11
推荐指数
1
解决办法
4451
查看次数

在 Android Studio 中,XML 布局中视图 ID 的“查找用法”操作不适用于 Android 视图绑定

Android 中的View Binding被大力提倡作为findViewById()Kotlin 扩展甚至是 Kotlin 扩展的更好替代品,但由于某种原因,最基本的功能,如View在 Android Studio 的布局编辑器中按其 ID搜索 a的用法不起作用。

即使在官方 Ach 组件示例存储库中的视图绑定示例中,它也不起作用。
我们这里有:

  1. XML布局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)
  1. 使用视图绑定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 android-studio android-viewbinding

11
推荐指数
0
解决办法
238
查看次数