Android 弹出窗口与 Android 对话框

3
我正在尝试在应用程序中实现一个简单的逻辑,即在应用程序启动后一段时间向用户显示弹出窗口。弹出窗口只是显示一个带有一些信息消息的TextView。每次启动应用程序时都会刷新此消息,并显示新消息。弹出窗口的UI与我的应用程序UI匹配 - 这里可能只需要弹出背景图像。在弹出窗口的右上角显示一个关闭按钮(X)- 以关闭此弹出窗口。
显示消息的逻辑:我有一个包含100个字符串的String数组存储在其中。我随机从该数组中选择一个字符串,并填充弹出窗口的TextView以显示该消息。请建议是否有比我已经在这里做的更好的方法。还有可能逻辑是,如果选择了一条消息,则在显示其他消息至少一次之前不会选择同一消息吗?
显示弹出窗口的逻辑:这是我无法实现的部分。我不想将弹出窗口锚定到任何用户事件或按钮单击上。我只是想在一段时间后显示消息 - 比如Thread.sleep(3000);。现在我已经尝试使用PopupWindow来实现这一点,使用以下代码。
PopupWindow infoPopup;    
LinearLayout infoLayout;
TextView infoTextView;
Button infoButton;
infoTextView = new TextView(this);
infoTextView.setText("Testing Popup Text");
infoTextView.setPadding(10,10,10,10);
infoButton = new Button(this);
infoButton.setText("Close");    
infoLayout = new LinearLayout(this);
infoLayout.setOrientation(LinearLayout.VERTICAL);
infoLayout.addView(infoTextView);
infoLayout.addView(infoButton);    
infoPopup = new PopupWindow(infoLayout,LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
infoPopup.setContentView(infoLayout);    
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}    
infoPopup.showAtLocation((CoordinatorLayout)findViewById(R.id.main_content),Gravity.CENTER,100,100);

但是这个弹出窗口在最后一行显示错误,给出了我的空指针:

(CoordinatorLayout)findViewById(R.id.main_content)

参数。

我遇到的问题有:

  1. 首先,我不确定这是否是显示自定义UI弹出窗口的正确方法。我知道AlertDialog,但不确定在这种情况下哪个选项是最好的-请建议。

  2. 为什么CoordinatorLayout会显示空指针?

  3. 如何在此弹出窗口中实现右上角(X)按钮的逻辑?

2个回答

6

1. 在Android中,有许多选项可以显示自定义UI弹出窗口。你可以选择其中之一:PopupWindowAlertDialogActivity对话框。你需要决定哪个最适合你。

如果你需要大量自定义UI并且必须显示一个列表或某些复杂的GUI,则建议您使用具有theme.DialogActivity。只需将Activity的主题设置为类似于此android:theme="@android:style/Theme.Holo.Light.Dialog"的内容。有很多教程可以实现一个对话框Activity

PopupWindow是另一种工具,用于在屏幕上的任何位置自定义自定义弹出窗口。如果您总是在屏幕中央显示此弹出窗口,则建议不要使用此方法。 AlertDialog应该可以正常工作。

AlertDialog有许多变体,就我所知,这个最适合你的问题。你还可以在对话框的右上角放置一个交叉按钮(你可以将图标放置在任何地方,因为可以向AlertDialog提供自定义布局)。我个人使用这个来向我的AlertDialog提供自定义布局。你也可以看一下。

2. NullPointerException很简单。你的布局中没有名为main_content的ID。如果这不能解决你的问题,请发布你的日志。同时请发布布局。

3. 正如我之前告诉你的那样,我使用该库向AlertDialog提供自定义布局,你也可以看一下。因此,在实现此库后,您可以轻松设计自己的布局,包括交叉按钮,并轻松实现onClick功能。

希望能帮到你。


1
谢谢你,Reaz。我会按照你的建议去做。我个人喜欢你建议的 Dialog Activity,但使用带有自定义 git 库的 AlertDialog 也不错。一旦我应用了你的建议,我就会将你的回复标记为答案。另外,在我的布局文件中有一个 main_content 布局,只是它没有被识别出来。我正在努力找到解决方法。如果我找到了,我会发布日志和解决方案!再次感谢! - Harry_S
1
我最终使用了自定义对话框来实现这个功能。它成功了! - Harry_S
太好了,听到这个消息很棒! - Reaz Murshed

0
  1. 使用对话框主题的Activity。
    这不是一个好主意。它看起来像一个弹出窗口,但你不能点击弹出窗口外部来关闭它。

  2. PopupWindow
    它会停止应用程序。当用户完成点击弹出窗口后,应用程序可以再次工作。

  3. AlertDialog
    最好的选择,它不会停止应用程序,并且可以通过点击对话框外部来关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接