【问题标题】:Kotlin App crashes when I try to navigate through BottomNavigation当我尝试通过 BottomNavigation 导航时,Kotlin 应用程序崩溃
【发布时间】:2020-12-08 17:17:48
【问题描述】:

我对 Kotlin 完全陌生,试图按照教程构建应用程序,但试图导航到碎片它完全崩溃了。

这是我尝试导航到另一个片段后得到的结果:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.application, PID: 10385
    java.lang.IllegalArgumentException: No view found for id 0x7f08005a (com.example.application:id/container) for fragment Create{b25f2a9 (ffc51d9a-d9bb-425d-a264-1a68c77134fb) id=0x7f08005a}
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:875)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这就是我尝试导航到片段的方式。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val bottomNavigation: BottomNavigationView = findViewById(R.id.nav_view)
        bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)



    }
    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.menu_home -> {

                val fragment_main = Main.newInstance()
                openFragment(fragment_main)
                return@OnNavigationItemSelectedListener true
            }
            R.id.menu_create -> {

                val fragment_create = Create.newInstance()
                openFragment(fragment_create)
                return@OnNavigationItemSelectedListener true
            }
            R.id.menu_your -> {

                val fragment_your_articles = YourArticles.newInstance()
                openFragment(fragment_your_articles)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }




    private fun openFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.container, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }


}

Fragment 类之一

class Create : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
        inflater.inflate(R.layout.fragment_create, container, false)

    companion object {
        fun newInstance(): Create = Create()
    }

}

我想知道我犯了什么错误导致崩溃以及如何修复它。

片段之一的这个xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">

   <TextView
       android:id="@+id/textView4"
       android:layout_width="100dp"
       android:layout_height="50dp"
       android:layout_marginStart="150dp"
       android:layout_marginLeft="150dp"
       android:layout_marginTop="200dp"
       android:text="@string/create_screen"
       />
</LinearLayout>

【问题讨论】:

    标签: android android-studio kotlin


    【解决方案1】:

    传递给 FragmentTransaction.add() 的 id,在您的情况下为 R.id.fragment_create,必须是 setContentView() 中指定的布局的子级。

    寻求帮助:如果在 XML 的父视图中声明一个视图,则它是另一个视图的子视图。 IE。 RelativeLayout 内部的 TextViewRelativeLayout 的子代

    【讨论】:

    • 在教程中我注意到它被使用 LinearLayout 而不是 RelativeLayout 。我更新了错误并添加了 xml 文件。你能再检查一下吗?
    【解决方案2】:

    正如我所说,我对 Kotlin 完全陌生,而且我仍然习惯于尝试使用 Fragment 时必须显示的方式和内容。我忘了我需要FrameLayout 到我的main_activity.xml

    当我在我的main_activity.xml 文件中添加FrameLayout 时,它开始按我的意愿工作。

    【讨论】:

      【解决方案3】:

      openFragment 函数中的这一行

      transaction.replace(R.id.container, fragment)
      

      告诉它将片段放置在 ID 为“容器”的 ViewGroup 中。但是您的布局不包含具有此 ID 的 ViewGroup。检查您的 activity_main.xml 布局并确保它有一个具有该 ID 的布局。

      【讨论】:

      • 如果这不是问题,请将您的活动布局添加到您的问题中,以便我们查看。
      • 无论如何我设法找到了错误。我只需要在 Main_activity.xml 文件中添加框架布局。正如我所说,我对 Kotlin 和 Android Studio 完全陌生,所以我刚刚习惯了片段的显示方式
      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多