Android: добавление фрагмента в действие

Я довольно новичок в Android, поэтому у этого может быть очевидный ответ, но я не могу найти его.

Я пишу версию приложения калькулятора. Я хочу сделать так, чтобы, когда пользователь нажимает на одну из кнопок, начинается фрагмент (с большим количеством кнопок на нем, которые затем можно использовать для большего ввода).

Код фрагмента выглядит следующим образом:

import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class VariableMenu extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);} public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); } } 

С XML-макетом следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/Bx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="X" android:onClick="onButtonClicked"/> <Button android:id="@+id/By" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/Bx" android:layout_alignTop="@id/Bx" android:text="Y" android:onClick="onButtonClicked"/> <Button android:id="@+id/Bz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/By" android:layout_alignTop="@id/By" android:text="Z" android:onClick="onButtonClicked"/> </RelativeLayout> 

(Я знаю, что я не должен использовать жестко закодированные строки, но я исправлю это, как только я получу работу)

Я попытался добавить его с помощью фрагментации с помощью метода onTouch активирующей кнопки, например:

 public void onFragmentActivated(View v) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); VariableMenu fragment = new VariableMenu(); fragmentTransaction.add(R.layout.main, fragment); fragmentTransaction.commit(); } 

Но это дало ошибку, говоря, что «No view found for id: … (main) для фрагмента VariableMenu».

Итак, я сделал это для просмотра в основном файле XML:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> (Irrelevant things) <fragment android:id="@+id/Fragment" android:name="calculator.app.VariableMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/B1"/> (Irrelevant things) </RelativeLayout> 

Но это привело к тому, что фрагмент был там, как только была создана активность (и setContentView (R.layout.main); побежал).

Есть ли простой способ программно добавить и удалить фрагмент с пользовательским интерфейсом для активности?

Solutions Collecting From Web of "Android: добавление фрагмента в действие"

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

Вы можете добавить фрагмент в свой относительный макет, но для этого вам нужно будет присвоить ему соответствующие параметры макета, чтобы его можно было разместить. Было бы проще просто создать FrameLayout в относительном макете, который обертывает его содержимое, а затем добавлять туда фрагмент.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:id="@+id/FragmentContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/B1"/> </RelativeLayout> 

затем

 fragmentTransaction.add(R.id.FragmentContainer, fragment);