Как создать пользовательское диалоговое окно в Android?

Я хочу создать настраиваемое диалоговое окно, как показано ниже.

Введите описание изображения здесь

Я пробовал следующее.

  1. Я создал подкласс AlertDialog.Builder и использовал пользовательский заголовок и пользовательский контент-представление и использовал его, но результат был не таким, как ожидалось.

  2. Другая попытка заключалась в подклассе DialogFragment и настройке диалога внутри onCreateDialog, но результат был не таким, как ожидалось.

  3. Затем я попытался использовать простой класс Dialog . Результат был не таким, как ожидалось.

Во всех трех случаях проблема заключается в том, что, когда я пропускаю заголовок, размер диалогового окна не соответствует ожидаемому, и когда я использую вид заголовка, результат состоит в том, что вокруг содержимого отображается толстая рамка (что действительно выглядит плохо). Теперь у меня есть два вопроса в моем сознании …

  1. Как я могу это достичь? Поскольку я уже пробовал так много вещей, прямой ответ будет более оценен.

  2. Каков наилучший способ показать диалоговое окно с ошибкой или предупреждением в приложении для Android?

EDIT Android Developer Documentation рекомендует использовать диалоговые окна DialogFragments или Dialogs для отображения сообщений об ошибках / предупреждениях пользователю. Однако в какой-то момент они говорят …

Совет. Если вы хотите создать настраиваемый диалог, вместо использования диалогового окна «Диалог» вы можете отображать «Активность как диалог». Просто создайте действие и установите его тему в Theme.Holo.Dialog в манифестном элементе.

Что это значит? Разве это не слишком много, чтобы использовать Activity только для отображения сообщения об ошибке ???

Solutions Collecting From Web of "Как создать пользовательское диалоговое окно в Android?"

Здесь я создал простой диалог, например:

Диалоговое окно

custom_dialog.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="80dp" android:background="#3E80B4" android:orientation="vertical" > <TextView android:id="@+id/txt_dia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:text="Do you realy want to exit ?" android:textColor="@android:color/white" android:textSize="15dp" android:textStyle="bold"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#3E80B4" android:orientation="horizontal" > <Button android:id="@+id/btn_yes" android:layout_width="100dp" android:layout_height="30dp" android:background="@android:color/white" android:clickable="true" android:text="Yes" android:textColor="#5DBCD2" android:textStyle="bold" /> <Button android:id="@+id/btn_no" android:layout_width="100dp" android:layout_height="30dp" android:layout_marginLeft="5dp" android:background="@android:color/white" android:clickable="true" android:text="No" android:textColor="#5DBCD2" android:textStyle="bold" /> </LinearLayout> </LinearLayout> 

Вы должны implements OnClickListener extends Dialog и implements OnClickListener

 public class CustomDialogClass extends Dialog implements android.view.View.OnClickListener { public Activity c; public Dialog d; public Button yes, no; public CustomDialogClass(Activity a) { super(a); // TODO Auto-generated constructor stub this.c = a; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.custom_dialog); yes = (Button) findViewById(R.id.btn_yes); no = (Button) findViewById(R.id.btn_no); yes.setOnClickListener(this); no.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_yes: c.finish(); break; case R.id.btn_no: dismiss(); break; default: break; } dismiss(); } } 

Как вызвать диалог?

 R.id.TXT_Exit: CustomDialogClass cdd=new CustomDialogClass(Values.this); cdd.show(); 

Обновления

После долгого времени один из моих друзей попросил меня сделать изогнутый диалог формы с прозрачным фоном. Итак, здесь я его реализовал.

Введите описание изображения здесь

Чтобы сделать изогнутую форму, вам нужно создать отдельный curve_shap.XML как curve_shap.XML ниже,

 <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#000000" /> <stroke android:width="2dp" android:color="#ffffff" /> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" android:topLeftRadius="20dp" android:topRightRadius="20dp" /> </shape> 

Теперь добавьте этот curve_shap.XML в макет основного вида. В моем случае я использовал LinearLayout

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="80dp" android:background="@drawable/curve_shap" android:orientation="vertical" > ... </LinearLayout> 

Как это назвать?

 CustomDialogClass cdd = new CustomDialogClass(MainActivity.this); cdd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); cdd.show(); 

Надеюсь, это сработает для вас.

Это пример диалога, созданный с помощью xml.

Введите описание изображения здесь

Следующий код xml – это просто пример, дизайн или представление реализованы здесь:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffffff"> <ImageView android:layout_width="match_parent" android:layout_height="120dp" android:id="@+id/a" android:gravity="center" android:background="#DA5F6A" android:src="@drawable/dialog_cross" android:scaleType="fitCenter" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TEXTO" android:id="@+id/text_dialog" android:layout_below="@+id/a" android:layout_marginTop="20dp" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_marginBottom="20dp" android:textSize="18sp" android:textColor="#ff000000" android:layout_centerHorizontal="true" android:gravity="center_horizontal" /> <Button android:layout_width="wrap_content" android:layout_height="30dp" android:text="OK" android:id="@+id/btn_dialog" android:gravity="center_vertical|center_horizontal" android:layout_below="@+id/text_dialog" android:layout_marginBottom="20dp" android:background="@drawable/btn_flat_red_selector" android:layout_centerHorizontal="true" android:textColor="#ffffffff" /> </RelativeLayout> 

Эти строки кода являются ресурсами:

 android:src="@drawable/dialog_cross" android:background="@drawable/btn_flat_red_selector" 

Вы можете сделать класс extends Dialog, также что-то вроде этого:

 public class ViewDialog { public void showDialog(Activity activity, String msg){ final Dialog dialog = new Dialog(activity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(false); dialog.setContentView(R.layout.dialog); TextView text = (TextView) dialog.findViewById(R.id.text_dialog); text.setText(msg); Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog); dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); dialog.show(); } } 

Наконец, форму вызова, например, в вашей деятельности:

 ViewDialog alert = new ViewDialog(); alert.showDialog(getActivity(), "Error de conexión al servidor"); 

Я надеюсь, что это сработает для вас.

Еще один простой способ сделать это.

Шаг 1) создать макет с правильными идентификаторами.

Шаг 2) используйте следующий код, где бы вы ни пожелали.

 LayoutInflater factory = LayoutInflater.from(this); final View deleteDialogView = factory.inflate(R.layout.mylayout, null); final AlertDialog deleteDialog = new AlertDialog.Builder(this).create(); deleteDialog.setView(deleteDialogView); deleteDialogView.findViewById(R.id.yes).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //your business logic deleteDialog.dismiss(); } }); deleteDialogView.findViewById(R.id.no).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { deleteDialog.dismiss(); } }); deleteDialog.show(); 

Добавьте приведенную ниже тему в values -> style.xml

 <style name="Theme_Dialog" parent="android:Theme.Light"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style> 

Используйте эту тему в методе onCreateDialog следующим образом:

 Dialog dialog = new Dialog(FlightBookActivity.this,R.style.Theme_Dialog); 

Определите макет диалога, включая строку заголовка в файле xml, и установите этот XML-файл следующим образом:

 dialog.setContentView(R.layout.your_dialog_layout); 
 public static void showCustomAlertDialog(Context context, String name, String id, String desc, String fromDate, String toDate, String resions) { final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( context); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dialog, null); alertDialogBuilder.setView(view); alertDialogBuilder.setCancelable(false); final AlertDialog dialog = alertDialogBuilder.create(); dialog.show(); txt_empId = (TextView) view.findViewById(R.id.txt_dialog_empcode); txt_empName = (TextView) view.findViewById(R.id.txt_dialog_empname); txt_desc = (TextView) view.findViewById(R.id.txt_dialog_desc); txt_startDate = (TextView) view.findViewById(R.id.txt_dialog_startDate); txt_resions = (TextView) view.findViewById(R.id.txt_dialog_endDate); txt_empId.setTypeface(Utils.setLightTypeface(context)); txt_empName.setTypeface(Utils.setLightTypeface(context)); txt_desc.setTypeface(Utils.setLightTypeface(context)); txt_startDate.setTypeface(Utils.setLightTypeface(context)); txt_resions.setTypeface(Utils.setLightTypeface(context)); txt_empId.setText(id); txt_empName.setText(name); txt_desc.setText(desc); txt_startDate.setText(fromDate + "\t to \t" + toDate); txt_resions.setText(resions); btn_accept = (Button) view.findViewById(R.id.btn_dialog_accept); btn_reject = (Button) view.findViewById(R.id.btn_dialog_reject); btn_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel); btn_accept.setTypeface(Utils.setBoldTypeface(context)); btn_reject.setTypeface(Utils.setBoldTypeface(context)); btn_cancel.setTypeface(Utils.setBoldTypeface(context)); btn_cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.dismiss(); } }); } по public static void showCustomAlertDialog(Context context, String name, String id, String desc, String fromDate, String toDate, String resions) { final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( context); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.dialog, null); alertDialogBuilder.setView(view); alertDialogBuilder.setCancelable(false); final AlertDialog dialog = alertDialogBuilder.create(); dialog.show(); txt_empId = (TextView) view.findViewById(R.id.txt_dialog_empcode); txt_empName = (TextView) view.findViewById(R.id.txt_dialog_empname); txt_desc = (TextView) view.findViewById(R.id.txt_dialog_desc); txt_startDate = (TextView) view.findViewById(R.id.txt_dialog_startDate); txt_resions = (TextView) view.findViewById(R.id.txt_dialog_endDate); txt_empId.setTypeface(Utils.setLightTypeface(context)); txt_empName.setTypeface(Utils.setLightTypeface(context)); txt_desc.setTypeface(Utils.setLightTypeface(context)); txt_startDate.setTypeface(Utils.setLightTypeface(context)); txt_resions.setTypeface(Utils.setLightTypeface(context)); txt_empId.setText(id); txt_empName.setText(name); txt_desc.setText(desc); txt_startDate.setText(fromDate + "\t to \t" + toDate); txt_resions.setText(resions); btn_accept = (Button) view.findViewById(R.id.btn_dialog_accept); btn_reject = (Button) view.findViewById(R.id.btn_dialog_reject); btn_cancel = (Button) view.findViewById(R.id.btn_dialog_cancel); btn_accept.setTypeface(Utils.setBoldTypeface(context)); btn_reject.setTypeface(Utils.setBoldTypeface(context)); btn_cancel.setTypeface(Utils.setBoldTypeface(context)); btn_cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.dismiss(); } }); } 

Просто сначала создайте класс

  public class ViewDialog { public void showDialog(Activity activity, String msg){ final Dialog dialog = new Dialog(activity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(false); dialog.setContentView(R.layout.custom_dialogbox_otp); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); TextView text = (TextView) dialog.findViewById(R.id.txt_file_path); text.setText(msg); Button dialogBtn_cancel = (Button) dialog.findViewById(R.id.btn_cancel); dialogBtn_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(getApplicationContext(),"Cancel" ,Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); Button dialogBtn_okay = (Button) dialog.findViewById(R.id.btn_okay); dialogBtn_okay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(getApplicationContext(),"Okay" ,Toast.LENGTH_SHORT).show(); dialog.cancel(); } }); dialog.show(); } } 

Вы можете попробовать эту простую диалоговую всплывающую библиотеку Android, чтобы разрезать загроможденный код диалога. Это очень просто использовать в вашей деятельности. После этого вы можете включить этот код в своей деятельности, чтобы показать диалог

 Pop.on(this).with().title(R.string.title).layout(R.layout.custom_pop).show(); 

Где R.layout.custom_pop – это ваш собственный макет, который вы хотите украсить своим диалогом.

Самый простой способ изменить цвет фона и стиль текста – создать специальную тему для диалогового окна предупреждения Android, как показано ниже:

: Просто поместите ниже код в styles.xml:

  <style name="AlertDialogCustom" parent="@android:style/Theme.Dialog"> <item name="android:textColor">#999999</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowTitleStyle">@null</item> <item name="android:typeface">monospace</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:textSize">@dimen/abc_text_size_medium_material</item> <item name="android:background">#80ff00ff</item> </style> 

: Теперь выполняется настройка, теперь применим только к вашему объекту alertBuilder:

  AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,R.style.AlertDialogCustom); 

Надеюсь, что это поможет вам !

Самый простой способ создания настраиваемого диалогового окна:

  1. Инициализировать и показать диалог:

      ViewDialog alertDialoge = new ViewDialog(); alertDialoge.showDialog(getActivity(), "PUT DIALOG TITEL"); 
  2. Создать метод:

     public class ViewDialog { public void showDialog(Activity activity, String msg) { final Dialog dialog = new Dialog(activity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCancelable(false); dialog.setContentView(R.layout.custom_dialoge_feedback); TextView text = (TextView) dialog.findViewById(R.id.text_dialog_feedback); text.setText(msg); Button okButton = (Button) dialog.findViewById(R.id.btn_dialog_feedback); Button cancleButton = (Button) dialog.findViewById(R.id.btn_dialog_cancle_feedback); final EditText edittext_tv = (EditText) dialog.findViewById(R.id.dialoge_alert_text_feedback); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Perfome Action } }); cancleButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); dialog.show(); } } 
  3. Создайте XML-формат, который вам нужен или нужен.

Создать собственный макет оповещения custom_aler_update.xml

Затем Скопировать в действие

  AlertDialog basic_reg; AlertDialog.Builder builder ; builder = new AlertDialog.Builder(ct, R.style.AppCompatAlertDialogStyle); LayoutInflater inflater = ((Activity) ct).getLayoutInflater(); View v = inflater.inflate(R.layout.custom_aler_update, null); builder.setView(v); builder.setCancelable(false); builder.create(); basic_reg = builder.show(); 

Кой в стиле

  <style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@color/primaryTextColor</item> <item name="android:background">@color/white</item> </style> 

Диалоговый фрагмент – это самый простой способ создания настраиваемого диалогового окна оповещений. Выполните вышеуказанный код, чтобы создать собственное представление для своего диалога, а затем реализовать его с помощью диалогового фрагмента. Добавьте следующий код в файл макета:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="80dp" android:background="#3E80B4" android:orientation="vertical"> <TextView android:id="@+id/txt_dia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:text="Do you realy want to exit ?" android:textColor="@android:color/white" android:textSize="15dp" android:textStyle="bold" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#3E80B4" android:orientation="horizontal"> <Button android:id="@+id/btn_yes" android:layout_width="100dp" android:layout_height="30dp" android:background="@android:color/white" android:clickable="true" android:text="Yes" android:textColor="#5DBCD2" android:textStyle="bold" /> <Button android:id="@+id/btn_no" android:layout_width="100dp" android:layout_height="30dp" android:layout_marginLeft="5dp" android:background="@android:color/white" android:clickable="true" android:text="No" android:textColor="#5DBCD2" android:textStyle="bold" /> </LinearLayout> </LinearLayout> 

См. « Диалоговое окно оповещения» с помощью диалогового окна «Фрагмент диалога», чтобы узнать, как это сделать.

Создать оповещение Диалоговое оформление что-то вроде этого

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn" android:layout_width="match_parent" android:text="Custom Alert Dialog" android:layout_height="40dp"> </Button> </LinearLayout> 

И добавьте ниже код в свой класс активности

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LayoutInflater inflate = LayoutInflater.from(this); alertView = inflate.inflate(R.layout.your_alert_layout, null); Button btn= (Button) alertView.findViewById(R.id.btn); showDialog(); } public void showDialog(){ Dialog alertDialog = new Dialog(RecognizeConceptsActivity.this); alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); alertDialog.setContentView(alertView); alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); alertDialog.show(); }