#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) также не помогли. По-прежнему появляется пустой экран при нажатии кнопки «Назад».