8 votes

Comment ajouter des fragments de manière programmatique dans relativelayout ?

J'ai conçu un RelativeLayout. J'essaie d'y ajouter un fragment. Il se chevauche. Que dois-je faire pour qu'ils se retrouvent l'un en dessous de l'autre ?

    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();

//Les vues de monFragment et de monFragment2 se chevauchent bien que j'aie défini l'orientation à la verticale.

<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"/>

4voto

Napolean Points 383

Nous pouvons le faire comme suit :

Classe d'activité dans laquelle la disposition relative est présente. Que cette disposition relative (mParentLayout) soit l'élément Root de la hiérarchie des vues de l'activité. Et le fragment à ajouter à la disposition relative sera mGridFragment à une position en dessous du bouton (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;
    }
}

Classe de fragment correspondante qui doit être positionnée dans la mise en page de l'activité.

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;
    }

}

1voto

Shawn Maybush Points 58

Vous devez définir des paramètres de mise en page dans les vues de votre fragment.

Sont-ils en XML ou en hardCode ?

S'ils sont codés en dur, vous devrez récupérer le FrameLayout Wrapper que Google place sur toutes les vues du fragment en utilisant la bibliothèque de support rétrocompatible et définir ses paramètres de relativelayout soit dans le onlayout ou le onMeasure de votre vue.

Sinon, s'il s'agit de XML, il suffit de définir les règles relatives.

0voto

Alex Points 15303

Je pense que ça devrait être LinearLayout

0voto

Tatarize Points 490

Quick and Dirty semble être un peu mieux. Si vous connaissez déjà votre disposition, vous pouvez gagner quelques étapes, et je sais qu'un ensemble géant de blocs if (X instanceof Class) est mal vu, mais il est assez polyvalent.

    @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);
        }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X