Я хочу добавить фрагмент в Activity, который реализует его макет программно. Я просмотрел документацию по фрагментам, но там не так много примеров, описывающих то, что мне нужно. Вот тип кода, который я пытался написать:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Этот код компилируется, но вылетает при запуске, вероятно, потому что мой FragmentTransaction.add()
неверен. Как правильно это сделать?
ft.add(android.R.id.content, newFragment)
. Необходимо создать собственный макет и задать его идентификатор, только если контейнер фрагмента не является представлением содержимого действия.Вот что я придумал после прочтения комментария Тони Вонга :
...
...
Котлин
Если вы используете Kotlin, обязательно посмотрите, что предоставляют расширения Kotlin от Google, или просто напишите свой собственный.
источник
if (savedInstanceState == null)
перед созданием фрагмента, или после поворота экрана у вас будет два фрагмента или переупорядочивание фрагментов. Не используйтеadd
метод вообще! Толькоreplace
. Или у вас будет странное поведение.backStackStateName
строка это то, что определяется вами.main.xml
источник
Прочитав все ответы, я придумал элегантный способ:
в основном вам не нужно добавлять frameLayout в качестве контейнера вашего фрагмента, вместо этого вы можете добавить фрагмент прямо в корневой каталог Android.
ВАЖНО: не используйте замену фрагмента как большую часть подхода, показанного здесь, если только вы не возражаете потерять состояние экземпляра переменной фрагмента во время процесса восстановления .
источник
использование
источник
Для API уровня 17 или выше,
View.generateViewId()
решит эту проблему. Утилита метод предоставляет уникальный идентификатор, который не используется во время сборки.источник
Чтобы прикрепить фрагмент к действию программно в Kotlin, вы можете посмотреть следующий код:
MainActivity.kt
activity_main.xml
FragmentName.kt
Если вы знакомы с Расширениями в Kotlin, вы можете даже улучшить этот код, следуя этой статье.
источник