DialogFragment ne s'affiche pas
Lors de la dernière, j'ai trouvé ce qu'est le problème...
Si vous avez une fonction comme ceci:
public void test()
{
DialogFragment dlg = new LoginDialog();
dlg.show(getSupportFragmentManager(), "login");
}
La boîte de dialogue n'apparaîtra que lorsque le test() fini, je ne suis pas sûr si c'est la seule façon d'Android dialogue fonctionne, mais je vais certainement lire plus sur ce...
Question D'Origine:
Je suis nouveau sur android monde, quelqu'un peut-il éclairer?
dlg.show() exécutée sans exception, mais seulement rien ne se passe, que dois-je faire pour savoir quel est le problème? Le projet est à l'aide de l'Androïde 2,2 de l'API.
public class MainActivity extends FragmentActivity
{
...
DialogFragment dlg = new LoginDialog();
dlg.show(getSupportFragmentManager(), "login");
}
La boîte de dialogue mise en page:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<EditText
android:id="@+id/username"
android:inputType="textEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="4dp"
android:hint="username" />
<EditText
android:id="@+id/password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="16dp"
android:hint="password"/>
</LinearLayout>
La classe de boîte de dialogue:
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
public class LoginDialog extends DialogFragment
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
//Inflate and set the layout for the dialog
//Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.login_dialog, null))
//Add action buttons
.setPositiveButton("Sign In", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//sign in the user ...
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//do something
}
});
return builder.create();
}
}
- Êtes-vous sûr que le premier bit de votre code est appelé, essayez de mettre
finish()
droit avant de créer votre boîte de dialogue. Si votre application s'arrête, puis il ya quelque chose de mal avec votre boîte de dialogue, mais si elle ne ferme pas alors cela signifie que votre code n'est pas d'atteindre le lieu où il crée une boîte de dialogue - Oui, il a été appelé, parce que j'ai mis un point d'arrêt, et c'était déclenchée.
- avez-vous essayé de supprimer l'affichage personnalisé et il suffit de mettre un contenu de texte? Cela fonctionne si vous le faites? Je ne suis pas sûr que le parent
null
est correct, peut-être que vous devez trouver le point de vue avec idR.id.layout_root
et de lui donner en tant que parent à votreinflate(..)
Vous devez vous connecter pour publier un commentaire.
Essayez de créer votre fragment à l'aide de newInstance()
Et puis dans votre MainActivity
Peut-être que si vous avez utilisé le fragmentransaction à la place:
Edit:
Je vous encourage à aller y jeter un coup d'oeil à googles guide sur DialogFragments. Ce que vous faites avec vue personnalisée pour les alertbuilder pourrait être la cause pour ne pas montrer.
Je pense que vous avez oublié de définir le style de votre DialogFragment
Essayez l'un des styles:
Lire plus sur:
https://developer.android.com/reference/android/app/DialogFragment.html
Vous pouvez également définir des styles personnalisés pour votre DialogFragment
Mon mal, j'ai ajouté de l'information sur ce qui a causé le problème, au-dessus de la question.
Modifier (par @MarcinS' commentaire):
La boîte de dialogue n'apparaît pas immédiatement après la dlg.show(), il apparaît à la suite doThat() a fini.
J'ai eu le même problème d'une boîte de dialogue ne s'affiche pas après onResume. (J'ai eu une boîte de dialogue informant l'utilisateur qu'il a mis en pause le jeu et demander si il voulait continuer). J'ai simplement appelé au début et je pense que la raison en était un fragment que j'ai chargé, après la boîte de dialogue.show(), dans onPostResume(). Je l'ai résolu en détectant si une boîte de dialogue.spectacle était dans la file d'attente et simplement attendu pour montrer jusqu'à onPostResume, après mon fragment a été chargé.
C'est la fonction pour l'affichage de la boîte de dialogue:
@Override
public void onShowUserDialog(String title, String message, int type) {
FragmentTransaction fm = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().
findFragmentByTag(PublicVar.DIALOG_USER);
if (prev != null) {
fm.remove(prev);
fm.commit();
}
if (hasPostResumed) {
DialogFragment userDialog = UserDialog.
newInstance(title, message, type);
userDialog.show(getSupportFragmentManager().beginTransaction(), PublicVar.DIALOG_USER);
dialogTitle = "";
dialogMessage = "";
dialogType = 0;
}
else { //saved for later
dialogTitle = title;
dialogMessage = message;
dialogType = type;
}
}
hasPostResumed, dialogTitle, dialogMessage et dialogType sont déclarées dans l'activité.
C'est le dernier appel lors de la reprise de l'activité:
FragmentTransaction.commit()
(il est appelé lorsque vous montrezDialogFragment
) n'engage pas immédiatement, mais lorsque le thread principal est prêt. Puisque vous voulez qu'il fait immédiatement, vous devez ajoutergetSupportFragmentManager().executePendingTransactions()
après montrant la boîte de dialogue.Source: FragmentTransaction.commit(), FragmentManager.executePendingTransactions().