Je crée un DialogFragment pour afficher des messages d'aide concernant mon application. Tout fonctionne bien sauf une chose: il y a une bande noire en haut de la fenêtre qui montre le DialogFragment, que je présume est réservé au titre, quelque chose que je ne veux pas utiliser.
Cela est particulièrement pénible car mon DialogFragment personnalisé utilise un fond blanc, le changement est donc trop notoire pour être laissé de côté.
Laissez-moi vous montrer ceci d'une manière plus graphique:
Maintenant, le code XML pour mon DialogFragment est le suivant:
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<LinearLayout
Android:id="@+id/holding"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/dialog_fragment_bg"
>
<!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados -->
<LinearLayout
Android:id="@+id/confirmationToast"
Android:orientation="horizontal"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
>
<TextView Android:id="@+id/confirmationToastText"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:text="@string/help_dialog_fragment"
Android:textColor="#AE0000"
Android:gravity="center_vertical"
/>
</LinearLayout>
<LinearLayout
Android:id="@+id/confirmationButtonLL"
Android:orientation="horizontal"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:gravity="center_horizontal"
>
<Button Android:id="@+id/confirmationDialogButton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:layout_marginBottom="60dp"
Android:background="@drawable/ok_button">
</Button>
</LinearLayout>
</LinearLayout>
</ScrollView>
Et le code de la classe qui implémente le DialogFragment:
public class HelpDialog extends DialogFragment {
public HelpDialog() {
// Empty constructor required for DialogFragment
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Inflate the XML view for the help dialog fragment
View view = inflater.inflate(R.layout.help_dialog_fragment, container);
TextView text = (TextView)view.findViewById(R.id.confirmationToastText);
text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment)));
//get the OK button and add a Listener
((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// When button is clicked, call up to owning activity.
HelpDialog.this.dismiss();
}
});
return view;
}
}
Et le processus de création dans l'activité principale:
/**
* Shows the HelpDialog Fragment
*/
private void showHelpDialog() {
Android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
HelpDialog helpDialog = new HelpDialog();
helpDialog.show(fm, "fragment_help");
}
Je ne sais vraiment pas si cette réponse, liée à un dialogue, convient ici aussi Android: Comment créer un dialogue sans titre?
Comment puis-je me débarrasser de cette zone de titre?
Ajoutez simplement cette ligne de code dans votre HelpDialog.onCreateView(...)
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
De cette façon, vous demandez explicitement d'obtenir une fenêtre sans titre :)
EDIT
Comme @DataGraham
et @Blundell
ont été soulignés dans les commentaires ci-dessous, il est plus sûr d'ajouter la demande d'une fenêtre sans titre dans la méthode onCreateDialog()
à la place de onCreateView()
. De cette façon, vous pouvez éviter les NPE ennuyeux lorsque vous n'utilisez pas votre fragment en tant que Dialog
:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
// request a window without the title
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
Le fragment de dialogue a la méthode setStyle, qui doit être appelée avant la création de la vue Java Doc . Aussi le style de la boîte de dialogue peut être défini avec la même méthode
public static MyDialogFragment newInstance() {
MyDialogFragment mDialogFragment = new MyDialogFragment();
//Set Arguments here if needed for dialog auto recreation on screen rotation
mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
return mDialogFragment;
}
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");
Essayez de manière simple
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, 0);
}
public class LoginDialog extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.login_dialog, null);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return view;
}
}
Définissez le style sur Theme_Holo_Dialog_NoActionBar:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NORMAL, Android.R.style.Theme_Holo_Dialog_NoActionBar);
}