Не найдено представления для идентификатора 0x7f0a000e для параметров фрагмента фрагмента

#android #android-fragments

Вопрос:

Я новичок в Android, и благодаря помощи коллег-сойцев я могу хорошо работать. Я внедряю элементы панели приложений для перехода к соответствующим фрагментам из MainActivity. Следующий код является частью MainActivity.

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up buttonAction, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        switch (id) {
            case R.id.action_settings:
                Fragment fragment = new SettingsFragment();
                FragmentManager fragmentManager = this.getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.SettingsFragment, fragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
                break;
            case R.id.action_kyc:
                // go to kycfragment
                break;
            case R.id.action_about:
                // go to aboutfragment
                break;
            default:
                break;
        }

        return super.onOptionsItemSelected(item);
    }
 

Я получаю исключение из незаконного аргумента «Не найдено представление для идентификатора 0x7f0a000e для фрагментных настроек фрагмента».

Много просматривал здесь, как внутри, так и снаружи. Никто из них мне не помог.

Пожалуйста, дайте мне знать, в чем причина ошибки и как ее исправить.

Выдержка из стека приведена ниже:

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ptimer, PID: 7759
    java.lang.IllegalArgumentException: No view found for id 0x7f0a000e (com.example.ptimer:id/SettingsFragment) for fragment SettingsFragment{5c8b099} (86b09f6f-49b4-470e-9753-e5acd603164c id=0x7f0a000e)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:513)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
I/Process: Sending signal. PID: 7759 SIG: 9
 

Ответ №1:

Как выглядит ваш MainActivity XML — макет? Цитируя ваш код:

 fragmentTransaction.replace(R.id.SettingsFragment, fragment);
 

Ваша проблема, скорее всего, заключается в том, что SettingsFragment в вашем макете нет представления с идентификатором.

Первый приведенный аргумент replace должен указывать на контейнер фрагментов в файле макета. Например, если ваш макет включает:

 <androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
 

Тогда это было бы fragmentTransaction.replace(R.id.fragment_container, fragment);
См. также https://developer.android.com/guide/fragments/create#add и https://developer.android.com/guide/fragments/transactions#add-remove

В зависимости от вашего варианта использования вы также можете открыть свои настройки в новом действии вместо замены фрагмента внутри MainActivity .

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

1. Спасибо за быстрый ответ. Но я получаю тот же тип ошибки. Из вашего заявления я понял, что fragmentTransaction.replace(R.id.SettingsFragment, fragment); его следует читать как fragmentTransaction.replace("id of the current fragment to be replaced", "destination fragment that is to be displayed"); . При запуске приложения отображается фрагмент запуска. Поэтому я включил сюда фрагмент запуска. Но все равно я получаю ту же ошибку-Не найдено представления для идентификатора 0x7f0a0006 (com.example.ptimer:идентификатор/Фрагмент запуска) для фрагмента настройки фрагмента.

2. Нет, вам нужен идентификатор контейнера фрагмента, а не текущего фрагмента. Если этой информации вам недостаточно, вам нужно будет добавить файл макета в свой вопрос

3. Это прекрасно решило мою проблему. Большое спасибо. Уверен, что я буду возвращаться к этому снова и снова для своих вопросов. Хороший форум.

4. Я вижу, что стрелка ВВЕРХ отсутствует после перехода к новому фрагменту из фрагмента запуска. Также при нажатии кнопки «Назад» фрагмент пусковой установки остается пустым. Есть ли еще какие-то изменения в коде, необходимые для их исправления?

5. Согласно документации Android, как FragmentTransaction.setReorderingAllowed(true), так и FragmentTransaction.addToBackStack(null) также не помогли. По-прежнему появляется пустой экран при нажатии кнопки «Назад».