【问题标题】:Showing DialogFragment without the calling Activity as background在没有调用 Activity 作为背景的情况下显示 DialogFragment
【发布时间】:2013-02-04 11:14:26
【问题描述】:

我正在使用 AlarmManager 在 5 分钟后将 PendingIntent 传递给我的 BroadcastReceiver。现在,我想在闹钟响起时用户可能正在使用的任何应用程序之上向用户显示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. 我找不到直接从我的onReceive 中的BroadcastReceiver 调用getSupportFragmentManager 的方法,因此假设获得对话的唯一方法是首先调用“虚拟”活动,创建对话框。有没有更好的方法来做到这一点?

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

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

【问题讨论】:

    标签: android android-activity android-dialogfragment


    【解决方案1】:

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

    有关几个示例,请查看以下帖子: 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?

    【讨论】:

    • 完美!正是我需要的。另外,为了确保活动之外的点击不会导致它关闭,我使用了这个问题的答案:stackoverflow.com/questions/14028842/…Cheers!知道为什么我的方法不起作用仍然会很有趣..
    【解决方案2】:

    对于您的问题:

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

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

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

    【讨论】:

      【解决方案3】:

      没有 Activity 是不可能显示这个对话框的。您可以尝试像在屏幕截图中一样运行您的应用程序,但要使用透明背景和隐藏的 ActionBar。但我从未尝试过这样做,所以我不确定它是否会起作用。

      【讨论】:

        猜你喜欢
        • 2013-01-18
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多