Manejadores en Androidlsub.org › mov › 3.handlers.pdf · Layout • LinearLayout •...
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));
}