AlertDialog Personalizado Contacto



También pueden ver "Contacto" desde un boton de menu
http://cursoandroidstudio.blogspot.com.ar/2014/09/contacto.html

MyActivity.java
import android.app.AlertDialog;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class MyActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        Button btnContacto = (Button) findViewById(R.id.btnContacto);
        btnContacto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MyActivity.this, Contacto.class);
                startActivity(i);
            }
        });

        Button btnAlertDialog = (Button) findViewById(R.id.btnAlertcontacto);
        btnAlertDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LayoutInflater inflater = getLayoutInflater();

                View dialoglayout = inflater.inflate(R.layout.contacto, null);

                final EditText etAsunto = (EditText) dialoglayout.findViewById(R.id.et_EmailAsunto);
                final EditText etMensaje = (EditText) dialoglayout.findViewById(R.id.et_EmailMensaje);

                Button btnEnviarMail = (Button) dialoglayout.findViewById(R.id.btnEnviarMail);
                btnEnviarMail.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        String subject = etAsunto.getText().toString();
                        String message = etMensaje.getText().toString();

                        Intent email = new Intent(Intent.ACTION_SEND);
                        email.putExtra(Intent.EXTRA_EMAIL, new String[] { "micorre@gmail.com"});
                        email.putExtra(Intent.EXTRA_SUBJECT, subject);
                        email.putExtra(Intent.EXTRA_TEXT, " mensaje " + message);

                        // need this to prompts email client only
                        email.setType("message/rfc822");
                        startActivity(Intent.createChooser(email, "Seleciona un cliente de correo"));

                    }
                });

                AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
                builder.setView(dialoglayout);
                builder.show();
            }
        });
    }
}

Nota: Si trabajamos desde un fragment hay que agregarle el "getActivity()" en la primera linea después del onClick(), entre todos los cambios.
LayoutInflater inflater = getActivity().getLayoutInflater();

Y en el AlertDialog hay que cambiar el "MyActivity.this" por "getActivity()". Si trabajamos desde un Fragment. (ante-penultima linea del código anterior)
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

Contacto.java
public class Contacto extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacto);

        Button btnSendMail = (Button) findViewById(R.id.btnEnviarMail);
        btnSendMail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //final EditText etDe = (EditText) getView().findViewById(R.id.et_EmailDe);
                final EditText etAsunto = (EditText) findViewById(R.id.et_EmailAsunto);
                final EditText etMensaje = (EditText) findViewById(R.id.et_EmailMensaje);

                //String to = etDe.getText().toString();
                String subject = etAsunto.getText().toString();
                String message = etMensaje.getText().toString();

                Intent email = new Intent(Intent.ACTION_SEND);
                email.putExtra(Intent.EXTRA_EMAIL, "micorreo@gmail.com");
                email.putExtra(Intent.EXTRA_SUBJECT, subject);
                email.putExtra(Intent.EXTRA_TEXT, message);

                // need this to prompts email client only
                email.setType("message/rfc822");

                startActivity(Intent.createChooser(email, "Seleciona un cliente de correo"));
            }
        });

    }
}

contacto.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="5dp"
    android:layout_margin="10dp"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="¿Quieres hacer un pedido?"
        android:id="@+id/textView2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Contactate por acá"
        android:id="@+id/textView3" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollView" >

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:weightSum="1">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Asunto:"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_marginTop="12dp"/>

            <EditText
                android:id="@+id/et_EmailAsunto"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:hint="Escribe tu Asunto">
            </EditText>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Mensaje:"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:layout_marginTop="10dp" />

            <EditText
                android:id="@+id/et_EmailMensaje"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="top"
                android:hint="Escribe tu Mensaje"
                android:inputType="textMultiLine"
                android:lines="7"/>

            <Button
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Enviar"
                android:id="@+id/btnEnviarMail" />
        </LinearLayout>
    </ScrollView>

</LinearLayout>

AndroidManifest.xml
 <activity android:name=".Contacto"></activity> 

26 comentarios:

  1. buenas amigo me podrias ayudar con una cuestion que tengo, lo que pasa esque en mi caso yo no tengo ningun boton hablando del contacto, yo lo tengo dentro de un navigation fragment, me podrias ayudar para saber como incorporarlo?

    ResponderEliminar
  2. Amigo, muchisimas gracias por tus tutoriales, son muy buenos.

    ResponderEliminar
  3. Hola Ramiro, nuevamente te escribo, para ver si puedes sacarme de una duda que tengo.

    Hace referencia a los startActivity a la hora de realizar un ACTION, como pueda ser abrir una aplicación instalada en el móvil.

    ¿Cómo puedo hacer para añadirle los parámetros que necesite? Tales como el ActivityPackage, ActivityClass, DataType, DataUri, etc.

    Por poner un ejemplo, en otro tipo de códigos, si queremos lanzar la aplicación Google Maps desde un método onClick, necesitamos de un:

    Action: android.intent.action.VIEW
    ActivityClass: com.google.android.maps.MapsActivity
    ActivityPackage: com.google.android.apps.maps
    DataUri: geo:0,0?q=Gran Vía Parque, Córdoba

    Me gustaría saber si existe alguna forma de poder implementar desde la plataforma Android Studio este tipo de eventos, sin tener que crear una clase nueva que haga mención a la API de Google.

    Gracias por tu atención, sigo enganchado a tus videos, un saludo.

    ResponderEliminar
    Respuestas
    1. Hola sabes que ayer lo implementé justamente lo que me estas diciendo, la primera vez que lo llamaba andaba bien, la segunda vez fallecia. Nose porque, entonces implemente esto -> http://cursoandroidstudio.blogspot.com.ar/2014/11/listview-animado.html .. lo que hago con un boton, hago que aparezca y desaparezca el mapa.. justamente estoy colaborando en un proyecto descargalo y mira lo que te digo https://play.google.com/store/apps/details?id=com.tatoado.tottiapp lo podes ver en "san juan de noche" "boliches"

      Eliminar
    2. Mi enhorabuena Ramiro, estáis realizando un magnifico trabajo con la aplicación tottiapp. La verdad que si, me ha encantado, la idea de mostrar los mapas de esa forma tan llamativa en pantalla, es genial, estoy deseando ver un nuevo tutorial en donde nos muestres como lo haces…

      Por mi parte te adjunto a continuación el código de cómo he conseguido lanzar la aplicación Maps desde un método onClick, de ésta manera se abriría por defecto, mostrándonos a continuación las opción que deseemos incluir en el código, como pueda ser la ubicación en mapa o en Street View y también la ruta de navegación hasta el destino fijado.

      Espero pueda ser de ayuda y mil gracias por todo, eres un crack!!

      Button btnMaps = (Button) findViewById(R.id.btnMaps);

      btnMaps.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      try{
      Intent Maps = new Intent(Intent.ACTION_VIEW);

      //Opción 1: Se abre por defecto Maps con la ubicación referida
      Maps.setData(Uri.parse("geo:0,0?q=Avenida Gran Vía Parque, Córdoba"))

      //Opción 2: Se abre por defecto Maps calculando la ruta de navegación hasta la ubicación referida
      //Maps.setData(Uri.parse("google.navigation:///?q=Avenida Gran Vía Parque, Córdoba"))

      //Opción 3: Se abre por defecto Maps mostrandonos en Street View la ubicacción referida //Maps.setData(Uri.parse("https://www.google.es/maps/place/Av.+Gran+V%C3%ADa+Parque,+14005+C%C3%B3rdoba/@37.8811742,-4.7933973,3a,75y,81.33h,90t/data=!3m4!1e1!3m2!1skl4LXSZcoyqzjw9wHFJZzw!2e0!4m2!3m1!1s0xd6cdf5f61664a1f:0x493a31e6c09a5034"))

      .setPackage("com.google.android.apps.maps");
      startActivity(Maps);
      }catch (Exception e){
      e.printStackTrace();
      }
      }
      });



      Eliminar
  4. Basándome en el código anterior, del comentario que te escribí, aquí tienes la forma abreviada de poder enviar un correo perfectamente, pruébalo instalando el apk que generes, ya que el emulador no soporta la acción, pero vamos te puedo asegurar, que una vez instalado, funciona perfectamente y sin ningún problema.

    Aparte de ahorrar código, lo bueno que tiene, es que a la hora de abrir el diálogo para seleccionar un uso de cliente, solo y únicamente nos mostrara, Correo electrónico y Gmail, esto es gracias a que utilizamos ACTION_VIEW en vez de ACTION_SEND.

    Espero te guste, un saludo Ramiro.


    Button btnEnviar = (Button) findViewById(R.id.btnEnviar);

    btnEnviar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    try {
    Intent correo = new Intent(Intent.ACTION_VIEW);

    /*A continuación detallamos el correo, asunto y mensaje de texto a escribir, también
    lo podemos concatenar ("..."+variable+"...") a tres variables String, enlazadas a su
    vez a los valores que se escriban en sus respectivos textView*/
    correo.setData(Uri.parse("mailto:tu@correo.com?subject=Curso Android Studio&body=Nueva forma abreviada de mandar un correo"));

    startActivity(Intent.createChooser(correo, "Seleccione un cliente de correo"));

    }catch (Exception e){

    Toast.makeText(getApplicationContext(),
    e.getMessage().toString(), Toast.LENGTH_LONG)
    .show();
    e.printStackTrace();
    }
    }
    });

    ResponderEliminar
  5. Ramiro ¿conoces de algún programa para pc, que conectando el smartphone o la tablet a él, nos muestre la pantalla de éstos en el pc? De forma que podamos hacer presentaciones a través de un proyector. Gracias

    ResponderEliminar
    Respuestas
    1. Sabes que si lo he escuchado justamente lo que me decis, pero no le he prestado atención, es una clonación de lo que haces en tu celular en la pc, pero nunca lo he visto funcionando. Si lo vuelvo a escuchar te escribo.

      Eliminar
    2. Sabes que si lo he escuchado justamente lo que me decis, pero no le he prestado atención, es una clonación de lo que haces en tu celular en la pc, pero nunca lo he visto funcionando. Si lo vuelvo a escuchar te escribo.

      Eliminar
    3. De todas formas, porque no el emulador de AndroidStudio? sino genymotion para eclipse. Andan bastante bien

      Eliminar
    4. Agradezco tu respuesta Ramiro, tienes toda la razón, pero hay ciertas funcionalidades que me gustaría mostrar desde el dispositivo, ya que para una presentación no quedaría igual de vistoso. Aparte algunas de ellas el emulador no las soportaría, me refiero a tales como realizar llamadas en vivo, envío de WhatsApp, activación de bluetooth, detección de conexión de red de datos móviles o también wifi, verificación de conectividad A-GPS y GPS, y ni que decir tiene el servicio Maps, entre otras.
      Te invito a que te descargues la aplicación que estoy desarrollando para una cafetería (http://mvhn.qr.ai) y de paso así me des tu opinión. Posiblemente tenga que hacer una presentación en breve para un congreso de hostelería, estoy muy ilusionado con la idea y las posibilidades laborales que podrían brindarme en un futuro. Ojalá así sea, como decís allá... acá en España el trabajo está muy mal!!!

      Un saludo y gracias nuevamente Ramiro

      Eliminar
    5. 1- la presentación no me gusta, parece que esta como tildada la secuencia de imagenes,
      al texto le falta un padding left y right
      2- no funciona la rotación de pantalla
      3- fondo gris es muy pobre, no me gusta
      4- cuando entre a las políticas de privacidad, lo apreté para haber si seguía para abajo (scroll) pero me volvió para atrás y me molesto, porque no quería volver para atrás quería saber si tenia scroll.
      5- me pierdo mucho en las transiciónes, nose cuando estoy llendo para adelante o para atrás, no le encuentro la jerarquia de los activities
      6- al tenedor que va hacia atrás, a lo mejor le falta una texto, nose si es intuitivo para todos los usuarios.
      7- el icono del rompecabezas, "acerca de".. no le encuentro relación entre una cosa y otra.. osea el nombre con el ícono
      En conclusión, creo que esta la idea, pero que deberías organizarla de otra manera.
      Le esta faltando un poco más de diseño y mejorar la navegación entro los activities
      Mira estos dos
      http://cursoandroidstudio.blogspot.com.ar/2014/09/webview.html (usa eso para las politicas de privacidad)
      http://cursoandroidstudio.blogspot.com.ar/2014/08/actionbar-ir-atras.html (usa esto para ir atrás, y sacale el tenedor)
      Espero que te sirva lo que te comente, saludos.

      Eliminar
  6. Me sirve y de mucho Ramiro, intento aprender más y más y la critica es una forma constructiva y positiva para mi de poder hacerlo, gracias de verdad por dedicarle tu tiempo y comentármelo a través de éstas líneas.

    Y no te falta razón, hay muchas incongruencias que intento pulir poco a poco, pero me lleva su tiempo. Nunca había desarrollado para Android, aunque si programe Java entre otros lenguajes, cuando cursaba mis estudios de Informática en la rama de programación, hace ya unos años que termine y he vuelto intentando recordar un poco de aquello.

    Je, je! Pero he empezado mal, por vagancia quizás de no complicarme mucho, he desarrollado ésta aplicación con AppInventor, dándome cuenta muy rápidamente de sus limitaciones, e intento ponerme las pilas con el nuevo entorno de Android Studio, muy parecido a Eclipse, para dejar de lado lo anterior.

    No me quiero enrollar mucho, pero tendré en estima tus criterios a la hora de mejorar ésta o cualquier otra aplicación que realice.

    Gracias de veras por tus consejos.

    ResponderEliminar
    Respuestas
    1. acá google te explica sobre diseño https://developer.android.com/design/index.html sino lo mejor es trabajar con un diseñador grafico, aunq son pocos lo que saben diseñar para moviles.

      Eliminar
  7. Podrias decir la manera de cerrar el alertdialog?

    ResponderEliminar
    Respuestas
    1. builder..setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int id) {
      // Your code when user clicked on Cancel

      }
      });

      Eliminar
  8. Que tal, excelente tutorial solo que tengo una duda, como podría hacerle en el codigo para asignar un correo del que lo envía ya predefinido? y en el código como implementarlo para que al destinatario le llegue, "el usuario example@gmail.com" te ha enviado un correo. De antemano gracias, Soy principiante

    ResponderEliminar
    Respuestas
    1. Ahí sale, no has mirado el código.
      En el ejemplo dice "micorre@gmail.com" vos lo cambias por el tuyo

      Eliminar
  9. Muchisimas gracias!!!
    Buen tutorial, me sirvio mucho.
    Gracias.
    Sigue asi.

    ResponderEliminar
  10. Hola Ramiro, estaba mirando tu código y me funciona muy bien, pero tengo un inconveniente estoy agregando un alertDialog personalizado al método del "botón atrás" que se encuentra en el dispositivo en el cual me pregunta si deseo salir de la actividad, en la opción de "SI" funciona perfectamente pero en la opción de "NO" no encuentro la forma de cerrar ese alertDialog personalizado sin afectar la actividad que estoy usando.

    Te agradezco de ante mano tu atención y colaboración.

    El codigo que utilizo es el siguiente:

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

    LayoutInflater inflater = getLayoutInflater();
    View dialoglayout = inflater.inflate(R.layout.s_btn_atras, null);

    Button btnSalir = (Button) dialoglayout.findViewById(R.id.btn_si);

    btnSalir.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    aceptar();
    finish();
    }
    });

    Button btnContinuar = (Button) dialoglayout.findViewById(R.id.btn_no);

    btnContinuar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

    }
    });

    AlertDialog.Builder builder = new AlertDialog.Builder(N_Perceptiva.this);
    builder.setView(dialoglayout);
    builder.show();
    }
    return super.onKeyDown(keyCode, event);
    }

    ResponderEliminar
  11. Una consulta, como podria personalizar mi spinner?

    ResponderEliminar
  12. Hola muy bueno tu código, pero tengo una duda, agregue un boton de CANCELAR para quitar el alertDialog pero no logro quitarlo, me puedes ayudar?

    ResponderEliminar
  13. Excelente tutorial, por no hablar de todo lo aprendido en otros gracias por sus APORTES, GRACIAS desde Colombia...

    un saludo !!!

    ResponderEliminar
  14. hola amigo, me puedes ayudar con algo, lo que pasa esque tengo una actividad que tiene un boton y cuando le doy a ese boton me trae un fragmento que contiene un boton flotante cuando le doy a ese boton me trae un dialogo personalizado, como hago para que cuando ingrese los parametros en ese EditText me los muestre en el fragmmento?

    ResponderEliminar