I am trying to implement a simple logic in my application where the user is shown a popup (after sometime of application launch). The popup simply shows a TextView
with some info message. This message is refreshed every time the application is launched and a new message is shown.
The UI of the popup matches my application UI - here maybe just popup background images is needed. Also one close button (X) is shown at the top right corner of the popup - to close this popup.
Logic of Showing Message: I have a String
array having some 100 strings stored in it. I randomly pick one string from this array and populate the popup TextView
showing the message. Please suggest if there is any better approach than what I am doing already here. Also is it possible to logic that if one message is picked then the same message is not picked until the other messages are shown at least once?
Logic of Showing Popup: This is what I am not able to implement. I do not want to anchor the popup with any user Event
or Button
click. I simply wants to show the message after some time - say
Thread.sleep(3000);
Now I have tried to use PopupWindow
for this using the below code.
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);
But this popup is showing error at the last line giving null pointer on my
(CoordinatorLayout)findViewById(R.id.main_content)
parameter.
The issue that I am getting are:
First of all, I am not sure if this is the right approach of showing a custom UI popup. I am aware of
AlertDialog
but not sure which is the best option to go in this case - Please suggest.Why the
CoordinatorLayout
is showing null pointer?How to implement the top right (X) button logic in this Popup ?
Activity with theme Dialog.
This is not a good idea. It looks like a pop-up, but you can't click outside the pop-up to close it.
PopupWindow
It will stop the application. When the user finish clicking the pop-up, the application can work again.
AlertDialog
The best one, it will not stop the application and can be closed by clicking outside the dialog.
1. Yes there are so many options for showing a custom UI popup in Android. You might select one from
PopupWindow
,AlertDialog
or DialogActivity
. You need to decide which suits you best.If you need to customize your UI a lot and have to show a list or some complex GUI then I would suggest you launch an
Activity
withtheme.Dialog
. Just set the theme of theActivity
to something like thisandroid:theme="@android:style/Theme.Holo.Light.Dialog"
. There's a plenty of tutorials for implementing a dialogActivity
.PopupWindow
is another tool to customize your custom pop up anywhere in the screen. If you're showing this popup always in the middle of the screen, then I would like to suggest not to use this. TheAlertDialog
should work fine.AlertDialog
has many variants and as far as I can assume your problem, this one suits you best. You can have a cross button too in the top-right corner of the dialog (You can set the icons anywhere, as you can provide a custom layout to anAlertDialog
). Personally I use this library to provide a custom layout to myAlertDialog
. You can have a look at this too.2. The
NullPointerException
is simple. Your layout doesn't have any id namedmain_content
. Post your logcat if this doesn't solve your problem. Post the layout too.3. As I've told you earlier, I use the library to provide a custom layout to an
AlertDialog
and you can have a look at it too. So after implementing this library you can easily design your own layout with a cross button and implement theonClick
functionalities easily.Hope this helps.