Tecnologías Móviles

clase 4

Ejercicio de la clase anterior

MainLayout

FormLayout

Ejercicio de la clase anterior - MainActivity

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        userAdapter = new UserAdapter(this);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ListView list = (ListView) findViewById(R.id.listaUsuarios);
        list.setAdapter(userAdapter);

        final Activity self = this;

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        assert fab != null;
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(self, FormActivity.class);
                startActivityForResult(i, OBTENER_USUARIOS);
            }
        });
    }

Ejercicio de la clase anterior - FormActivity

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);
        Button aceptar = (Button) findViewById(R.id.aceptar);
        Button cancelar = (Button) findViewById(R.id.cancelar);

        assert aceptar != null;
        aceptar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText nombre = (EditText) findViewById(R.id.nombre);
                EditText apellido = (EditText) findViewById(R.id.apellido);
                EditText mail = (EditText) findViewById(R.id.mail);

                Intent i = new Intent();
                i.putExtra("nombre", nombre.getText().toString());
                i.putExtra("apellido", apellido.getText().toString());
                i.putExtra("mail", mail.getText().toString());
                setResult(Activity.RESULT_OK, i);
                finish();
            }
        });

        assert cancelar != null;
        cancelar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

Ejercicio de la clase anterior - MainActivity




    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == OBTENER_USUARIOS && resultCode == RESULT_OK) {

            User usuario = 
                new User(
                    data.getStringExtra("nombre"), 
                    data.getStringExtra("apellido"), 
                    data.getStringExtra("mail")
                );

            userAdapter.addItem(usuario);

        }
    }

Ejercicio de la clase anterior - User

public class User {

    String mNombre;
    String mApellido;
    String mMail;

    public User(String nombre, String apellido, String mail) {
        mNombre = nombre;
        mApellido = apellido;
        mMail = mail;
    }

    public String getNombre() {
        return mNombre;
    }

    public String getApellido() {
        return mApellido;
    }

    public String getMail() {
        return mMail;
    }
}

Ejercicio de la clase anterior - UserAdapter

public class UserAdapter extends BaseAdapter {

    private Context mContext;

    ArrayList<User> usrs = new ArrayList<User>();

    public UserAdapter(Context context) {
        mContext = context;
    }

    @Override
    public int getCount() {
        return usrs.size();
    }

    @Override
    public User getItem(int position) {
        return usrs.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    ...
}

Ejercicio de la clase anterior - UserAdapter

public class UserAdapter extends BaseAdapter {

    ...

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            LayoutInflater li = LayoutInflater.from(mContext);
            convertView = li.inflate(R.layout.list_item, null);
        }
        User u = getItem(position);
        ((TextView) convertView.findViewById(R.id.nombre)).setText(u.getNombre());
        ((TextView) convertView.findViewById(R.id.apellido)).setText(u.getApellido());
        ((TextView) convertView.findViewById(R.id.mail)).setText(u.getMail());
        return convertView;
    }

    public void addItem(User usuario) {
        usrs.add(usuario);
        notifyDataSetChanged();
    }
}

Fragments

Representa una porción de la interfaz de un Activity.

 

Es un módulo reusable que se puede agregar, eliminar o reemplazar dentro de un Activity.

 

Un Activity puede contener mas de un Fragment

Fragments

Se pueden configurar para maximizar la experiencia del usuario.

Fragments - Ciclo de Vida

  • onAttach: Se llama cuando el Fragment es asociado al Activity.
  • onActivityCreated: Se llama cuando se va a crear el arbol de Views.
  • onActivityCreated: Se llama cuando el método onCreate del Activity terminó su ejecución.
  • onDestroyView: Se llama cuando se va a eliminar el arbol de Views.
  • onDetach: Se llama cuando el Fragment es desasociado del Activity.

Fragments

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment 
            android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment 
            android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>
FragmentManager fragmentManager = 
    getFragmentManager();
FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction();

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

Agregado dentro del Layout

Agregado Programáticamente

Fragments

Comunicación del Fragment con el Activity

//Obtener una referencia al Activity que contiene el Fragment
Activity padre = getActivity();

/* 
 * Para devolver resultados al Activity padre el primer paso
 * es crear una interfaz y hacemos que el Activity la implemente
 */
public interface OnSubmitListener {
    public void onSubmit(User usuario);
}

/*
 * Luego, en nuestro Fragment casteamos el Activity a la interfaz
 * y llamamos al método
 */

public static class FormFragment extends Fragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ...
        final OnSubmitListener listener = (OnSubmitListener) getActivity();
        save.setOnClickListener(new View.OnClickListener() {
            User usuario = ....;
            listener.onSubmit(usuario);
        });
        ...
    }
}

Ejercicio

A la aplicación creada en el ejercicio de la clase anterior, agregarle las siguientes características:

  • El listado de usuarios debe estar incluido dentro de un Fragment (ListFragment).
  • El formulario para dar de alta un usuario, debe estar incluido dentro de un Fragment (FormFragment).
  • Si el dispositivo se encuentra apaisado (landscape), el Activity debe incluir los 2 fragments uno al lado del otro (Revisar la clase 2).
  • Si el dispositivo se encuentra vertical, el Activity debe reemplazar el ListFragment con FormFragment cuando se quiere agregar un nuevo usuario.
  • Cuando hago click en un elemento de la lista, se debe poder editar dicho elemento reutilizando FormFragment.
  • Se debe poder eliminar un elemento de la lista.
Made with Slides.com