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?
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");
}
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:
}
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>
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);
}