2013-07-19 3 views
3

Je crée toujours dialogue personnalisée sans titre pour le rendre centré (à la fois verticale et horizontale) à l'aide android:windowNoTitle dans styles.xml ou requestWindowFeature(Window.FEATURE_NO_TITLE) mais certains de mes dialogues sont centre pas horizontal, par exemple cette boîte de dialogue:dialogue Android sans titre non centrée horizontalement

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center"  
android:padding="20dp" 
android:gravity="center" 
android:background="@drawable/dialog_bg" > 

<include 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    layout="@layout/loading_s"/> 

<TextView 
    android:id="@+id/message" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:gravity="center_vertical" 
    android:text="@string/loading" 
    android:textColor="@color/dialog_text" 
    android:textSize="@dimen/dialog_title_text_size" /> 

</LinearLayout> 

voici comment créer de dialogue:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
    View v = LayoutInflater.from(getActivity()).inflate(R.layout.dlg_progress, null); 
    Dialog dlg = new Dialog(getActivity(), R.style.My_Dialog_Style); //My_Dialog_Style contains android:windowNoTitle = true 
    dlg.setContentView(v); 
    dlg.setCanceledOnTouchOutside(false); 
    dlg.setCancelable(true); 
    return dlg; 
} 

Et voici h OW il apparaît à l'écran

enter image description here

Si je supprime android:windowNoTitle attribuer ce spectacle de dialogue correctement de sorte que le problème ne se produit lors de l'utilisation de dialogue sans titre.

Est-ce que quelqu'un sait pourquoi cela se produit et comment faire un dialogue toujours centré sur l'écran?

+0

Comment créez-vous le dialogue? Est-ce un 'DialogFragment'? – brillenheini

+0

Oui, il s'agit d'un DialogFragment, voir la mise à jour pour voir comment je crée des plis de dialogue. – Wayne

Répondre

1

Avez-vous essayé de regarder ce fil?

How to align custom dialog centre in android ?

android:layout_gravity="center" 

Il ressemble à son juste un changement de mise en page, ou essayez d'utiliser relativeLayout ou LinearLayout au lieu de FrameLayout

+0

Vous pouvez voir que j'ai utilisé 'android: layout_gravity =" center "' déjà. Beaucoup de mes boîtes de dialogue utilisent 'LinearLayout' comme conteneur de dialogue, mais il s'affiche correctement, donc je ne pense pas que le problème est causé par LinearLayout. – Wayne

2

Lorsque vous utilisez Builder et définir une vue personnalisée avec setView, il ne devrait pas être nécessaire pour supprimer le titre du dialogue et la boîte de dialogue doit être centrée.

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    builder.setView(inflater.inflate(R.layout.dlg_progress, null)); 
    return builder.create(); 
} 

Ceci est très similaire à la façon dont cela est fait dans les docs: Creating a Custom Layout

+0

Merci, mais je veux créer un dialogue entièrement personnalisé et compliqué, donc je dois utiliser Dialog que juste AlertDialog.Builder. – Wayne

+0

@Wayne Ensuite, vous pourriez utiliser 'onCreateView', comme vous le feriez avec un fragment normal, au lieu de' onCreateDialog'. Pour supprimer le titre, utilisez 'setStyle (STYLE_NO_TITLE, 0)'. – brillenheini

+0

J'ai déjà essayé mais le même résultat :( – Wayne

1

Je crois que vous utilisez plus bas attribut largeur minimale de la boîte de dialogue. Il peut être trouvé comme

<item type="dimen" name="dialog_min_width_major">65%</item> 

dans le cadre d'Android. Cela varie en fonction du dossier values que vous regardez, il varie donc en fonction de la densité, de l'orientation, etc.

Vous pouvez remplacer cette valeur dans votre style. Si vous le définissez sur quelque chose qui est nettement plus petit que votre boîte de dialogue (10%), cela peut fonctionner correctement. Sinon, continuez à lire.

Si vous remarquez dans votre panneau d'arborescence de vue, votre LinearLayout est imbriqué dans 3 FrameLayouts. Ma conjecture est que le plus profond FrameLayout a sa largeur définie à wrap_content, donc il ne remplit pas la mise en page parent et est seulement aussi grand que votre LinearLayout. Je ne peux pas être sûr, cependant, parce que les dimensions sont coupées dans votre image.

Pourquoi cela change-t-il lorsque vous supprimez le titre? Je ne sais pas. Vous pouvez le pirater en ajustant les paramètres de remplissage/mise en page dans onMeasure, mais il semble qu'il devrait y avoir une façon plus propre de le faire.

+0

Merci pour votre réponse, mais 'android: windowMinWidthMajor' et dialogue min_width n'a toujours pas aidé – Wayne

+0

Hmm .. Y at-il une raison pour laquelle vous n'utilisez pas seulement un 'Builder' comme suggéré par brillenheini? C'est le moyen le plus simple que je connaisse pour créer une boîte de dialogue sans titre, et cela me convient parfaitement – Geobits

+0

Parce que je veux créer une boîte de dialogue entièrement personnalisée, j'ai donc besoin d'utiliser Dialog Au lieu de AlertDialog Au-dessus de la boîte de dialogue de progression est juste un exemple, j'ai beaucoup de dialogue compliqué que cela. – Wayne

0

Je ne sais toujours pas pourquoi enlever le titre se Dialog pas centrée horizontalement mais quand je mets min_width attr de LinearLayout = dialogue minWidth ce problème disparu.

Questions connexes