Manejadores en Androidlsub.org › mov › 3.handlers.pdf · Layout • LinearLayout •...

Post on 25-Jun-2020

1 views 0 download

Transcript of Manejadores en Androidlsub.org › mov › 3.handlers.pdf · Layout • LinearLayout •...

Manejadores en Android

LSUB, GYSC, URJC

Botones

• Vamos a hacer una aplicación con un grupo de botones

Layout

• LinearLayout

• Orientación vertical

• Con dos grupos de botones de radio

• de orientación horizontal

• con dos botones cada uno

RadioButtons

• On/Off

• Son excluyentes, sólo uno pulsado

Layout<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" tools:context=".MainActivity" >

<RadioGroup android:id="@+id/grp1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/grp1horiz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="@string/horiz" /> ... </RadioGroup> ...</LinearLayout>

Seleccionado

En strings.xml

Layout

ActivityMainpublic class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

RadioGroup g1 = (RadioGroup)findViewById(R.id.grp1);Button g1horiz = (Button)findViewById(R.id.grp1horiz);Button g1vert = (Button)findViewById(R.id.grp1vert);RadioGroup g2 = (RadioGroup)findViewById(R.id.grp2);Button g2horiz = (Button)findViewById(R.id.grp2horiz);Button g2vert = (Button)findViewById(R.id.grp2vert);

g1horiz.setOnClickListener(new Orientador(g1, this, LinearLayout.HORIZONTAL));

g2horiz.setOnClickListener(new Orientador(g2, this, LinearLayout.HORIZONTAL));

g1vert.setOnClickListener(new Orientador(g1, this, LinearLayout.VERTICAL));

g2vert.setOnClickListener(new Orientador(g2, this, LinearLayout.VERTICAL));

}

MainActivity

class Orientador implements OnClickListener {Activity mainWin;RadioGroup grp;int orientation;

Orientador(RadioGroup g, Activity w, int o){mainWin = w;grp = g;orientation = o;

}

@Overridepublic void onClick(View arg0) {

grp.setOrientation(orientation);}

}

ResultadoY lo podemos probar...

Manejando cambios

• Sin manejador para cada botón

• Usamos uno para cambios en el grupo

Layout <RadioGroup android:id="@+id/grp1" ... <RadioButton android:id="@+id/grphoriz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="@string/horiz" /> ... </RadioGroup> <RadioGroup android:id="@+id/grp2" ... <RadioButton android:id="@id/grphoriz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="@string/horiz" /> ... </RadioGroup>

Declaramos

Lo reusamos

Layout

public class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

RadioGroup g1 = (RadioGroup)findViewById(R.id.grp1);RadioGroup g2 = (RadioGroup)findViewById(R.id.grp2);

Orientador or = new Orientador(this);g1.setOnCheckedChangeListener(or);g2.setOnCheckedChangeListener(or);

}

Manejador

class Orientador implements OnCheckedChangeListener {Activity mainWin;

Orientador(Activity w){mainWin = w;

}

@Overridepublic void onCheckedChanged(RadioGroup g, int id) {

int or = LinearLayout.HORIZONTAL;if(id == R.id.grpvert){

or = LinearLayout.VERTICAL;}g.setOrientation(or);

}}

CheckButtons

• Checked/Unchecked

• Podemos marcar varios a la vez

Layout<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ... android:orientation="vertical" tools:context=".MainActivity" > <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:onClick="check" android:text="Turbo" /> <CheckBox ... android:text="Boost" /> </LinearLayout> <LinearLayout ... </LinearLayout></LinearLayout>

MainActivitypublic class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

}

...

public void check(View v){CheckBox b = (CheckBox) v;String txt = b.getText() + " ";if(b.isChecked()){

txt += "on";}else{

txt += "off";}int time = Toast.LENGTH_SHORT;Toast msg = Toast.makeText(MainActivity.this, txt, time);msg.show();

}}

Resultado

¿Manejar o no?

• A veces no querremos un manejador

• Consultamos si el botón está “checked” cuando lo necesitemos y listo.

Hay más botones...

• ImageButton

• Botones gráficos

• ToggleButton

• Botón que conmuta entre On-Off

• Similar a CheckBox

• Cambia el texto entre On y Off

Y hay más atributos

• Lo mejor es consultar el Javadoc

• O utilizar la ayuda de contexto en Eclipse

• Y jugar con ellos

Imágenes para botones <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/mi_img_boton"/>

Y como imagen podemos usar un selectoren lugar de un .png (en el directorio drawable, mi_img_boton.xml)

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/pulsado" /> <item android:state_focused="true" android:drawable="@drawable/foco_en" /> <item android:drawable="@drawable/normal" /> </selector>

Listas

• Para seleccionar algún elemento de entre un conjunto de ellos.

• Normalmente “pull down”

Listas

• Precauciones:

• La etiqueta se muestra según esté plegada/desplegada

• Poner un TextView antes que ocupe el lugar de la etiqueta

• Se envía un evento extra al principio y es mejor ignorarlo

Listas <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/etiqueta"/> <Spinner android:id="@+id/lista" android:prompt="@string/etiqueta" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/entradas" /></LinearLayout>

Listas

<?xml version="1.0" encoding="utf-8"?><resources>

<string name="app_name">App1</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> <string name="etiqueta">Ejemplo de Lista</string>

<string-array name="entradas"> <item>Hola</item> <item>Caracola</item> <item>Adios</item> <item>Oops</item></string-array>

</resources>

Listas

public class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner lista = (Spinner)findViewById(R.id.lista);lista.setOnItemSelectedListener(new Seleccion(this));

}

Listas private class Seleccion implements OnItemSelectedListener {

private MainActivity main;private boolean isFirst;

public Seleccion(MainActivity m){main = m;isFirst = true;

}@Overridepublic void onItemSelected(AdapterView<?> lista, View item,

int idx,long id) {if(isFirst){

isFirst = false;return;

}String str = lista.getItemAtPosition(idx).toString();int time = Toast.LENGTH_SHORT;str += " seleccionado";Toast msg = Toast.makeText(MainActivity.this, str, time);msg.show();

}...}

Listas

private class Seleccion implements OnItemSelectedListener {...

@Overridepublic void onNothingSelected(AdapterView<?> lista) {

int time = Toast.LENGTH_SHORT;String str = "nada seleccionado";Toast msg = Toast.makeText(MainActivity.this, str, time);msg.show();

}

}

Listas

Listas dinámicas <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/etiqueta"/> <Spinner android:id="@+id/lista" android:prompt="@string/etiqueta" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>

Listas dinámicas

<?xml version="1.0" encoding="utf-8"?><resources>

<string name="app_name">App1</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> <string name="etiqueta">Ejemplo de Lista</string></resources>

Ahora no tenemos ningún array de strings

Listas dinámicas public class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner lista = (Spinner)findViewById(R.id.lista);String[] nombres = {"Hola", "Caracola", "Adios", "Oops"};ArrayAdapter<String> arry =

new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, nombres);

arry.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);lista.setAdapter(arry);lista.setOnItemSelectedListener(new Seleccion(this));

}

Listas dinámicas public class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner lista = (Spinner)findViewById(R.id.lista);String[] nombres = {"Hola", "Caracola", "Adios", "Oops"};ArrayAdapter<String> arry =

new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, nombres);

arry.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);lista.setAdapter(arry);lista.setOnItemSelectedListener(new Seleccion(this));

}