显示没有调用Activity作为背景的DialogFragment

时间:2013-02-04 11:14:26

标签: android android-activity android-dialogfragment

我使用AlarmManagerPendingIntent传递给我的BroadcastReceiver,比如5分钟后。现在,我希望向用户显示DialogFragment,除了警报响起时用户可能正在使用的任何应用程序。例如,如果用户在闹钟响起时使用Chrome,我的DialogFragment应该会弹出用户的Chrome窗口。

我最终得到的是DialogFragment显示我的应用的空白活动作为背景(如下图所示)

http://i.stack.imgur.com/Vz9IZ.png

这是我在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);

        }
}

接下来,通过此活动,我正在弹出DialogFragment

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

}

我的问题:

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

  2. 无论我的方法是否正确,我都预计,由于AlarmHardActivity中没有调用setContentView(..),因此不会为其呈现UI。我的理解错了吗?我还尝试调用setContentView(..),然后将布局标记为Theme.NoDisplayandroid:alpha="0",但无济于事。

  3. 任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:4)

除了在活动上显示对话框之外,更好的选择是通过使用对话框主题并将所有边的边距设置为所需的dp,使活动看起来像对话框,以便活动变得尖叫到对话框大小。

举几个例子来看看这些帖子: Android Activity as a dialog

Android: how to create a transparent dialog-themed activity

How to set a dialog themed activity width to screen width?

答案 1 :(得分:3)

问题:

  1. 碎片只能附加到ActivityActivityFragment)。所以是的,你需要虚拟Activity

  2. 使用不可见的主题@android:style/Theme.Translucent.NoTitleBar,不需要调用setContentView。但是这个主题不是Holo兼容的(在对话框中你会有旧的Android外观)。我使用自定义主题解决了这个问题(我在ICS使用此功能,但它应该来自HONEYCOMB):

  3. <style name="InvisibleTheme" parent="@android:style/Theme.Holo.Light">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <!-- Note that we use the base animation style here (that is no animations) because we really have no idea how this kind of activity will be used. -->
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
    </style>
    

答案 2 :(得分:0)

如果没有Activity,则无法显示此对话框。您可以尝试像在屏幕截图上一样运行您的应用,但具有透明背景和隐藏的ActionBar。但我从来没有试过这样做,所以我不确定它是否会起作用。