{"id":173,"date":"2017-03-20T00:33:55","date_gmt":"2017-03-20T00:33:55","guid":{"rendered":"https:\/\/blog.jkanework.com\/post.php?idpost=173"},"modified":"2017-03-20T00:33:55","modified_gmt":"2017-03-20T00:33:55","slug":"crear-dialogos-personalizados-en-android","status":"publish","type":"post","link":"https:\/\/blog.jkanetwork.com\/?p=173","title":{"rendered":"Crear dialogos personalizados en Android"},"content":{"rendered":"<p style=\"text-align: justify;\">Buenas lectores, con el desarrollo de <em>ThiefBuster<\/em><em>s<\/em>, el juego que estamos creando para Android, cada d&iacute;a nos encontramos con retos m&aacute;s grandes, hace unos d&iacute;as ten&iacute;a la misi&oacute;n de crear un di&aacute;logo para pedir los datos al usuario cuando fuese la primera vez que jugara y aprend&iacute; como hacer un di&aacute;logo personalizado y que se mostrara y funcionara. En este tutorial os ense&ntilde;ar&eacute; como lo hice para que os pueda servir aunque dar&eacute; por hecho que ya sab&eacute;is programar en Java, hacer Layouts para Android y ten&eacute;is algo de idea en lo que respecta a un Evento y su captura.<\/p>\n<p style=\"text-align: justify;\">Lo primero que ten&eacute;is que tener claro es que un di&aacute;logo es un proceso distinto al programa principal as&iacute; que cuando lo llamemos tendremos que tener en cuenta que las sentencias siguientes se ejecutar&aacute;n con normalidad.<\/p>\n<p style=\"text-align: justify;\">Ahora, realizamos un layout, a ser posible relativo y ponemos en el lo que queremos que aparezca. Aqu&iacute; os dejo el Layout en cuesti&oacute;n que hicimos para el di&aacute;logo:<\/p>\n<pre class=\"language-markup\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;RelativeLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"&gt;\n    &lt;TextView\n        android:id=\"@+id\/welcome\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"EEEEE\"\n        android:textSize=\"20dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_centerHorizontal=\"true\" \/&gt;\n    &lt;TextView\n        android:id=\"@+id\/name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:text=\"EEEEE\"\n        android:layout_below=\"@+id\/welcome\"\n        android:layout_centerHorizontal=\"true\" \/&gt;\n    &lt;TextView\n        android:id=\"@+id\/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id\/welcome\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"5dp\"\n        android:text=\"\" \/&gt;\n    &lt;EditText\n        android:id=\"@+id\/nameBox\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:ems=\"10\"\n        android:inputType=\"textPersonName\"\n        android:text=\"\"\n        android:layout_marginTop=\"11dp\"\n        android:layout_below=\"@+id\/name\"\n        android:layout_centerHorizontal=\"true\" \/&gt;\n    &lt;TextView\n        android:id=\"@+id\/sex\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        android:text=\"WWWWWWWWW\"\n        android:layout_below=\"@+id\/nameBox\"\n        android:layout_centerHorizontal=\"true\" \/&gt;\n    &lt;RadioGroup\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignLeft=\"@+id\/name\"\n        android:layout_alignStart=\"@+id\/name\"\n        android:layout_below=\"@+id\/sex\"\n        android:layout_marginTop=\"25dp\"\n        android:orientation=\"horizontal\"&gt;\n        &lt;RadioButton\n            android:id=\"@+id\/girl\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:checked=\"true\"\n            android:layout_alignBaseline=\"@+id\/boy\"\n            android:layout_alignBottom=\"@+id\/boy\"\n            android:layout_alignRight=\"@+id\/textView\"\n            android:layout_alignEnd=\"@+id\/textView\" \/&gt;\n        &lt;RadioButton\n            android:id=\"@+id\/boy\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:layout_below=\"@+id\/sex\"\n            android:layout_toRightOf=\"@+id\/textView\"\n            android:layout_toEndOf=\"@+id\/textView\" \/&gt;\n    &lt;\/RadioGroup&gt;\n&lt;\/RelativeLayout&gt;<\/code><\/pre>\n<blockquote>\n<p>Detalle, la raz&oacute;n por la que los textos son as&iacute; es porque luego los cambiamos din&aacute;micamente.<\/p>\n<\/blockquote>\n<p>&nbsp;Luego de tener el layout bien definido creamos una clase con el nombre que queramos y la extendemos de DialogFragment (ojo DialogFragment de android.app)<\/p>\n<pre class=\"language-java\"><code>public class NewUserDialog extends DialogFragment<\/code><\/pre>\n<p>Luego sobrescribimos el m&eacute;todo onCreateDialog al que le pasamos un Bundle y que devuelve un Dialog (que no DialogFragment). Aqu&iacute; la cosa se complica pero voy a intentar explicarlo lo mejor posible.<\/p>\n<p>Lo primero que tenemos que hacer es definir que Layout vamos a usar. Lo hacemos con esta l&iacute;nea.<\/p>\n<pre class=\"language-java\"><code> final View content = getActivity().getLayoutInflater().inflate(R.layout.dialog_new_user,null);<\/code><\/pre>\n<p>Obviamente el layout ser&aacute; con el nombre que sea.<\/p>\n<p>Sobre la constante content haremos las funciones para seleccionar partes del layout:<\/p>\n<pre class=\"language-java\"><code>content.findViewById(R.id.welcome);<\/code><\/pre>\n<p>Y todas las cosas referentes al manejo din&aacute;mico del layout.<\/p>\n<p>Una vez que hayamos modificado lo necesario el layout de manera din&aacute;mica hacemos lo siguiente.<\/p>\n<p>Creamos un nuevo AlertDialog.Builder (nuevamente de android.app)<\/p>\n<pre class=\"language-java\"><code>AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());<\/code><\/pre>\n<p>Y ahora creamos el dialogo con el siguiente juego de instrucciones:<\/p>\n<pre class=\"language-java\"><code>builder.setView(content)\n                \/\/ Add action buttons\n                .setPositiveButton(\"\"\/*Mensaje para el bot&oacute;n positivo*\/, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int id) {\n                        \/\/C&oacute;digo para cuando se haga click en positivo\n                    }\n                })\n                .setNegativeButton(\"\"\/*Mensaje para el bot&oacute;n negativo*\/, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int id) {\n                        \/\/C&oacute;digo para cuando se haga click en negativo\n                    }\n                });\nreturn builder.create();<\/code><\/pre>\n<p>Recordad que es as&iacute;ncrono, por lo que tener cuidado si se espera algo del di&aacute;logo poner eso en los onClick y no despu&eacute;s de abrirlo.<\/p>\n<p>Ahora, tras generar el cuadro de di&aacute;logo tendremos que mostrarlo, pues bien, as&iacute; es como lo cosegu&iacute;.<\/p>\n<p>Nos vamos a la clase donde se mostrar&aacute; el di&aacute;logo (la clase debe disponer del m&eacute;todo getFragmentManager()) y en el momento en el que queramos que se muestre el di&aacute;logo hacemos lo siguiente.<\/p>\n<pre class=\"language-java\"><code>DialogFragment d = new NewUserDialog(); \/\/Instanciamos la clase con el dialogo\nd.setCancelable(false);\/\/Hacemos que no se pueda saltar el dialogo (opcional)\nd.show(getFragmentManager(), \"NEWUSER\"\/*Tag que particularmente no le he encontrado utilidad*\/); \/\/Mostramos el dialogo<\/code><\/pre>\n<p>Y as&iacute; ya tenemos un di&aacute;logo en la pantalla.<\/p>\n<p>Si alguno de los pasos no est&aacute; claro, has conseguido hacerlo de otra forma o hay algo err&oacute;neo no ovlides dejarlo en los comentarios. Dale me gusta si te ha ayudado y comparte por las redes sociales, muchas gracias por leernos y nos vemos en el pr&oacute;ximo art&iacute;culo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Buenas lectores, con el desarrollo de ThiefBusters, el juego que estamos creando para Android, cada d&iacute;a nos encontramos con retos m&aacute;s grandes, hace unos d&iacute;as ten&iacute;a la misi&oacute;n de crear un di&aacute;logo para pedir los datos al usuario cuando fuese la primera vez que jugara y aprend&iacute; como hacer un di&aacute;logo personalizado y que se [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-173","post","type-post","status-publish","format-standard","hentry","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts\/173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=173"}],"version-history":[{"count":0,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts\/173\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}