Ventás de Diálogos 2

De Manuais Informática - IES San Clemente.
Revisión del 18:22 11 nov 2014 de Angelfg (discusión | contribuciones) (DialogFragment)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Ir a la navegación Ir a la búsqueda

DialogFragment

Estes apuntes están postos como resposta a unha pregunta do foro.
A tarefa de PLATEGA non ten que facerse utilizando este tipo de diálogo.

Introdución

A partires da API 13 (Android 3.2) a forma de 'construír' os diálogos modificouse.

Se usades a forma anteriormente explicada funcionará pero vos marcará en Eclipse a liña como deprecated.

Android 2014 U3 15 Dialogos 1.JPG

Imos ver neste punto como poderíamos facer para construír os diálogos doutra forma.

Para explicalo teremos que falar antes dos DialogFragment e por extensión dos Fragment.

Información adicional:

Un fragment representa un 'trozo' da interface dun usuario. A idea dos fragment xurdiu polas dificultades que tiñan as aplicacións a adaptarse a tamaños grandes de pantalla (como as tablet´s).

Android 2014 U3 15 Dialogos 2.JPG
Imaxe obtida de [1]

Imaxinade que tedes unha aplicación que amosa unha lista de usuarios e que ó premer sobre un deles apareceran os seus datos completos.

Isto feito non móbil cunha pantalla de 4 polgadas levaría consigo a creación de dúas activities, xa que na mesma non cabe toda a información (necesitaríamos usar scroll, bastante incómodo).

Esta mesma aplicación levada a unha tablet de 10 polgadas non tería problema en visualizar todo na mesma pantalla.

Os fraqment vannos permitir dividir os elementos gráficos en 'anacos' que imos poder usar de forma independente nas activities. Así, no caso anterior podemos crear dous fragment, un coa lista e outro có detalle de cada usuario.

Agora dependendo do tamaño da pantalla podo facer que na pantalla pequena se amose un só fragment (a lista) é que o premer sobre un elemento da mesma apareza o outro fragment (o detalle).
Se o tamaño é grande (tablet) podo facer que aparezan os dous frament na mesma acitivity.

O código que xestiona a pulsación dun elemento da lista e amosar os datos estará definido no só sitio, o que modificamos é o sitio onde se visualiza o fragment en función do tamaño da pantalla.

Tendo claro o concepto de Fragment isto nos leva ó seguinte concepto: DialogFragment.

DialogFragment

  • Un DialogFragment é un Fragment que amosa unha ventá de diálogo e situase por enriba da nosa Activity.
Android 2014 U3 15 Dialogos 4.JPG


Os DialogFragment poden ser utilizados en versións anteriores á API 13, pero nese caso teremos que utilizar unha biblioteca de compatibilidade que nos proporciona Eclipse:

Android 2014 U3 15 Dialogos 3.JPG

Polo tanto se temos un Min SDK no android manifiesto menor á API 13 teremos que importar a clase DialogFragment de dita librería:

1 import android.support.v4.app.DialogFragment;

Un DialogFragment vai ter un layout asociado que vai compoñer o seu contido.

Definimos polo tanto o contido do noso diálogo:

Código da clase fragment_u3_15_layout_dialogo

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent" >
 6 
 7      <EditText
 8            android:id="@+id/editTexto"
 9            android:layout_height="wrap_content"
10            android:layout_width="match_parent"
11            android:inputType="text"
12            android:gravity="fill_horizontal"
13      />
14     <Button
15         android:id="@+id/buttonPecharDialogo"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_below="@+id/editTexto"
19         android:layout_centerInParent="true"
20         android:text="Pechar" />
21  
22 </RelativeLayout>

Agora deberemos crear unha clase que vai representar o DialogFragment e que vai cagar o layout anterior. Esta clase será a que instanciemos dende a nosa Activity.

Código da clase UD3_15_DialogoFragmento
Obxectivo: Clase que representa ó DialogFragment

 1 import android.os.Bundle;
 2 import android.support.v4.app.DialogFragment;
 3 import android.view.LayoutInflater;
 4 import android.view.View;
 5 import android.view.View.OnClickListener;
 6 import android.view.ViewGroup;
 7 import android.widget.Button;
 8 import android.widget.EditText;
 9 
10 public class UD3_15_DialogoFragmento extends DialogFragment{
11 
12 	public String valorTexto;
13 	
14 	@Override
15     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
16         
17 		final View rootView = inflater.inflate(R.layout.fragment_u3_15_layout_dialogo, container, false);
18         getDialog().setTitle(getTag());    	// O Tag se envía dende a activiy có método show.
19         
20         Button btn = (Button) rootView.findViewById(R.id.buttonPecharDialogo);
21         btn.setOnClickListener(new OnClickListener() {
22 			
23 			@Override
24 			public void onClick(View v) {
25 				// TODO Auto-generated method stub
26 				EditText edit = (EditText)rootView.findViewById(R.id.editTexto);
27 				valorTexto = edit.getText().toString();
28 				((U3_15_Dialogos)UD3_15_DialogoFragmento.this.getActivity()).pecharDialogo();
29 				dismiss();
30 			}
31 		});
32         
33         // Do something else
34         return rootView;
35     }
36 }

Analicemos o código.

  • Liña 2: Estamos a utilizar a librería de compatibilidade con versións anteriores de Android.
  • Liña 10: A nosa clase deriva de DialogFragment.
  • Liña 15: Ó derivar de DialogFragment sobreescribimos o método onCreateView que ten que devolver o View que conforma o diálogo.
No noso caso deberemos 'inflar' o layout deseñado anteriormente.
O obxecto da clase LayoutInflater permite pasar dun deseño gráfico (o layout) e un obxecto manexable por programación. Isto o fai chamando ó método inflate e o garda no obxecto rootView.
  • Liña 21: Có paso anterior, podemos acceder ós compoñentes gráficos que se atopan no layout por programación. No noso caso accedemos ó botón pechar e xestionamos o evento de click.
  • Liñas 25-31: O que facemos nestas liñas é acceder ó contido da caixa de texto do diálogo, o gardamos nunha propiedade da clase.
  • Liña 28: Esta liña vos dará un erro ata que usedes o código que ven a continuación. Esta liña chama a un método definido na activity que lanzou o DialogFragment.
  • Liña 29: Pechamos o diálogo.


Agora implantaremos a activity que vai facer uso do DialogFragment.

Aquí teremos dúas opcións:

  • Derivar a clase de Activity. Deberemos facer uso do método getFragmentManager().
  • Derivar a clase de FragmentActivity. Esta clase é unha subclase de Activity e está posta por compatibilidade coas versións anteriores.
No caso de utilizar esta clase deberemos facer uso do método getSupportFragmentManager. No noso exemplo imos facer uso deste método.

Definimos o layout da nosa activity:

Código da clase activity_u3_15__dialogos.xml
Obxectivo: Layout da nosa activity.

 1     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2        android:layout_width="fill_parent"
 3        android:layout_height="fill_parent"
 4        android:orientation="vertical" >
 5      
 6         <TextView
 7            android:layout_width="match_parent"
 8            android:layout_height="wrap_content"
 9            android:text="Ventás de diálogo" />
10         
11         
12         <Button
13 	        android:id="@+id/btn_dialogo"
14         	android:layout_width="match_parent"
15         	android:layout_height="wrap_content"
16         	android:onClick="onBotonClick"
17         	android:text="Ventá de diálogo con fragment" >
18     	</Button>
19 
20     </LinearLayout>


E agora o código da Activity:

Código da clase U3_15_Dialogos
Obxectivo: Amosar un diálogo baseado en Fragment.

 1 import android.os.Bundle;
 2 import android.support.v4.app.FragmentActivity;
 3 import android.support.v4.app.FragmentManager;
 4 import android.view.View;
 5 import android.widget.Toast;
 6 
 7 public class U3_15_Dialogos extends FragmentActivity {
 8 	
 9 	private UD3_15_DialogoFragmento dialogoFragmento;
10 	
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_u3_15__dialogos);
15         dialogoFragmento = new UD3_15_DialogoFragmento();
16     }
17 
18     public void pecharDialogo(){
19     	Toast.makeText(this, dialogoFragmento.valorTexto, Toast.LENGTH_LONG).show();
20     }
21     
22     public void onBotonClick(View view) {
23     	FragmentManager fm = getSupportFragmentManager();
24     	
25         switch (view.getId()) {
26         	case R.id.btn_dialogo:
27         		dialogoFragmento.show(fm, "EXEMPLO DE DIALOGO!!!!");
28                 break;
29 
30         }
31     }
32 }

Analicemos o código.

  • Liñas 2,3,7: Por compatibilidade con versións anteriores de Android escollemos a opción de utilizar un FragmentActivity.
  • Liña 9,15: Definimos e instaciamos o diálogo.
  • Liñas 18-20: Este é o método que chama a clase do Diálogo cando prememos o botón pechar.
  • Liña 23: Necesitamos un FragmentManager para amosar o diálogo.
  • Liña 27: Amosamos o diálogo.



Esta é unha primeira aproximación os DialogFragment. Comentar que en vez de sobreescribir o método onCreateView do DialogFragment podemos sobreescribir o método onCreateDialog e devolver un diálogo construído por nos (coma un DatePickerDialog, AlertDialog.builder,....) Por exemplo:

Código da clase UD3_15_DialogoFragmento
Obxectivo: Modificamos o código para amosar outra forma de crear un diálogo. Debemos comentar o código do método onCreateView.

 1 import android.app.AlertDialog;
 2 import android.app.Dialog;
 3 import android.content.DialogInterface;
 4 import android.content.DialogInterface.OnClickListener;
 5 import android.os.Bundle;
 6 import android.support.v4.app.DialogFragment;
 7 import android.widget.Toast;
 8 
 9 public class UD3_15_DialogoFragmento extends DialogFragment{
10 
11 	
12 	@Override
13     public Dialog onCreateDialog(Bundle savedInstanceState) {
14 		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
15 		.setTitle("Caixa de diálogo").setIcon(R.drawable.ic_launcher)
16 		.setMessage("QUE TE PARACE ESTE DIALOGO ?")
17 		.setPositiveButton("Ben", new OnClickListener() {
18 		@Override
19 		public void onClick(DialogInterface dialog, int which) {
20 			Toast.makeText(getActivity(), "PULSADA OPCION BOA",Toast.LENGTH_LONG).show();
21 		}
22 		}).setNegativeButton("MAL", new OnClickListener() {
23 		@Override
24 		public void onClick(DialogInterface dialog, int which) {
25 		//
26 
27 			Toast.makeText(getActivity(),"PULSADA OPCION MALA", Toast.LENGTH_LONG).show();
28 		}
29 		});
30 		return builder.create();
31 		
32 		
33 	}
34 	
35 }

Nota: Fixarse que estamos a importar a interface onClickListener do DialogInterface (liña 4).


Android 2014 U3 15 Dialogos 5.JPG




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2014).