web-dev-qa-db-fra.com

Définition de la taille d'un DialogFragment

J'ai essayé de nombreuses commandes pour configurer la taille de mon DialogFragment. Il ne contient qu'un sélecteur de couleurs, j'ai donc supprimé l'arrière-plan et le titre de la boîte de dialogue:

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(
    new ColorDrawable(Android.graphics.Color.TRANSPARENT));

Mais je veux aussi positionner la boîte de dialogue où je veux et c'est problématique. J'utilise:

WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
params.width = LayoutParams.WRAP_CONTENT;
params.height =  LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.LEFT;
getDialog().getWindow().setAttributes(params);

Mais un (gros) obstacle demeure: même si mon volet de dialogue est invisible, il a quand même une certaine taille, et il limite les positions de mon dialogue. Le LayoutParams.WRAP_CONTENT sont là pour limiter la taille de ce volet à mon sélecteur de couleurs, mais pour une raison quelconque, cela ne fonctionne pas.

Quelqu'un a-t-il pu faire quelque chose de similaire?

25
Teovald

Après quelques essais et erreurs, j'ai trouvé la solution.

voici l'implémentation de ma classe DialogFragment:

public class ColorDialogFragment extends SherlockDialogFragment {

    public ColorDialogFragment() {
    //You need to provide a default constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, 
                     ViewGroup container,
                     Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.dialog_color_picker, container);
    // R.layout.dialog_color_picker is the custom layout of my dialog
    WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes();
    wmlp.gravity = Gravity.LEFT;
    return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.colorPickerStyle);
    // this setStyle is VERY important.
    // STYLE_NO_FRAME means that I will provide my own layout and style for the whole dialog
    // so for example the size of the default dialog will not get in my way
    // the style extends the default one. see bellow.        
    }

  }

R.style.colorPickerStyle correspond à:

<style name="colorPickerStyle" parent="Theme.Sherlock.Light.Dialog">
    <item name="Android:backgroundDimEnabled">false</item>
    <item name="Android:cacheColorHint">@Android:color/transparent</item>
    <item name="Android:windowBackground">@Android:color/transparent</item>
</style>

J'étends simplement un style de dialogue par défaut avec mes besoins.

Enfin, vous pouvez invoquer cette boîte de dialogue avec:

private void showDialog() {
   ColorDialogFragment newFragment = new ColorDialogFragment();
   newFragment.show(getSupportFragmentManager(), "colorPicker");
   }   
22
Teovald

j'ai rencontré une question similaire qui est que vous ne pouvez pas définir la largeur et la hauteur du dialogFragment dans le code, après plusieurs essais, j'ai trouvé une solution;

voici les étapes pour personnaliser DialogFragment:

1. gonfler la vue personnalisée de xml sur la méthode

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().setCanceledOnTouchOutside(true);

    View view = inflater.inflate(R.layout.XXX,
            container, false);
    //TODO:findViewById, etc
    return view;
}

2. définissez la largeur et la hauteur de votre boîte de dialogue dans onResume (), rappelez-vous dans onResume ()/onStart (), semble ne pas fonctionner dans une autre méthode

public void onResume()
{
    super.onResume();
    Window window = getDialog().getWindow();
    window.setLayout(width, height);
    window.setGravity(Gravity.CENTER);
    //TODO:
}  
45
ruidge

Pour mon cas d'utilisation, je voulais que DialogFragment corresponde à la taille d'une liste d'éléments. La vue fragmentée est un RecyclerView dans une mise en page appelée fragment_sound_picker. J'ai ajouté un wrapper RelativeLayout autour du RecyclerView.

J'avais déjà défini la hauteur de la vue d'élément de liste individuelle avec R.attr.listItemPreferredHeight, dans une mise en page appelée item_sound_choice.

DialogFragment obtient une instance de LayoutParams à partir de RecyclerView de la vue gonflée, ajuste la hauteur de LayoutParams à un multiple de la longueur de la liste et applique les LayoutParams modifiés à la vue parent gonflée.

Le résultat est que DialogFragment encapsule parfaitement la courte liste de choix. Il comprend le titre de la fenêtre et les boutons Annuler/OK.

Voici la configuration dans DialogFragment:

// SoundPicker.Java
// extends DialogFragment
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(getActivity().getString(R.string.txt_sound_picker_dialog_title));

    LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    View view = layoutInflater.inflate(R.layout.fragment_sound_picker, null);
    RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv_sound_list);
    rv.setLayoutManager(new LinearLayoutManager(getActivity()));

    SoundPickerAdapter soundPickerAdapter = new SoundPickerAdapter(getActivity().getApplicationContext(), this, selectedSound);
    List<SoundItem> items = getArguments().getParcelableArrayList(SOUND_ITEMS);
    soundPickerAdapter.setSoundItems(items);
    soundPickerAdapter.setRecyclerView(rv);
    rv.setAdapter(soundPickerAdapter);

    // Here's the LayoutParams setup
    ViewGroup.LayoutParams layoutParams = rv.getLayoutParams();
    layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
    layoutParams.height = getListItemHeight() * (items.size() + 1);
    view.setLayoutParams(layoutParams);

    builder.setView(view);
    builder.setCancelable(true);

    builder.setNegativeButton(Android.R.string.cancel, new DialogInterface.OnClickListener() {
        // ...
    });

    builder.setPositiveButton(R.string.txt_ok, new DialogInterface.OnClickListener() {
        // ...
    });

    return builder.create();
}

@Override
public void onResume() {
    Window window = getDialog().getWindow();
    window.setLayout(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    super.onResume();
}

private int getListItemHeight() {
    TypedValue typedValue = new TypedValue();
    getActivity().getTheme().resolveAttribute(R.attr.listPreferredItemHeight, typedValue, true);
    DisplayMetrics metrics = new Android.util.DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    return (int) typedValue.getDimension(metrics);
}

Voici fragment_sound_picker:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/rv_sound_list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />
</RelativeLayout>
5
Ari Lacenski

utilisez ce code pour redimensionner Dialog Fragment Android

public void onResume() {
        super.onResume();

        super.onResume();
        Window window = getDialog().getWindow();
        window.setLayout(250, 100);
        window.setGravity(Gravity.RIGHT);
    }
2
Mahi Saini