Intereting Posts
Как сделать EditText иметь максимальную ширину, но по-прежнему заполнять родительскую ширину Как добавить элементы на счетчик динамически в android? Does System.currentTimeMillis () возвращает время UTC? UnsatisfiedLinkError (com.esri.core.runtime.LicenseImpl.nativeIsClientIdValid) Firebase Android addListenerForSingleValueEvent иногда не возвращает данные Не удалось запустить таймер в службе в android Что такое alertcontroller.recyclelistview Отсутствие привилегий для доступа к службе камеры в Android 6.0 Команда Android не найдена даже с установкой PATH Как сохранить библиотеки тестирования Android отдельно от моих библиотек приложений в Android Studio? Проверьте, зарегистрирован ли пользователь уже с помощью Auth.GoogleSignInApi? Получить входной текст с пользовательским видом без edittext android Можно ли использовать вектор, который можно использовать так же, как я использовал 9 патчей? CardView вставляет темную линию внизу RuntimeException: родной шрифт не может быть выполнен

Android AlertDialog с закругленными углами

Я пытаюсь сделать свой диалог оповещений с закругленными углами, но как-то не могу. Я пробовал, и я потерпел неудачу. Я попытался следить за этим блогом http://blog.stylingandroid.com/archives/271 и сделал мои стили на основе этого.

Кстати, чтобы добавить к моему вопросу сейчас. Некоторые из моих новых находок. Код в приведенной выше ссылке просто отлично работает на 2.3.3 (GB), но не работает вообще в ICS. Некоторые изменения заставили код сломаться.

Я хочу избежать создания 9 патч-изображений, и поэтому я использую фигуры. 9 патч-изображение – последнее, что я попробую. Я знаю, что стиль диалога предупреждения Android использует 9 патч-изображений. Я уже посмотрел, прежде чем задавать этот вопрос.

/res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="MyTheme" parent="@android:style/Theme.Dialog"> <item name="android:alertDialogStyle">@style/dialog</item> </style> </resources> 

/res/values/styles.xml

 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppTheme" parent="android:Theme.Light" /> <style name="myImageView"> <!-- 3dp so the background border to be visible --> <item name="android:padding">3dp</item> <item name="android:background">@drawable/image_drawable</item> <item name="android:scaleType">fitCenter</item> </style> <style name="dialog"> <item name="android:fullDark">@drawable/dialog_body</item> <item name="android:topDark">@drawable/dialog_title</item> <item name="android:centerDark">@drawable/dialog_body</item> <item name="android:bottomDark">@drawable/dialog_footer</item> <item name="android:fullBright">@drawable/dialog_body</item> <item name="android:centerBright">@drawable/dialog_body</item> <item name="android:topBright">@drawable/dialog_title</item> <item name="android:bottomBright">@drawable/dialog_footer</item> <item name="android:bottomMedium">@drawable/dialog_footer</item> <item name="android:centerMedium">@drawable/dialog_body</item> </style> </resources> 

/res/drawable/dialog_title.xml

 <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="-1dp"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" /> <stroke android:color="#FFFFFF" android:width="1dp" /> </shape> </inset> 1 <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="-1dp"> <shape android:shape="rectangle"> <solid android:color="#FFFFFF" /> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" /> <stroke android:color="#FFFFFF" android:width="1dp" /> </shape> </inset> 

/res/drawable/dialog_body.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#FFFFFFFF" android:endColor="#FFFFFFFF" android:angle="270" /> </shape> 

/res/drawable/dialog_footer.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#FFFFFF" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" /> <stroke android:width="1dp" android:color="#FFFFFF" /> </shape> 1 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#FFFFFF" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" /> <stroke android:width="1dp" android:color="#FFFFFF" /> </shape> 

разреш / макет / dialog_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="45dp" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button1" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginTop="90dp" android:layout_toLeftOf="@+id/textView1" android:background="@drawable/button_selector" android:text="Ok" android:textColor="@android:color/white" android:textStyle="bold" /> <Button android:id="@+id/button2" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/button1" android:layout_marginRight="48dp" android:background="@drawable/button_selector" android:text="More" android:textColor="@android:color/white" android:textStyle="bold" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/button1" android:layout_marginTop="41dp" android:orientation="vertical" > </LinearLayout> </RelativeLayout> 

Мой код для AlertDialog:

 public static void createYesNoDialog(final Context context, String positivebuttonname, String negativebuttonname, String message, int messagedrawable, String headermessage, final DialogResponse dr) { final DialogResponse dialogResponse = dr; ContextThemeWrapper ctw = new ContextThemeWrapper(context, com.gp4ever.worldlogo.quiz.R.style.MyTheme); AlertDialog.Builder builder = new AlertDialog.Builder(ctw); LayoutInflater inflater = (LayoutInflater)context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(com.gp4ever.worldlogo.quiz.R.layout.dialog_layout, null); TextView text = (TextView)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.textView1); Button buttonOk = (Button)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.button1); Button buttonMore = (Button)layout.findViewById(com.gp4ever.worldlogo.quiz.R.id.button2); text.setText(message); if (messagedrawable > 0) { text.setCompoundDrawablesWithIntrinsicBounds(messagedrawable, 0, 0, 0); } else if (messagedrawable == 0) text.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); builder.setView(layout); builder.setCancelable(false); builder.setTitle(headermessage); builder.setIcon(android.R.drawable.ic_dialog_alert); final AlertDialog dialog = builder.create(); buttonOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.cancel(); } }); buttonMore.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.cancel(); } }); 

}

Мой текущий выход:

У меня нет закругленных углов. Я вижу, что он отличается от обычного стиля. Несмотря на то, что я меняю радиус на мой рисунок, углы не отражают этих изменений.

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

Вы можете сделать это, используя следующий код:

CustomDialog.java:

 public class MainActivity extends Activity{ private static final int ALERT_DIALOG = 1; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.main ); ( (Button) findViewById( R.id.button1 ) ) .setOnClickListener( new OnClickListener() { public void onClick( View v ) { showDialog( ALERT_DIALOG ); } } ); } @Override protected Dialog onCreateDialog( int id ){ Dialog dialog = null; if ( id == ALERT_DIALOG ) { ContextThemeWrapper ctw = new ContextThemeWrapper( this, R.style.MyTheme ); AlertDialog.Builder builder = new AlertDialog.Builder( ctw ); builder.setMessage( "Hello World" ) .setTitle( "Alert Dialog" ) .setIcon( android.R.drawable.ic_dialog_alert ) .setCancelable( false ) .setPositiveButton( "Close", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which ) { dialog.dismiss(); } } ); dialog = builder.create(); } if ( dialog == null ) { dialog = super.onCreateDialog( id ); } return dialog; } } 

dialog_title.xml

 <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetBottom="-1dp"> <shape android:shape="rectangle"> <solid android:color="#000000" /> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> </shape> </inset> 

dialog_footer.xml

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#7F7F7F" /> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> </shape> 

Просто измените размер радиуса в:

dialog_title.xml

а также

dialog_footer.xml

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

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

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


ОБНОВИТЬ:
Я не эксперт, но это то, что я нашел. Это может быть правильно или неправильно. После многих попыток я получил следующее:

1- ContextThemeWrapper не применим для API 14, он отлично работает на Gingerbread и более старых версиях, но с API> 10 он не работает.

2- чтобы преодолеть вышеупомянутую проблему и заставить ее работать с API> 10 по запросу, я заменю эту строку:

 ContextThemeWrapper ctw = new ContextThemeWrapper( this, R.style.MyTheme ); AlertDialog.Builder builder= new AlertDialog.Builder( ctw ); 

с этим:

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

Но вам нужно изменить:

 android:minSdkVersion="8" 

в

 android:minSdkVersion="11" 

Результат будет показан на следующем рисунке на ICS (API 14):

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

Это изображение от Samsung Galaxy S3, работающего под управлением ICS.

Примечание: измененный проект, инициированный с помощью API 14 SO manifest sdk, будет:

 <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="15" /> 

ЗАКЛЮЧИТЕЛЬНОЕ СЛОВО: Как мои маленькие знания в разработке Android (я не эксперт),

1- пользовательское диалоговое окно предупреждений выполняется плавно в API <10, но не> 10 с тем же кодом Java,

Если мы хотим, чтобы он работал в ICS с тем же эффектом, что и в API <10, нам нужно изменить код , поэтому он будет работать на ICS, но не будет работать в любой версии API 1.1.

2- даже результат в ICS не является удовлетворительным, круглый угол применяется только к названию, но не к нижнему колонтитулу.


ВТОРОЕ ОБНОВЛЕНИЕ: НАКОНЕЦ Я получаю все углы вокруг,

dialog_footer.xml padding к dialog_footer.xml следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#7F7F7F" /> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" /> <stroke android:color="#7F7F7F" android:width="1dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 

Выходное изображение:

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

Это изображение от Samsung Galaxy S3, работающего под управлением ICS.

Еще один шаг от ответа @iDroid Explorer

Добавьте эту строку при построении диалога

 dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 

И это приведет к исчезновению прямоугольника (что на самом деле является прозрачным) и получить идеальное закругленное диалоговое окно.

Я постараюсь решить одну и ту же проблему ниже, и она работает для меня. Даже для ICS.

1. Сначала я поставил тему в свой AlertDialog.

 final Dialog nag = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); nag.requestWindowFeature(Window.FEATURE_NO_TITLE); nag.setCancelable(true); nag.setContentView(R.layout.pop_exit); Button btnNO = (Button)nag.findViewById(R.id.btn_popup_NO); Button btnYES = (Button)nag.findViewById(R.id.btn_popup_YES); btnNO.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { nag.cancel(); } }); btnYES.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.exit(0); } }); nag.show(); 

2. Затем были реализованы пользовательские макеты для просмотра диалогового окна

pop_exit.xml

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:gravity="center" android:layout_height="fill_parent"> <!-- <LinearLayout android:orientation="vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="#95000056" android:layout_width="fill_parent" android:layout_height="wrap_content"> --> <LinearLayout android:orientation="vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:background="@drawable/round" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="Exit Application" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textStyle="bold" android:textColor="#fff" android:textSize="20dp" android:layout_marginTop="5dp" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="5dp" android:weightSum="2" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:gravity="center"> <Button android:text="No" android:layout_weight="1" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_popup_NO" /> <Button android:text="Ok" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_popup_YES" /> </LinearLayout> </LinearLayout> </LinearLayout> 

3. Теперь добавьте форму в фон родительского макета pop_exit.xml

Файл round.xml // shape

  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#99000056" /> <corners android:radius="35px" /> <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> </shape> 

Я просто делаю это. Он будет работать и для вас, и для ICS .

Надеюсь, это поможет вам. Если нет, то дайте мне знать.

Наслаждайтесь кодированием …

🙂

Как вы заявляете, вы не хотите использовать 9 патч-изображений, посмотрите здесь.

https://stackoverflow.com/a/1683195/940834

Принцип точно такой же, за исключением того, что вы назначаете фон вашему макету, где этот пример относится к линейной компоновке.

  1. Создайте xml в выпадающей папке с помощью dialog_corner.

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/main_background"/> <corners android:topLeftRadius="@dimen/margin_10" android:topRightRadius="@dimen/margin_10" android:bottomRightRadius="@dimen/margin_10" android:bottomLeftRadius="@dimen/margin_10" /> </shape> 

    2.put в макете

    Android: фон = "@ вытяжка / dialog_corner"

    3.В файле java держитесь ниже кода

Просмотреть mView = LayoutInflater.from (mContext) .inflate (R.layout.layout_pob, null); AlertDialog.getWindow (). SetBackgroundDrawable (новый ColorDrawable (Color.TRANSPARENT));