【问题标题】:how does databinding work in this scenario在这种情况下数据绑定如何工作
【发布时间】:2021-08-15 22:58:36
【问题描述】:

我有一个活动及其布局,我正在使用 ActivityQuotesBinding 访问 xml 字段,activity_quotes.xml 没有数据绑定信息。

ActivityQuotesBinding 是如何创建的。

有人可以分享一下这个吗

我想为片段做类似的事情,但不知道绑定在下面的代码中是如何工作的

提前致谢 回复

 <?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".ui.quotes.QuotesActivity">

    <TextView
        android:id="@+id/textView_quotes"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintHeight_percent="0.55"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:scrollbars="vertical"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        tools:text="I like pineapples. - Thomas Jefferson"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <EditText
        android:id="@+id/editText_quote"
        android:layout_width="0dp"
        app:layout_constraintWidth_percent="0.7"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:hint="Quote"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView_quotes"
        app:layout_constraintVertical_bias="0.0" />

    <EditText
        android:id="@+id/editText_author"
        android:layout_width="0dp"
        app:layout_constraintWidth_percent="0.7"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:hint="Author"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText_quote"
        app:layout_constraintVertical_bias="0.0" />

    <Button
        android:id="@+id/button_add_quote"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:backgroundTint="?colorAccent"
        android:text="Add Quote"
        android:textColor="@android:color/white"
        app:layout_constraintBottom_toBottomOf="@+id/editText_author"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/editText_quote"
        app:layout_constraintTop_toTopOf="@+id/editText_quote"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintWidth_percent="0.25" />
</androidx.constraintlayout.widget.ConstraintLayout>

活动

class QuotesActivity : AppCompatActivity() {

    private lateinit var binding: ActivityQuotesBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityQuotesBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        initializeUI()
    }

    private fun initializeUI() {
        val factory = InjectorUtils.provideQuotesViewModelFactory()
        val viewModel = ViewModelProviders.of(this, factory)
                .get(QuotesViewModel::class.java)
        viewModel.getQuotes().observe(this, Observer {quotes ->
            val stringBuilder = StringBuilder()
            quotes.forEach {quote ->
                stringBuilder.append("$quote\n\n")
            }
            binding.textViewQuotes.text = stringBuilder.toString()
        })

        binding.buttonAddQuote.setOnClickListener {
            val quote = Quote(binding.editTextQuote.text.toString(), binding.editTextAuthor.text.toString())
            viewModel.addQuotes(quote)
            binding.editTextQuote.setText("")
            binding.editTextAuthor.setText("")
        }

    }
}

【问题讨论】:

  • 那么,如果没有 XML 中的 &lt;layout&gt; 标记,如何使用 dataBinding?

标签: android kotlin mvvm data-binding android-livedata


【解决方案1】:

您实际上是在使用视图绑定,这与数据绑定完全不同。

当您在模块中指定启用视图绑定时,您的所有布局都将映射到遵循您注意到“LayoutfilenameBinding”的命名约定的类。

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

因此,要使用视图绑定访问片段布局,您必须执行几乎相同的代码,但会有一些差异。

假设您的片段的布局是 fragment_layout.xml

private var _binding: FragmentLayoutBinding? = 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 = FragmentLayoutBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

来源: https://developer.android.com/topic/libraries/view-binding

【讨论】:

  • 非常感谢,请告诉我何时使用视图绑定和数据绑定
  • 非常简单,从不使用数据绑定。您正在使用视图绑定,这是目前做您正在做的事情的最佳方法!
  • 这个答案总结了您访问您的视图/XML 的选项,虽然作者更喜欢数据绑定,但我强烈建议您继续使用视图绑定stackoverflow.com/a/58155708/11793333
  • 好的,非常感谢您对此的快速回复,非常有帮助
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2018-06-16
  • 2017-06-21
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多