Приложение Kotlin вылетает, когда я пытаюсь перейти через BottomNavigation

#android #android-studio #kotlin

#Android #android-studio #kotlin

Вопрос:

Я новичок в 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()
    }


}

 

Один из классов фрагментов

 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>
 

Ответ №1:

Идентификатор, переданный в FragmentTransaction.add() , в вашем случае R.id.fragment_create должен быть дочерним элементом макета, указанного в setContentView() .

Для справки: представление является дочерним элементом другого представления, если оно объявлено внутри родительского представления в XML. т.е. a TextView внутри a RelativeLayout является дочерним элементом RelativeLayout

Комментарии:

1. В учебном пособии я заметил, что оно использовалось LinearLayout вместо RelativeLayout . Я обновил ошибку и добавил XML-файл. Можете ли вы проверить еще раз?

Ответ №2:

Как я уже сказал, я совершенно новичок в Kotlin, и я все еще привыкаю к тому, как и что должно отображаться, если я пытаюсь использовать Fragment. Я забыл, что мне нужно FrameLayout , чтобы мой main_activity.xml

Как я добавил FrameLayout в свой main_activity.xml файл, он начал работать так, как я хотел.

Ответ №3:

Эта строка в вашей openFragment функции

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

сообщает ему поместить фрагмент в ViewGroup с идентификатором «контейнер». Но ваш макет не содержит ViewGroup с этим идентификатором. Проверьте свой activity_main.xml макет и убедитесь, что он имеет этот идентификатор.

Комментарии:

1. Если это не проблема, пожалуйста, добавьте свой макет активности в свой вопрос, чтобы мы могли его увидеть.

2. В любом случае мне удалось найти ошибку. Мне просто нужно было добавить макет фрейма в Main_activity.xml досье. Как я уже сказал, я совершенно новичок в Kotlin и Android Studio, поэтому я просто привыкаю к тому, как должны отображаться фрагменты