How to trigger Actionbar menu items in android app - android

I have webview in my app, which loads some url's. In this webview, I am seeing Actionbar menu (Cut, Copy, Paste, SelectAll, Settings) on top of the app, while long pressing on the texts in the loaded webpages.
I am trying to make an alert for this menus, while click on them. If user touch's cut I need to show an alert of You clicked Copy, Are you sure to Copy this?.
For this, I am overriding onOptionsItemSelected method, but not sure that this is right way. There is no onActionBarItemSelected method.
My mainActivity extends ActionBarActivity
Here my code, I used for this triggering,
#Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("MenuItem clicked - inside onOptionsItemSelected");
if (item.getItemId() == R.attr.actionModeCopyDrawable) {
Log.d("MenuItem clicked----", "Copy");
ShowAlert("You clicked Copy, Are you sure to Copy this?");
}
return true;
}
public void ShowAlert(String str) {
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
builder1.setMessage(str);
builder1.setCancelable(true);
builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder1.create();
alert.show();
}
But there is no alert and not even a log message of MenuItem clicked - inside onOptionsItemSelected, while click on the Copy menu.
What I am missing here, hope someone can assist here.

Related

Dialog doesn't trigger the dismiss listener on a button press

I would like to display an ok cancel dialog to the user and I would like to know if use pressed ok, cancel, or if he chose to just dismiss the dialog by clicking elsewhere on the screen or pressing back button.
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
final EditText input = new EditText(MainActivity.this);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
#Override
public void onClick(DialogInterface dialog, int which)
{
// ok stuff
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
#Override
public void onClick(DialogInterface dialog, int which)
{
// cancel stuff
}
});
builder.setOnDismissListener(new DialogInterface.OnDismissListener()
{
#Override
public void onDismiss(DialogInterface dialog)
{
//dismiss stuff
}
});
builder.show();
The problem here is that whenever user presses ok button, dismiss listener gets triggered right after.Is there any way to not trigger dismiss listener if user presses button?
I do realize that I can use a boolean flag, but I am hoping that there is actually an elegant solution.
I am not searching for solution on how to prevent dialog from being dismissed. I am searching for solution on how to prevent dismiss listener from being triggered when ok button is pressed and dialog gets dismissed.
I think what you need is setOnCancelListener().
setOnDismissListener() will be called for any reason. It means if dialog will disappear from the screen either due to Ok/Cancel button press or screen touch or back button or home button press, setOnDismissListener() will be called.
Sets the callback that will be called when the dialog is dismissed for
any reason.
If you are interested in listening for all cases where the dialog is
dismissed and not just when it is canceled, see setOnDismissListener
So workaround it what you have mentioned, check using some boolean flags and handle it.
You can again show that dialog after being dismissed!
You can try CustomViewDialog by using
LayoutInflater myDialog = getLayoutInflater();
View convertView = (View) myDialog.inflate(R.layout.MyLayoutXmlFile, null);
Also don't use positive or negative buttons only use buttons in the dialog layout.

Why do I always have to press the alert dialog button twice to close the dialog?

The below alert dialog requires me to click whichever button I click twice in order to close the dialog window and after an hours googling, I can't find the answer. I am sure it is staring me in the face but I just can't see it.
Edit: More searching has led me to believe the dialog is actually opened twice and it is occuring here:
asset_id_text_view.setOnTouchListener(new OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
showAssetIDDialog();
return true;
}
});
Edit: started out with dialog.dismiss(); and some googling suggested trying dialog.cancel(); Neither of which were successful for me.
public void showAssetIDDialog() {
// TODO Auto-generated method stub
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
CreateTicketActivity.this);
// set title
alertDialogBuilder.setTitle("Enter Asset ID");
alertDialogBuilder.setCancelable(true).setMessage(
"How would you like to proceed?");
alertDialogBuilder.setPositiveButton("Enter text",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//enterTextDialog();
dialog.cancel();
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
cancel() - Cancel the dialog. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered).
just cancel() will cancel the listener registerred on DialogInterface.
dismiss() - Dismiss this dialog, removing it from the screen. This method can be invoked safely from any thread. Note that you should not override this method to do cleanup when the dialog is dismissed, instead implement that in onStop().
Use dialog.dismiss() for your solution
http://developer.android.com/guide/topics/ui/dialogs.html#DismissingADialog
Please refer the above link for further query.
So it looks like the problem was indeed with the OnTouchListener
The code was doing what I had asked it to do and that was to open an AlertDialog every time there was a motionEvent. That makes at least 2 times for every touch
by including a switch statement, I was able to only trigger the opening of the alertDialog when the screen was pressed and not also when the screen was released as follows:
asset_id_text_view.setOnTouchListener(new OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
showAssetIDDialog();
break;
default:
break;
}
});
You can call dialog.dismiss() in the OnClickListener of the buttons to close the dialog.
Use dialog.dismiss();
Dismiss this dialog, removing it from the screen. This method can be
invoked safely from any thread.
alertDialogBuilder.setPositiveButton("Enter text",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//enterTextDialog();
dialog.dismiss();
}
});

Alert dialog pops up even after dismissing it

I have come across a typical problem and it seems strange to me. Details are something like this - On the activity in my app, there are edittexts and submit button. After filling the data in the edittexts, user can click submit button. After clicking submit button, based on the values that are entered by the user, either of the two alert dialogs are shown. One is success and the other one is failed.
The thing is when the user enters invalid data and clicks submit button, the failed alert dialog gets opened. I have a button(OK) on the failed alert dialog, after clicking it I wrote dialog.dismiss(); to make it disappear, so that user can recheck the data and can modify. But the problem is while rechecking & modifying the data if he changes the orientation, then again the failed alert dialog is popping up even without clicking submit button. Please suggest.
Extra Details(though probably not necessary for this problem): While changing orientation the activity is recreated. So, I am saving the current data in the onSavedInstanceState() and retrieving it in onCreate() method to set back the values in the edittexts. Everything works fine, but once clicking on submit button, the respective alert dialog appears. Then after changing orientation the dialog is again popping up. I am sure that I wrote showDialog(1); in the onClick() method but then again why control is going back into onClick and showing that alert dialog even without clicking.
protected Dialog onCreateDialog(int id) {
switch(id){
case 0:
return new AlertDialog.Builder(this)
.setMessage("Success!")
.setIcon(R.drawable.success)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
case 1:
return new AlertDialog.Builder(this)
.setMessage("Failed")
.setIcon(R.drawable.failure)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
}).show();
}
return null;
}
Here is the method that makes alert dialog show.
public void onClick(View v) {
switch (v.getId()) {
//Here there are other cases too.
case R.id.submit:
getEditTexts();
validator();
break;
}
}
public void validator() {
if(generator.receiveVal(0,0,sudo)) {
showDialog(0);
}
else if(!generator.receiveVal(0,0,sudo)) {
showDialog(1);
}
}
Just try replacing .create() in the place of .show(). In your case like this:
case 1:
return new AlertDialog.Builder(this)
.setMessage("Failed")
.setIcon(R.drawable.failure)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
}).create(); //Here replaced .show with .create()
This is just an idea but it seems the issue is that onOrientation is trying to re-draw the activity.
Try something like the following:
You can add this to the activity declaration in the manifest:
android:configChanges="orientation"
so it looks like
<activity android:label="#string/app_name"
android:configChanges="orientation"
android:name=".your.package">
The matter is that the system destroys the activity when a change in the configuration occurs. See ConfigurationChanges.
So putting that in the configuration file avoids the system to destroy your activity. Instead it invokes the onConfigurationChanged(Configuration) method.
Hope this helps.

Having problems closing dialog box

I am a new to android development and need help. Please explain in detail and not just supply me with an answer that would be ideal.
My issue: I created a dialog box for my app and well it displays great, it dims the app and just opens the box but I am having issues closing it. If someone wanted to exit out of it, they would have to press the back arrow button. Yeah, this is not hard-work, but I would like my app to be nicely done and clean-cut. So I was wondering if there was a way to put an "X" at the top right corner to exit the dialog box?
If someone could add on to my code that would be perfect.Like I said, I am new to this and someone telling me just add this. I would not know where to add that code to.
My Code:
#Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater library = getMenuInflater();
library.inflate(R.menu.main_menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.menuAus:
startActivity(new Intent("com.tester.web.AUS"));
return true;
}
return false;
}
You can also use a close button (BUTTON_NEGATIVE) if you like within the Dialog Box.
Also check out this answer: How to display a Yes/No dialog box in Android?
You should be easily able to customize that code as per your requirements. Good Luck!
Edit:
Put this line in OnCreate()
Context mcontext=this;
Now use this variable in following code
final AlertDialog.Builder alert = new AlertDialog.Builder(mcontext);
alert.setTitle(title);
alert.setMessage(description);
alert.setNegativeButton("Ok",new DialogInterface.OnClickListener()
//You can also run this without the overiding the method
{
#Override
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
});
alert.show();
Try this code.. It is running successfully..you might need to customize it a bit as per your needs..

ListPreferences without any radio buttons?

I want to create a ListPreference in my PreferenceActivity.
When a ListPreference is clicked, I get a dialog box with a listview. Each row in list view has a text field and a radio button.
I do not want this radio button and also on clicking list item, I want to fire an intent that opens browser? Any idea how to go about it?
If i extend DialogPreference then how to handle onClicks? Like onListClickListener will work?
OR
If i extend ListPreference what are the functions i need to override?
This is possible when you are customizing preferences.When you are using only Preference ,it works like a button.And later you have to implement whatever you want.The Following example simply shows as your requirement.When you click preference,it shows list dialog without radio buttons .But i am not implemented to store the data in Shared preferences.If you want to do that,you have to implement your own.I just post some code here.
prefereces=findPreference("intent");
// prefereces.setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse("https://market.android.com/")));
// prefereces.setIntent(new Intent(getApplicationContext(), DynamicPreference.class));
prefereces.setOnPreferenceClickListener(new OnPreferenceClickListener() {
#Override
public boolean onPreferenceClick(Preference preference) {
// TODO Auto-generated method stub
createListPreferenceDialog();
return true;
}
});
}
private void createListPreferenceDialog()
{
Dialog dialog;
final CharSequence str[]={"Android","Black Berry","Symbian"};
AlertDialog.Builder b=new AlertDialog.Builder(PreferenceActivities1Activity.this);
b.setTitle("Mobile OS");
b.setItems(str, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int position)
{
showToast("I am Clicked "+str[position]);
// switch (position)
// {
// case 0:
// showToast("I am Clicked "+str[position]);
// break;
//
// default:
// break;
// }
}
});
dialog=b.create();
dialog.show();
}
public void showToast(String msg)
{
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}

Categories

Resources