【问题标题】:Did not return View from onCreateView没有从 onCreateView 返回 View
【发布时间】:2021-08-28 12:35:24
【问题描述】:

在添加 setFragmentResultListener 后,我使用它来将从另一个片段获取的数据添加到表中,我得到以下 logcat 错误:

 2021-06-11 16:45:13.689 29090-29090/com.example.nlp_expense_tracker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.nlp_expense_tracker, PID: 29090
java.lang.IllegalStateException: Fragment HistoryFragment{dcdb784} (1d63faf6-f003-4a57-a9ee-a3ea2331063e id=0x7f0901bb tag=android:switcher:2131296699:1) did not return a View from onCreateView() or this was called before onCreateView().
    at androidx.fragment.app.Fragment.requireView(Fragment.java:1964)
    at com.example.nlp_expense_tracker.fragments.HistoryFragment.onCreate(HistoryFragment.kt:30)

我也尝试在 onCreate 函数中添加表格部分的代码,但我得到了同样的错误。

这是我的片段代码: 如果有一种方法可以更简单地编写此代码,我也总是愿意接受建议。 刚开始学习编程。

class HistoryFragment : Fragment() {

private val dataStore = ArrayList<String>()
private val dataAmount = ArrayList<String>()
private val dataDate = ArrayList<String>()

private lateinit var textview2: TextView
private lateinit var textView3: TextView
private lateinit var textView4: TextView
private lateinit var store: TextView
private lateinit var amount: TextView
private lateinit var date: TextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?):
        View {val view: View = inflater.inflate(R.layout.fragment_history, container, false)

    textview2 = view.findViewById(R.id.textView2)
    textView3 = view.findViewById(R.id.textView3)
    textView4 = view.findViewById(R.id.textView4)

    val table : TableLayout = requireView().findViewById(R.id.tableHistorie)
    val row : TableRow = requireView().findViewById(R.id.tableRowOne)

    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResultListener("requestKey") { requestKey, bundle ->
        // We use a String here, but any type that can be put in a Bundle is supported
        val result = bundle.getString("bundleKey")
        dataStore.add(result.toString())
        for(i in dataStore.indices)
        {
            val storeName = dataStore [i]
            store.text = storeName

        }
        row.addView(store)
        table.addView(row)

    }
    setFragmentResultListener("requestKey2") { requestKey, bundle ->
        // We use a String here, but any type that can be put in a Bundle is supported
        val result2 = bundle.getString("bundleKey2")
        // Do something with the result
        dataAmount.add(result2.toString())
        for(i in dataAmount.indices)
        {
            val storeName = dataAmount [i]
            amount.text = storeName

        }
        row.addView(amount)
        table.addView(row)
    }
    setFragmentResultListener("requestKey3") { requestKey, bundle ->
        // We use a String here, but any type that can be put in a Bundle is supported
        val result3 = bundle.getString("bundleKey3")
        // Do something with the result
        dataDate.add(result3.toString())
        for(i in dataDate.indices)
        {
            val storeName = dataDate [i]
            date.text = storeName

        }
        row.addView(date)
        table.addView(row)
    }


    return view
}

}

【问题讨论】:

    标签: android kotlin fragment illegalstateexception


    【解决方案1】:

    Logcat 显示,问题是因为在 onCreateView() 返回之前调用了requireView()。将代码中的requireView() 替换为view

    val table : TableLayout = view.findViewById(R.id.tableHistorie)
    val row : TableRow = view.findViewById(R.id.tableRowOne)
    

    【讨论】:

    • 谢谢,它成功了。但是当我想将另一个片段中的数据提交到这个片段时,我现在得到一个新的 logcat 错误。指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView(): java.lang.IllegalStateException: 指定的孩子已经有父母。您必须首先在孩子的父母上调用 removeView()。在 android.view.ViewGroup.addViewInner(ViewGroup.java:5235) 在 android.view.ViewGroup.addView(ViewGroup.java:5064)
    • 我认为,多次调用table.addView(row) 会给出此异常。
    • 你知道有什么解决办法吗?
    • 如果你想为每个结果添加 View 到同一行,那么不需要在 Listeners 中添加它,因为你已经在 xml 中添加了。只需从您的听众中删除 table.addView(row)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2016-08-08
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多