How to Display an Alert Dialog on Android

how to show alert dialog on top of any activity in an application android

Yes i got the solution....

first i created a class for displaying alert dialog.
upon receiving a response from server calling a method to display alert dialog by passing application context

package io.omoto.omotokairaliapp.Utls;

import android.content.Context;
import android.view.WindowManager;

import com.gitonway.lee.niftymodaldialogeffects.lib.NiftyDialogBuilder;

import io.omoto.omotokairaliapp.Constants.Constants;

/**
* Created by ${venkie} on ${28/1/16}.
*/
public class DisplayRegisteredMessage {

Context context;
private NiftyDialogBuilder dialogBuilder;


public DisplayRegisteredMessage(Context context) {

this.context = context;
}

public void displayMessage() {

if (Constants.FLAG == 1) {
Constants.FLAG = 0;

dialogBuilder = NiftyDialogBuilder.getInstance(context);
dialogBuilder
.withTitle("Response is already registered")
.withMessage("For this Customer we have already taken response Sorry!!");
dialogBuilder.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialogBuilder.show();

} else {


}
}


}

The above code displays alert dialog

@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
Log.e("response page", response.toString());
try {
if (response.getString(Constants.STATUS).equalsIgnoreCase("SUCCESS"))
p7.deleterecord(p7b.getFlowid());
p7.deleteRows();

Constants.FLAG = 1;
DisplayRegisteredMessage displayRegisteredMessage = new DisplayRegisteredMessage(mContext);
displayRegisteredMessage.displayMessage();


} catch (JSONException e) {
e.printStackTrace();
}
Log.e("Page 6", p7b.getFlowid());
}

Android simple alert dialog

You would simply need to do this in your onClick:

AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("Alert message to be shown");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();

I don't know from where you saw that you need DialogFragment for simply showing an alert.

How to show Alert Dialog box in Service android

Just remove :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 8.0 new features
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);
} else {
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}

And try :

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)

UPDATE

In Android 6.0 Marshmallow, the user must explicitly allow your app to "draw over other apps". So add

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Now in marshmallow use this method to handle runtime permission:

@TargetApi(Build.VERSION_CODES.M)
private void handleOverlaySettings() {
final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
try {
startActivityForResult(intent, 11);
} catch (ActivityNotFoundException e) {
Log.e(TAG, e.getMessage());
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 11:
final boolean overlayEnabled = Settings.canDrawOverlays(this);
// handle the remaining logic
break;
}
}

Now show the dialog in service as below:

    final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this, R.style.AppTheme_MaterialDialogTheme);

dialogBuilder.setTitle(R.string.dialog_title);
dialogBuilder.setMessage(R.string.dialog_message);
dialogBuilder.setNegativeButton(R.string.btn_back,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}
);

final AlertDialog dialog = dialogBuilder.create();
final Window dialogWindow = dialog.getWindow();
final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();

// Set fixed width (350dp) and WRAP_CONTENT height
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialogWindowAttributes);
lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 350, getResources().getDisplayMetrics());
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialogWindow.setAttributes(lp);

// Set to TYPE_SYSTEM_ALERT so that the Service can display it
dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialogWindowAttributes.windowAnimations = R.style.DialogAnimation;
dialog.show();

All set now this solution should work. Good luck

How can I display a list view in an Android Alert Dialog?

Used below code to display custom list in AlertDialog

AlertDialog.Builder builderSingle = new AlertDialog.Builder(DialogActivity.this);
builderSingle.setIcon(R.drawable.ic_launcher);
builderSingle.setTitle("Select One Name:-");

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(DialogActivity.this, android.R.layout.select_dialog_singlechoice);
arrayAdapter.add("Hardik");
arrayAdapter.add("Archit");
arrayAdapter.add("Jignesh");
arrayAdapter.add("Umang");
arrayAdapter.add("Gatti");

builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});

builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strName = arrayAdapter.getItem(which);
AlertDialog.Builder builderInner = new AlertDialog.Builder(DialogActivity.this);
builderInner.setMessage(strName);
builderInner.setTitle("Your Selected Item is");
builderInner.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
dialog.dismiss();
}
});
builderInner.show();
}
});
builderSingle.show();

Displaying one alert dialog, dismissing and displaying another alert dialog

Okay i don't recommend it to be like this i prefer it to be cleaner as @Tamir expressed in his answer however here is what you need to do so you can refactor later on for cleaner and simpler code to help you take apart and debug easily.

As i explained in the comment here are the amends you will alter
Regarding showVehicleDetails :

AlertDialog.Builder alert_dialog = new AlertDialog.Builder(this);
alert_dialog.setTitle("VEHICLE DETAILS");
alert_dialog.setMessage("Please, fill in the following:");
LayoutInflater inflate = LayoutInflater.from(this);
View vehicle_details = inflate.inflate(R.layout.layout_vehicle_details, null);

final MaterialEditText edtYear = vehicle_details.findViewById(R.id.year);
final MaterialEditText edtCMNM = vehicle_details.findViewById(R.id.cmnm);
final MaterialEditText edtPlate = vehicle_details.findViewById(R.id.plate);

alert_dialog.setView(vehicle_details);

alert_dialog.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {


// check validation
if (TextUtils.isEmpty(edtYear.getText().toString())) {
Snackbar.make(rootLayout, "Please enter year of your vehicle", Snackbar
.LENGTH_SHORT).show();

return;
}

if (TextUtils.isEmpty(edtCMNM.getText().toString())) {
Snackbar.make(rootLayout, "Please enter the Color, Make and Model of your vehicle",
Snackbar.LENGTH_SHORT).show();

return;
}

if (TextUtils.isEmpty(edtPlate.getText().toString())) {
Snackbar.make(rootLayout, "Please enter your license plate number", Snackbar
.LENGTH_SHORT).show();

return;
}

// save to firebase/ Users/Drivers ...

details = users;
details.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
// get drivers id
for (DataSnapshot ss : snapshot.getChildren()) {
String id = ss.getKey();

String year = edtYear.getText().toString();
String cmnm = edtCMNM.getText().toString();
String plate = edtPlate.getText().toString();

Log.e(TAG, "year: " + year + ", cmnm: " + cmnm + ", plate: " + plate);

// data sent
details.child(id).child("year").setValue(year);
details.child(id).child("cmnm").setValue(cmnm);
details.child(id).child("plate").setValue(plate);
}
showRegisterDialog();
dialog.dismiss();

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
}
});
AlertDialog dialog = alert_dialog.create();
dialog.show();}

and here are the amends you will alter
Regarding showRegisterDialogue :

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("REGISTER");
builder.setMessage("Please use email to register");
LayoutInflater inflater = LayoutInflater.from(this);
View register_layout = inflater.inflate(R.layout.layout_register, null);

final MaterialEditText edtEmail = register_layout.findViewById(R.id.email);
final MaterialEditText edtPassword = register_layout.findViewById(R.id.password);
final MaterialEditText edtName = register_layout.findViewById(R.id.usersname);
final MaterialEditText edtPhone = register_layout.findViewById(R.id.cell);

final MaterialAnimatedSwitch policies_switch = register_layout.findViewById(R.id.policies_switch);

builder.setView(register_layout);

builder.setPositiveButton("REGISTER", new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {

// check validation
if (TextUtils.isEmpty(edtEmail.getText().toString())) {
Snackbar.make(rootLayout, "Please enter email address", Snackbar
.LENGTH_SHORT).show();

return;
}

if (TextUtils.isEmpty(edtPhone.getText().toString())) {
Snackbar.make(rootLayout, "Please enter phone number", Snackbar
.LENGTH_SHORT).show();

return;
}

if (TextUtils.isEmpty(edtPassword.getText().toString())) {
Snackbar.make(rootLayout, "Please enter password", Snackbar
.LENGTH_SHORT).show();

return;
}

if (edtPassword.getText().toString().length() < 6) {
Snackbar.make(rootLayout, "Password too short !!!", Snackbar
.LENGTH_SHORT).show();

return;
}


// Register new user
auth.createUserWithEmailAndPassword(edtEmail.getText().toString(),
edtPassword.getText().toString())
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
// Save user to db
Driver driver = new Driver();
driver.setEmail(edtEmail.getText().toString());
driver.setUsersname(edtName.getText().toString());
driver.setCell(edtPhone.getText().toString());
driver.setPassword(edtPassword.getText().toString());
driver.setRates("4.5"); // TODO: Default added

// use uid to key
users.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(driver)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Snackbar.make(rootLayout, "Registration successful !!!",
Snackbar.LENGTH_SHORT).show();
dialog.dismiss();
}
})

.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Snackbar.make(rootLayout, "Failed" + e.getMessage(),
Snackbar.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
})

.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Snackbar.make(rootLayout, "Failed" + e.getMessage(),
Snackbar.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
});

builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});

final AlertDialog dialog = builder.create();

/* If switch is on, enable REGISTER button */
policies_switch.setOnCheckedChangeListener(new MaterialAnimatedSwitch.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(boolean isChecked) {
if (isChecked) {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); // if checked, enable
}
}
});

dialog.show();

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); // set disabled by default

}

and for The ClickListener you will just remove the showRegisterDialogue and it would be like this

btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showVehicleDetails();
}
});


Related Topics



Leave a reply



Submit