android-fragments Android应用中TextView的片段处理

1szpjjfi  于 2022-11-13  发布在  Android
关注(0)|答案(3)|浏览(232)

我很难处理我的一个Android应用程序中的碎片。有些东西看起来很奇怪,别人看一看可能会有一些启示。
以下是片段的XML:

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:id="@+id/theFragmentID"
    tools:context=".NiceFragment">

    <TextView
        android:id="@+id/labelOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="Place_Holder-One" />
    <TextView
        android:id="@+id/labelTwo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="Place_Holder=Two" />
    <EditText
        android:id="@+id/inpNew"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="60px" />
    .....
</FrameLayout>

下面是我在应用程序中的某个地方(即在片段的 onCreateView() 方法中)的一些Kotlin代码:

val labelOne = fragHandle.findViewById<TextView>(R.id.labelOne)
labelOne.text = "Some interesting sentence"
val labelTwo = fragHandle.findViewById<TextView>(R.id.labelTwo)
labelTwo.text = "Some other very interesting sentence"

最后,这是我在上面代码的最后一行中得到的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at me.soft.myapp.NiceFragment.onCreateView(NiceFragment.kt:99)

上面的四行Kotlin代码可能更适合放在片段的 onViewCreated() 方法中,但我的问题是:
为什么4号线出现问题,而2号线却能正常工作?
在我看来,labelOnelabelTwo 只是两个完全等价的对象。
我还尝试将这段代码放在 onViewCreated() 中,但问题仍然存在。
我还能漏掉什么细节?

pbgvytdp

pbgvytdp1#

请检查写入Kotlin类的导入xml。将导入错误的XML文件。

bsxbgnwa

bsxbgnwa2#

当使用Kotlin时,有一个非常好的选择,当处理片段时。你也应该考虑到这一点。移动你的布局名称到片段构造函数,并做如下代码。

class AccountFragment : Fragment(R.layout.fragment_account) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val labelOne = view.findViewById<TextView>(R.id.labelOne)
    
    }
}

在片段中使用onViewCreated而不是onCreateView始终是一个很好的做法。
快乐编码

o0lyfsai

o0lyfsai3#

在我看来,您可以使用viewBinding
把这个加到你的Gradle里

viewBinding {
      enabled = true
}

在你的片段中可以这样使用绑定

private lateinit var binding: FragmentHomeNavBinding
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = FragmentHomeNavBinding.inflate(LayoutInflater.from(requireContext()), container, false)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding.apply {
        myTextView.text = "some text"
    }
}

viewBinding替换了findViewById,并且ViewBinding具有空值安全和类型安全

相关问题