Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显示不以调用活动为背景的DialogFragment_Android_Android Activity_Android Dialogfragment - Fatal编程技术网

Android 显示不以调用活动为背景的DialogFragment

Android 显示不以调用活动为背景的DialogFragment,android,android-activity,android-dialogfragment,Android,Android Activity,Android Dialogfragment,我正在使用AlarmManager将PendingEvent传递给我的BroadcastReceiver,时间大约为5分钟。现在,我想向用户显示一个对话框片段,在警报响起时用户可能正在使用的任何应用程序之上。例如,如果警报响起时用户正在使用Chrome,我的DialogFragment应该会在用户的Chrome窗口上方弹出 相反,我得到的结果是,对话框片段以我的应用程序的空白活动为背景显示(如下图所示) 这是我在我的BroadcastReceiver中使用的代码,用于首先启动FragmentA

我正在使用
AlarmManager
PendingEvent
传递给我的
BroadcastReceiver
,时间大约为5分钟。现在,我想向用户显示一个
对话框片段
,在警报响起时用户可能正在使用的任何应用程序之上。例如,如果警报响起时用户正在使用Chrome,我的
DialogFragment
应该会在用户的Chrome窗口上方弹出

相反,我得到的结果是,
对话框片段
以我的应用程序的空白活动为背景显示(如下图所示)

这是我在我的
BroadcastReceiver
中使用的代码,用于首先启动
FragmentActivity

    public class AlarmReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent)
        {
            Intent hardReminderIntent = new Intent(context, AlarmHardActivity.class);
            hardReminderIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(hardReminderIntent);

        }
}

接下来,从这个活动中,我将弹出
对话框片段

public class AlarmHardActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentManager fm = getSupportFragmentManager();
        AlarmHardDialog editNameDialog = new AlarmHardDialog();
        editNameDialog.show(fm, "fragment_dialog");
        //setContentView(R.layout.activity_alarm_hard);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.activity_alarm_hard, menu);
        return true;
    }

}
我的问题:

  • 我找不到直接从我的
    BroadcastReceiver
    中的
    onReceive
    调用
    getSupportFragmentManager
    的方法,因此我认为获得对话框的唯一方法是首先调用创建对话框的“虚拟”活动。有更好的方法吗

  • 无论我的方法是否正确,我希望由于AlarmHardActivity中没有调用
    setContentView(..)
    ,因此不会为其呈现UI。我的理解错了吗?我还尝试调用
    setContentView(..)
    ,然后将布局标记为具有
    主题.NoDisplay
    android:alpha=“0”
    ,但没有效果


  • 任何帮助都将不胜感激。谢谢

    如果没有活动,则无法显示此对话框。你可以试着运行你的应用程序,就像你在屏幕截图上所做的那样,但要有透明的背景和隐藏的ActionBar。但我从未尝试过这样做,所以我不确定它是否会起作用。

    与其在活动上显示对话框,更好的替代方法是使用对话框主题并将所有边的边距设置为所需的dp,使活动看起来像对话框,这样活动就会尖叫到对话框大小

    关于几个例子,请看这些帖子:

    关于您的问题:

  • 片段只能附加到
    活动
    活动片段
    )。因此,是的,您需要虚拟
    活动

  • 使用不可见主题
    @android:style/theme.transparent.NoTitleBar
    ,无需调用setContentView。但这个主题与Holo不兼容(在对话框中,您可能会看到旧的Android外观)。我用自定义主题解决了这个问题(我从
    ICS
    使用它,但它应该从
    蜂巢
    工作):

  • 
    假的
    真的
    @android:彩色/透明
    @空的
    真的
    @android:风格/动画
    
    完美!正是我需要的。另外,为了确保活动外的点击不会导致活动关闭,我使用了这个问题的答案:干杯!如果我知道为什么我的方法不起作用,我还是会很感兴趣的。。