# Programacion Multimedia ( Bor)
###### tags: `RET`
###### tags: `Borj`
# JUEVES 21 OCTUBRE
***ANDROID STUDIO***
https://developer.android.com/studio
NoxPlayer para poder emular
Genymotion para poder emular
recomendamos la api mas alta
antes hay que tener configurado la imagen del dispositivo para poder depurar
## SDK
C:\Users\Usuario\AppData\Local\Android\Sdk
C:\Users\Usuario\AppData\Local\Android\Sdk\extras
hay que instalar el sdk, avd (android visual studio)
**Android SDK** sdk manager (descargamos el sdk 30 o 31)
Android emulator
Android SDK platform tools
intel *86 emulator accelerator
nos situamos en la ruta con la cmd
Nos metemos dentro de la carpeta de android > dentro extras
dir extras/intel/ para cuando de algun problema
Dentro de la carpeta platform tools esta la herramienta llamada ADB(herramienta desde la consola hasta el telefono)
C:\Users\Usuario\AppData\Local\Android\Sdk\extras\intel
Por si tenemos algun problema
C:\Users\Usuario\AppData\Local\Android\Sdk\platform-tools\adb.exe
Herramienta desde la consola hasta el telefono virtualizado root
## AVD
para movil virtual emulado
## NEW PROJECT
Empty Activity (elegimos de plantilla para elegir un proyecto)
Package name (tenerlo en cuenta)

Cada Empty es una pantalla
Las pantallas constan de:
* Parte logica (.java) (Package Name>MainActiviy las clases)
* parte grafica (.xml)
Metodos minusculas
clases mayusculas
el .xml esta dentro de res>layout>activity_main.xml

Lanzadora y boton de home

drawable = para imagenes
layout = todas las partes graficas
mipmap = graficos escalables
values = colores y temas
**CONECTAR BASE DE DATOS**
jdb conector, el driver
mysqldb conector .jar que se agrega al proyecto
Gradle para conectarse a servidores, en el modulo se dicen las dependencias a descargar
# Viernes 22 OCTUBRE
## GITHUB
Crear repositorio Github para subir las practicas en privado
descargar github desktop
carpeta /documentos/repositorios
Creamos un proyecto en android studio, en la nueva carpeta que hemos creado una de proyectos y otra de practicas clase

Un servicio es algo que se ejecuta en segundo plano, manda peticiones a un servidor y recoge en segundo plano
## Primer Proyecto
onCreate = metodo que viene por defecto
se asocia con el setconventview
Clase R = se tiene todos los recursos para acceder a cualquier sitio, en la clase R se guardan numero se guardan enteros
PRIMER PROYECTO POR DEFECTO TEMA03 (HELLO WORLD)

Poner en vertical

Quitamos el peso

wrapcontent se va a comportar en ancho lo que necesite segun el tamaño de las letras
math parent se pega a las paredes

Terminamos el dia viernes

# Lunes 25 Octubre Por mi cuenta para avanzar Github DevelopSys
## Layout
No hace falta interfaz grafica agrupa distintas vistas en su interior
hay distintos tipos de layout segun lo que queramos hacer
**Linear layout**
```java=
<?xml version="1.0" encoding="utf-8"?>
<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"
android:layout_margin="20dp"
tools:context="developandsystem.componentesinicial.LayoutActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="ELEMENTO 1"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:id="@+id/textView2" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="ELEMENTO 2"
android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
</LinearLayout>
```

Para ponerlo de manera horizontal hay que tener cuidado con el width ya que marca como se ensancha
```java=
android:orientation="horizontal"
```
**Relative Layout**
RelativeLayout se trata de un gestor del espacio que coloca los elementos con respecto al superior. De esta forma podemos colocar las cosas de forma más precisa, con la única restricción que todos los elementos tienen que tener asociado un ID para poder referirnos a ellos en las propiedades de colocación. Estas propiedades son las siguientes:
android:layout_above
android:layout_below
android:layout_toLeftOf
android:layout_toRightOf
android:layout_alignLeft
android:layout_alignRight
android:layout_alignTop
android:layout_alignBottom
android:layout_alignBaseline
android:layout_alignParentLeft
android:layout_alignParentRight
android:layout_alignParentTop
android:layout_alignParentBottom
android:layout_centerHorizontal
android:layout_centerVertical
android:layout_centerInParent
**Frame Layout**
Frame Layout es un gestor del espacio muy parecido a lo que es el CardLayout en Swing. Nos permite superponer capas una encima de otra con la posibilidad de mostrar todas al mismo tiempo o de mostrar solo una en específico, indicándoselo mediante la propiedad tag. Este layout es muy utilizado en los Fragments ya que estos aparecen y desaparecen en un mismo sitio dependiendo de la interacción del usuario.
```java=
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="horizontal"
android:layout_margin="20dp"
tools:context="developandsystem.componentesinicial.LayoutActivity">
<View
android:layout_width="match_parent"
android:layout_height="320dp"
android:background="#9c9db3fa"
android:tag="fondo"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo_frame"
android:tag="logo"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delevop & Sys"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="50dp"
android:gravity="center"
android:layout_marginTop="240dp"
android:fontFamily="casual"
android:tag="letras"/>
</FrameLayout>
```

**Table Layout**
El gestor del espacio TableLayout es una especialización de LinearLayout. Al igual que pasa en HTML, un TableLayout necesita la declaración de un TableRow para poder añadir una fila en la cual se situarán las vistas concretas, las cuales harán las veces de columnas. En concreto, cada vista que se añade a un TableRow va a parar a una columna diferente. Por ese motivo se suele decir que cada celda de un TableLayout sólo puede contener una vista. No obstante, nada impide que cualquiera de esas vistas sea un diseño y que contenga, a su vez otras vistas dentro.
Hacer que las columnas aprovechen el espacio en su totalidad mediante la propiedad strechColumn o shrinkColum
```java=
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="*"
tools:context=".TableActivity">
</TableLayout>
```
Declarar un par de filas dentro del layout. SE HACE CON TABLE ROW Estos elementos tienen como opción la configuración de alto y ancho. En este caso ocuparán en 50% cada una
SE CREA TABLE LAYOUT Y DENTRO TABLE ROW
```java=
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="*"
tools:context=".TableActivity">
<TableRow
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5">
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5">
</TableRow>
</TableLayout>
```
Para escribir dentro de cada fila algo debe ser con TextView (puede ser texto o cualquier otro elemento)
```java=
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="*"
tools:context=".TableActivity">
<TableRow
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5">
<TextView
android:text="Elemento 1"
android:textSize="20dp" />
<TextView
android:text="Elemento 2"
android:textSize="20dp" />
<TextView
android:text="Elemento 3"
android:textSize="20dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5">
<TextView
android:text="Elemento 4"
android:textSize="20dp" />
<TextView
android:text="Elemento 4"
android:textSize="20dp" />
</TableRow>
</TableLayout>
```
Decir la posicion de un elemento por defecto sera de izquierda a derecha, habria que añadir esto a un elemento
```java=
android:layout_column="2"/>
```
Que un elemento ocupe dos columnas con layout span
```java=
android:layout_span="2"
android:layout_gravity="center_horizontal"/>
```
EJEMPLO
```java=
<?xml version="1.0" encoding="utf-8"?>
<TableLayout 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:layout_margin="20dp"
android:orientation="horizontal"
android:stretchColumns="*"
tools:context="developandsystem.componentesinicial.LayoutActivity">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".25">
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="1"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="2"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="3"
android:textSize="50dp" />
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight=".25">
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="4"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="5"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="6"
android:textSize="50dp" />
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight=".25">
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="7"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="8"
android:textSize="50dp" />
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:text="9"
android:textSize="50dp" />
</TableRow>
<TableRow
android:layout_height="0dp"
android:layout_weight=".25">
<Button
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored"
android:layout_gravity="center_vertical"
android:layout_span="3"
android:text="="
android:textSize="50dp" />
</TableRow>
</TableLayout>
```

**ConstraintLayout**
Declarar el Constrain y darle propiedades
```java=
<android.support.constraint.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto">
</android.support.constraint.ConstraintLayout>
```
# Miercoles 27 de Octubre
Tema 3 repaso
Second y third activity
Para traer elementos de parte grafica a parte java tienes que darle un id y es llamado con la clase R
Creamos el String

Y lo apuntamos

Todas las pantallas se declaran en el android manifest
CICLO DE VIDA

Logcat
Se utiliza para encontrar el fallo concreto que puede dar al ejecutar la aplicacion
(abajo a la izquierda)
# Viernes 29 de Octubre
Creamos el tercer Activity Third Activity y la ponemos como lanzadora
```java=
<activity
android:name=".ThirdActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
```

## Distintas Clases
android:layout_width="match_parent" -----> se pega
android:layout_height="match_parent" -----> se pega
android:layout_margin="20dp" ------> un margen de 20 pixeles
android:orientation="vertical" ------> orientacion vertical
tools:context=".ThirdActivity" ------> nombre de la activity
TEXTO
android:layout_width="match_parent" ------> ANCHO se pega
android:layout_height="wrap_content" ------> ALTURA lo que necesita
android:text="Cambio de pantalla" ------> TEXTO
android:textSize="30sp" ------> TAMAÑO TEXTO
android:gravity="center" ------> GRAVITA EN EL CENTRO ????
android:layout_marginBottom="40dp" ------> MARGEN POR ABAJO
android:layout_width="match_parent" ------> ANCHO se pega
android:layout_height="wrap_content" ------> ALTURA lo que necesita
android:id="@+id/edit_nombre" ------> SE LE DA UNA ID LA CUAL LUEGO SE UTILIZA PARA LLAMARLO

match se pega
wrap ocupa lo que tiene que ocupar
## EJERCICIO
Aplicacion la cual te pido NOMBRE, APELLIDO, TELEFONO, y un CHECK de EXPERIENCIA.
Luego todo se mandara a otra pagina y debe de aparecer todo recogido y de forma bonita.
**PARTE LOGICA**
Four Activity
```java=
public class FourActivity extends AppCompatActivity {
private TextView recuperar_nombre;
private TextView recuperar_apellido;
private TextView recuperar_telefono;
private CheckBox recuperar_experiencia;
private String nombre, apellido;
private int telefono;
private boolean experiencia;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
if (getIntent().getExtras() != null) {
instancias();
recuperarDatos();
}
}
private void instancias(){
recuperar_nombre = findViewById(R.id.recuperar_nombre_grafico);
recuperar_apellido = findViewById(R.id.recuperar_apellido_grafico);
recuperar_telefono = findViewById(R.id.recuperar_telefono_grafico);
recuperar_experiencia = findViewById(R.id.recuperar_experiencia_grafica);
}
private void recuperarDatos() {
nombre = getIntent().getExtras().getString("nombre");
apellido = getIntent().getExtras().getString("apellido");
telefono = getIntent().getExtras().getInt("telefono");
experiencia = getIntent().getExtras().getBoolean("experiencia");
/*Log.v("test", nombre);
Log.v("test", apellido);*/
recuperar_nombre.setText(nombre);
recuperar_apellido.setText(apellido);
recuperar_telefono.setText(String.valueOf(telefono));
recuperar_experiencia.setChecked(experiencia);
}
}
```
**PARTE GRAFICA**
Fou
```java=
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".FourActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Nombre"
android:textSize="25sp"
/>
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/recuperar_nombre_grafico"
android:textSize="25sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Apellido"
android:textSize="25sp"
/>
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Lo que recibo"
android:id="@+id/recuperar_apellido_grafico"
android:textSize="25sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Telefono"
android:textSize="25sp"
/>
<TextView
android:layout_width="0dp"
android:layout_weight="0.5"
android:layout_height="wrap_content"
android:text="Lo que recibo"
android:id="@+id/recuperar_telefono_grafico"
android:textSize="25sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/recuperar_experiencia_grafica"
android:text="Experiencia"
android:checked="false"
android:layout_marginBottom="40dp"
/>
</LinearLayout>
</LinearLayout>
```
Android Manifest
En el android manifest le indicamos cual va a ser la launcher (lanzadora)
```java=
<activity
android:name=".ThirdActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
```
Third Activity

Traer de la parte grafica a la parte logica
# Miercoles 3 de Noviembre
En vez de pasar distintos nombre, apellido, telefono.
Pasaremos un objeto con todo ello.
Crear un nuevo paquete

Boton derecho getter and setter
Creamos un constructor con todo
Serializacion EJERCICIO
https://github.com/DevelopSys/ClasePMDM/blob/master/T3/codigos2122/T03_RepasoDos/app/src/main/java/com/example/t03_repaso/ThirdActivity.java
# Viernes 5 de Noviembre
Incluimos imagen en la practica
JUEGO DE CARTAS (PRACTICA)
MENU A
GAMEA c
Para poner imagenes que vienes por defecto en android
android:drawableLeft="@android:drawable/ic_menu_directions"


# Jueves 18 de Noviembre
Cambiar el idioma de la aplicacion dependiendo del la region del cliente
Cambiar la aplicacion dependiendo de la orientacion.
# Viernes 19 de Noviembre
Continuamos haciendo practicas
# Lunes 22 Noviembre
Ejercicio Elementos,
Toggle
# Explicaciones PRACTICAS
## PRACTICA JUEGOCARTAS
## PRACTICA ALEATORIOS
Para poner el fondo transparente
android:background="@android:color/transparent"
Aprender a inicializar un ArrayList
https://www.geeksforgeeks.org/initialize-an-arraylist-in-java/
Método que devuelve true en el caso de que el tamaño de la cadena sera 0. En otro caso devuelve false.
(!nombre.getText().toString().isEmpty())
## PRACTICA CALCULADORA
## Preguntas
Porque los botones de aleatorio no estan en blacno y como podria cambiar el color
android:background="@android:color/transparent"
Avisar de la aplicacion juego de cartas la has movido y por eso sale algo raro
esta igualado al principio a 1 y no a 0
has hecho el ejercicio con los tables row, comentarselo
llego la peticion del github
# Lunes 29 de Noviembre
Listas (se va pasando)
Spinner (desplegable)
# Miercoles 1 de Diciembre
Adaptador Spiner, en la carptera de Listas > adapters
Imagenes de los coches cambiar el nombre del coche que es default cambiar el nombre por defecto
# Jueves 2 de Diciembre
Creo graficamente el spiner
hago el base adapter
asocio los elementos
rellenar la lista
# ***SEGUNDO TRIMESTRE***
# 28 ENERO 2022
Repaso de Dialogos
# 31 ENERO 2022
onCreate dialog
set tittle
uilder.setitems(opciones, new dialogo interfaces)
# 2 FEBRERO 2022
Crear xml
Interfaces de collback, se ejecuta algo en un lugar distinto al que esta definido
1- creo interfaz en el origen de los datos (guardo mayusculas y minusculas)
2- origen uso el met donde se realiza la comunic
3- destino implemento interfaz y escribo metodo
```java=
Public interfaz onDialogoListener{
void onDialogoSelected(string n);
}
```
app:showAsAction="ifRoom">
para que apareza fuera de los puntitus
## 9 FEBRERO 2022
FRAGMENTS
Implemeto metodo, el contexto seria el main activity
atrae las horas, time picker time picker int 1, int i1;
calendar.getinstance -> sao el calendario actual de la maquina
calendar_hour_of_day ->
CALENDARIO FECHA
en el destino de la comunicacion siempre hay que implementar la interfaz
https://www.develou.com/timepicker-en-android/
## 18 FEBRERO 2022
en el main activity lo indicamos cuando queremos saltar la accion, que nos salte el new sant y nos ponga el nuevo fragmento
cambiamos fragment con replace, le indicamos primero el lugar donde queremos hacer el cambio y el segundo parametro el fragmentodinamicodos.newinstance(elusuario que me ha indicado)
siempre despues de esto se pone el commit(garantiza la accion)
EJERCICIO
----------------------
recyclerview que pintaba los jugadores del streetfighter, al pulsar en vez de cambiar de pantalla, que nos haga la misma accion pero que lo haga con fragments, que nos salga un fragment por encima con los datos de cada jugador.