Как добавить фрагменты программно в relativelayout

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

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); FragmentTest myFragment = new FragmentTest(); t.add(layout.getId(), myFragment, "myFirstFragment"); FragmentTest myFragment2 = new FragmentTest(); t.add(layout.getId(), myFragment2, "mySecondFragment"); t.commit(); 

// Представления перекрытия myFragment и myFragment2, хотя я настроил ориентацию на вертикальную.

 <RelativeLayout android:id="@+id/idll1" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_marginLeft="10sp" android:layout_marginRight="0sp" android:layout_marginTop="10sp" android:layout_weight="1" android:paddingBottom="5dp" android:paddingLeft="10dp" android:paddingRight="5dp" android:paddingTop="5dp" android:orientation="vertical"/> 

Solutions Collecting From Web of "Как добавить фрагменты программно в relativelayout"

Мы можем сделать это следующим образом:

Класс активности, в котором присутствует относительный макет. Пусть этот относительный макет (mParentLayout) является корневым элементом иерархии представлений активности. И фрагмент, который будет добавлен к относительной компоновке, будет mGridFragment в позиции ниже Button (mGridBtn).

 public class DroidOpsActivity extends FragmentActivity implements OnClickListener { private RelativeLayout mParentLayout = null; private Button mGridBtn = null; private FragmentManager mFragmentMgr = null; private FragmentTransaction mFragmentTransc = null; private Fragment mGridFragment = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initialize(); } private void initialize() { setContentView(R.layout.activity_droid_ops); mParentLayout = (RelativeLayout) findViewById(R.id.parent_layout); mGridBtn = (Button) findViewById(R.id.grid_button); mFragmentMgr = getSupportFragmentManager(); registerListener(); } private void registerListener() { mGridBtn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.grid_button: loadFragment(); mGridBtn.setEnabled(false); break; } } private void loadFragment() { mGridFragment = new DroidOpsFragments(); mFragmentTransc = mFragmentMgr.beginTransaction(); mFragmentTransc.add(mParentLayout.getId(), mGridFragment); mFragmentTransc.addToBackStack(null); mFragmentTransc.commit(); } public RelativeLayout.LayoutParams fetchLayoutParams() { RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); // We can add any rule available for RelativeLayout and hence can position accordingly params.addRule(RelativeLayout.BELOW, mGridBtn.getId()); return params; } } 

Соответствующий класс фрагментов, который должен быть размещен в макете деятельности.

 public class DroidOpsFragments extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.view_word_grid, null); // Here we are fetching the layoutParams from parent activity and setting it to the fragment's view. view.setLayoutParams(((DroidOpsActivity) activity).fetchLayoutParams()); return view; } } 

Вы должны установить макеты прамам в представлениях Фрагмента.

Являются ли они XML или hardCode?

Если они являются жестким кодом, вам нужно будет получить фреймворк FrameLayout, который Google размещает на всех фрагментах, используя обратную совместимую библиотеку поддержки, и задает ее параметры relativelayout либо в onlayout вашего вида, либо onMeasure.

В противном случае, если они являются XML, просто установите относительные правила.

Я думаю, это должно быть LinearLayout

Быстрая и грязная кажется немного лучше. Если вы уже знаете свой макет, вы можете сэкономить несколько шагов, и я знаю гигантский, если (X instanceof Class) набор блоков нахмурился, он довольно универсален.

  @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ViewGroup.LayoutParams p = view.getLayoutParams(); if (p instanceof CoordinatorLayout.LayoutParams) { CoordinatorLayout.LayoutParams params = ((CoordinatorLayout.LayoutParams)p); params.gravity = Gravity.END | Gravity.BOTTOM; view.setLayoutParams(params); } else if (p instanceof RelativeLayout.LayoutParams) { RelativeLayout.LayoutParams params = ((RelativeLayout.LayoutParams)p); params.addRule(RelativeLayout.ALIGN_BOTTOM); view.setLayoutParams(params); } }