(Android -Kotlin)-如何使用视图绑定将按钮从包含的布局恢复为片段?

pinkon5k  于 2023-03-03  发布在  Kotlin
关注(0)|答案(1)|浏览(127)

我创建了一个特定的布局,以便在我的android应用程序中出现任何互联网错误时显示出来。
我们的想法是将这个布局包含在可能出现问题的片段中。

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/errorLayout">

    <com.google.android.material.imageview.ShapeableImageView
        android:id="@+id/imageView2"
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:layout_marginTop="150dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/error_24" />

    <com.google.android.material.textview.MaterialTextView
        android:id="@+id/textView24"
        android:layout_width="@dimen/fit_space"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="10dp"
        android:gravity="center"
        android:text="@string/error_loading"
        android:textColor="?attr/colorOnPrimary"
        android:textSize="26sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView2" />

    <com.google.android.material.textview.MaterialTextView
        android:id="@+id/textView26"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:gravity="center"
        android:text="@string/try_again"
        android:textColor="?attr/colorOnPrimary"
        android:textSize="16sp"
        android:textStyle="italic"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView24" />

    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonRefresh"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_marginTop="30dp"
        android:drawableEnd="@drawable/refresh_24"
        android:text="@string/refresh"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView26" />
</androidx.constraintlayout.widget.ConstraintLayout>

我尝试在我的片段中使用这个布局中的按钮,但没有成功,我包含了这样的按钮:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layoutContainerNews">

    <include
        android:id="@+id/errorLayoutNews"
        layout="@layout/item_layout_error"
        android:visibility="gone"/>

    <...content...>
</androidx.constraintlayout.widget.ConstraintLayout>

我能够正常显示和隐藏布局,但我无法成功地达到按钮,包括执行单击。
这是我尝试过的许多方法中的一种,都没有成功地执行按钮中的单击。

private fun configButtonRefreshClickListener() = with(binding) {
        val refreshButton = errorLayoutNews.buttonRefresh
        refreshButton.setOnClickListener {
            newsAdapter.refresh()
        }
    }

如何正确访问此按钮以执行单击?
先谢了。
编辑:我可以从上面的函数中使用相同的结构更改textView中的文本,但我无法单击按钮。

val errorLayout = errorLayoutNews
errorLayout.textView19.text = "Test"
zf2sa74q

zf2sa74q1#

若要使用视图绑定从片段中包含的布局访问按钮,可以执行以下步骤:

    • 第-1步:**在片段中,通过膨胀布局初始化View Binding对象:
private lateinit var binding: FragmentNewsBinding

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = FragmentNewsBinding.inflate(inflater, container, false)
    return binding.root
}
    • 步骤2:**在同一个片段中,使用binding. root. findViewById()从包含的布局中查找按钮:
private fun configButtonRefreshClickListener() {
    val refreshButton = binding.root.findViewById<MaterialButton>(R.id.buttonRefresh)
    refreshButton.setOnClickListener {
        newsAdapter.refresh()
    }
}

请注意,需要在绑定对象的root属性上调用findViewById(),因为按钮包含在另一个布局中。
通过这些更改,您应该能够访问按钮并单击它。

更新:

看起来您可以在代码中访问该按钮,但它没有响应单击。这可能是因为该按钮由于另一个视图与之重叠而没有获得单击事件,也可能是因为没有正确设置单击侦听器。
以下是您可以尝试解决此问题的一些方法:-

  • 检查是否有任何其他视图与按钮重叠:

您可以通过将按钮的背景色设置为其他颜色并检查其是否可见来检查此情况。如果按钮不可见,请尝试调整布局以使其可见。

  • 在包含按钮的视图上设置单击侦听器:

您可以尝试在包含按钮的视图上设置单击侦听器,而不是直接在按钮上设置单击侦听器。在您的情况下,这将是ID为"errorLayoutNews"的ConstraintLayout。您可以通过在视图上而不是按钮上调用setOnClickListener来完成此操作,如下所示:

private fun configButtonRefreshClickListener() {
    val errorLayout = binding.errorLayoutNews
    errorLayout.setOnClickListener {
        newsAdapter.refresh()
    }
}
  • 检查按钮是否启用:

可能是按钮被禁用了,无法接收单击事件。您可以通过调用refreshButton.isEnabled并确保它返回true来检查按钮是否被启用。如果按钮被禁用,您可以通过调用refreshButton.isEnabled = true来启用它。
希望,这些解决方案之一将帮助您解决这个问题,并获得按钮来响应点击,英沙真主。

相关问题