Android DialogFragment不';我没有出现

Android DialogFragment不';我没有出现,android,dialog,Android,Dialog,最后,我发现了问题所在 如果您有这样一个函数: public void test() { DialogFragment dlg = new LoginDialog(); dlg.show(getSupportFragmentManager(), "login"); } 对话框只会在test()完成时出现,我不确定这是否是Android对话框工作的唯一方式,但我肯定会阅读更多关于这个的内容 原始问题: 我是android世界的新手,有人能给我点启示吗 dlg.show()毫无例

最后,我发现了问题所在

如果您有这样一个函数:

public void test()
{
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager(), "login");
}
对话框只会在test()完成时出现,我不确定这是否是Android对话框工作的唯一方式,但我肯定会阅读更多关于这个的内容


原始问题:

我是android世界的新手,有人能给我点启示吗

dlg.show()毫无例外地执行,但什么也没发生,我应该怎么做才能知道出了什么问题?该项目使用安卓2.2的API

public class MainActivity extends FragmentActivity
{
    ...
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager(), "login");
}
对话框布局:

<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>

也许你用碎片交易来代替:

public class MainActivity extends FragmentActivity
{
    ...
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager().beginTransaction(), "login");
}
编辑:


我鼓励你们去看看谷歌指南。您对alertbuilder的自定义视图所做的操作可能会导致它无法显示。

如果您改用FragmentTransaction:

public class MainActivity extends FragmentActivity
{
    ...
    DialogFragment dlg = new LoginDialog();
    dlg.show(getSupportFragmentManager().beginTransaction(), "login");
}
编辑:


我鼓励你们去看看谷歌指南。您对alertbuilder的自定义视图所做的操作可能会导致它无法显示。

尝试使用newInstance()创建您的片段

然后在你的主要活动中

public class MainActivity extends Activity // notice that in my case I extend Activity instead of FragmentActivity
{
    @Override
    public void onCreate(Bundle savedInsatnceState) {
        super.onCreate(savedInsatnceState);
        setContentView(R.layout.main);
        LoginDialog dialogFragment = LoginDialog.newInstance("My Dialog");
        dialogFragment.show(getSupportFragmentManager(), "login");
    }
}

尝试使用newInstance()创建片段

然后在你的主要活动中

public class MainActivity extends Activity // notice that in my case I extend Activity instead of FragmentActivity
{
    @Override
    public void onCreate(Bundle savedInsatnceState) {
        super.onCreate(savedInsatnceState);
        setContentView(R.layout.main);
        LoginDialog dialogFragment = LoginDialog.newInstance("My Dialog");
        dialogFragment.show(getSupportFragmentManager(), "login");
    }
}

糟糕的是,我在问题的顶部添加了关于问题原因的信息

编辑(针对@MarcinS的评论):


该对话框不会在dlg.show()之后立即显示,而是在doThat()完成后显示。

我的错,我已在问题的顶部添加了有关问题原因的信息

编辑(针对@MarcinS的评论):


对话框不会在dlg.show()之后立即显示,而是在doThat()完成后显示。

我遇到了相同的问题,即在onResume之后对话框不会显示。(我有一个对话框通知用户他已经暂停了游戏,并询问他是否想继续)。我只是提前调用了它,我想原因是我在onPostResume()中的dialog.show()之后加载了一个片段。我通过检测dialog.show是否在队列中解决了这个问题,并简单地等待它的显示,直到加载片段后的onPostResume

这是显示对话框的功能:

@覆盖
public void onShowUserDialog(字符串标题、字符串消息、int类型){
FragmentTransaction fm=getSupportFragmentManager().beginTransaction();
Fragment prev=getSupportFragmentManager()。
findFragmentByTag(PublicVar.DIALOG\u用户);
如果(上一个!=null){
fm.移除(上一个);
提交();
}
如果(已恢复){
DialogFragment userDialog=userDialog。
newInstance(标题、消息、类型);
显示(getSupportFragmentManager().beginTransaction(),PublicVar.DIALOG\u用户);
dialogTitle=“”;
dialogMessage=“”;
dialogType=0;
}
else{//保存以备以后使用
dialogTitle=标题;
dialogMessage=消息;
对话类型=类型;
}
}

hasPostResume、dialogTitle、dialogMessage和dialogType在活动中声明

这是活动恢复时的最后一次调用:

protected void onPostResume() {
    super.onPostResume();
    hasPostResumed = true;

    ...function for loading my fragments...

    if (dialogType != 0) {
        onShowUserDialog(dialogTitle, dialogMessage, dialogType);
    }
}

我也有同样的问题,在恢复后对话框没有出现。(我有一个对话框通知用户他已经暂停了游戏,并询问他是否想继续)。我只是提前调用了它,我想原因是我在onPostResume()中的dialog.show()之后加载了一个片段。我通过检测dialog.show是否在队列中解决了这个问题,并简单地等待它的显示,直到加载片段后的onPostResume

这是显示对话框的功能:

@覆盖
public void onShowUserDialog(字符串标题、字符串消息、int类型){
FragmentTransaction fm=getSupportFragmentManager().beginTransaction();
Fragment prev=getSupportFragmentManager()。
findFragmentByTag(PublicVar.DIALOG\u用户);
如果(上一个!=null){
fm.移除(上一个);
提交();
}
如果(已恢复){
DialogFragment userDialog=userDialog。
newInstance(标题、消息、类型);
显示(getSupportFragmentManager().beginTransaction(),PublicVar.DIALOG\u用户);
dialogTitle=“”;
dialogMessage=“”;
dialogType=0;
}
else{//保存以备以后使用
dialogTitle=标题;
dialogMessage=消息;
对话类型=类型;
}
}

hasPostResume、dialogTitle、dialogMessage和dialogType在活动中声明

这是活动恢复时的最后一次调用:

protected void onPostResume() {
    super.onPostResume();
    hasPostResumed = true;

    ...function for loading my fragments...

    if (dialogType != 0) {
        onShowUserDialog(dialogTitle, dialogMessage, dialogType);
    }
}

FragmentTransaction.commit()
(当您显示
对话框fragment
时调用它)不会立即提交,而是在主线程准备就绪时提交。因为您希望立即完成,所以必须在显示对话框后添加
getSupportFragmentManager().executePendingTransactions()


来源:,.

FragmentTransaction.commit()
(当您显示
对话框fragment
时会调用它)不会立即提交,而是在主线程准备就绪时提交。因为您希望立即完成,所以必须在显示对话框后添加
getSupportFragmentManager().executePendingTransactions()


来源:,。

我想你忘了设置youtDialogFragment的样式了

@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NORMAL, R.style.MY_DIALOG);
        }
尝试以下一种样式:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments().getInt("num");

        // Pick a style based on the num.
        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        switch ((mNum-1)%6) {
            case 1: style = DialogFragment.STYLE_NO_TITLE; break;
            case 2: style = DialogFragment.STYLE_NO_FRAME; break;
            case 3: style = DialogFragment.STYLE_NO_INPUT; break;
            case 4: style = DialogFragment.STYLE_NORMAL; break;
            case 5: style = DialogFragment.STYLE_NORMAL; break;
            case 6: style = DialogFragment.STYLE_NO_TITLE; break;
            case 7: style = DialogFragment.STYLE_NO_FRAME; break;
            case 8: style = DialogFragment.STYLE_NORMAL; break;
        }
        switch ((mNum-1)%6) {
            case 4: theme = android.R.style.Theme_Holo; break;
            case 5: theme = android.R.style.Theme_Holo_Light_Dialog; break;
            case 6: theme = android.R.style.Theme_Holo_Light; break;
            case 7: theme = android.R.style.Theme_Holo_Light_Panel; break;
            case 8: theme = android.R.style.Theme_Holo_Light; break;
        }
        setStyle(style, theme);
    }
阅读更多关于:

您还可以为对话框片段设置自定义样式

@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NORMAL, R.style.MY_DIALOG);
        }

我想你忘了设置youtDialogFragment

@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NORMAL, R.style.MY_DIALOG);
        }
尝试以下一种样式:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments().getInt("num");

        // Pick a style based on the num.
        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        switch ((mNum-1)%6) {
            case 1: style = DialogFragment.STYLE_NO_TITLE; break;
            case 2: style = DialogFragment.STYLE_NO_FRAME; break;
            case 3: style = DialogFragment.STYLE_NO_INPUT; break;
            case 4: style = DialogFragment.STYLE_NORMAL; break;
            case 5: style = DialogFragment.STYLE_NORMAL; break;
            case 6: style = DialogFragment.STYLE_NO_TITLE; break;
            case 7: style = DialogFragment.STYLE_NO_FRAME; break;
            case 8: style = DialogFragment.STYLE_NORMAL; break;
        }
        switch ((mNum-1)%6) {
            case 4: theme = android.R.style.Theme_Holo; break;
            case 5: theme = android.R.style.Theme_Holo_Light_Dialog; break;
            case 6: theme = android.R.style.Theme_Holo_Light; break;
            case 7: theme = android.R.style.Theme_Holo_Light_Panel; break;
            case 8: theme = android.R.style.Theme_Holo_Light; break;
        }
        setStyle(style, theme);
    }
阅读更多关于:

您还可以为对话框片段设置自定义样式

@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NORMAL, R.style.MY_DIALOG);
        }

如果确定正在调用代码的第一位,请在创建对话框之前尝试将
finish()
放在右边。如果你的应用程序关闭,那么你的对话框有问题,但是如果它没有