Java tutorial
/* Author: Alberto Gil Tesa WebSite: http://giltesa.com License: CC BY-NC-SA 3.0 http://goo.gl/CTYnN Project: Task Calendar Package: com.giltesa.taskcalendar.activity File: /TaskCalendar/src/com/giltesa/taskcalendar/activity/Main.java */ /* NOTAS: Campo de busqueda: http://www.edumobile.org/android/android-development/action-bar-search-view/ PopPup Menu: http://developer.android.com/guide/topics/ui/menus.html#PopupMenu Paso de parametros entre Activities: http://stackoverflow.com/questions/12233106/really-not-getting-setresult-and-onactivityresult */ package com.giltesa.taskcalendar.activity; import java.util.ArrayList; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.PopupMenu; import android.widget.SearchView; import com.giltesa.taskcalendar.R; import com.giltesa.taskcalendar.adapter.TaskArrayListAdapter; import com.giltesa.taskcalendar.helper.PreferenceHelper; import com.giltesa.taskcalendar.helper.TagHelper; import com.giltesa.taskcalendar.helper.TaskHelper; import com.giltesa.taskcalendar.util.Tag; import com.giltesa.taskcalendar.util.Task; @SuppressLint("NewApi") public class Main extends FragmentActivity implements SearchView.OnQueryTextListener { /** * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the * sections. We use a {@link android.support.v4.app.FragmentPagerAdapter} derivative, which will * keep every loaded fragment in memory. If this becomes too memory intensive, it may be best * to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}. */ private static SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ private static ViewPager mViewPager; private SearchView mSearchView; protected PreferenceHelper prefs; private static Activity context; static ArrayList<Tag> tagArrayList; static ArrayList<Task> taskArrayList; static ListView listTask; static TaskArrayListAdapter taskArrayListAdapter; private static TaskHelper taskHelper; // Constantes publicas para facilitar la legibilidad en el metodo onActivityResult y en las Activityes hijas: public static final int BACK = 0, NEWTASK = 1; /** * */ @Override public void onCreate(Bundle savedInstanceState) { prefs = new PreferenceHelper(this); setTheme(prefs.getTheme()); super.onCreate(savedInstanceState); setContentView(R.layout.main); // Create the taskArrayListAdapter that will return a fragment for each of the three primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections taskArrayListAdapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); tagArrayList = new TagHelper(this).getTagArrayList(); taskHelper = new TaskHelper(this); context = this; } /** * */ @Override public void onStart() { super.onStart(); } /** * */ @Override protected void onResume() { super.onResume(); } /** * Desde este procedimiento se tratan todos los Intents que se reciban de otras Activities: * El primer y segundo parametro sirven para saber quien lanzo la llamada y quien devolvio la respuesta. * Es decir, el padre (Main) puede tener varios "startActivityForResult()" para llamar a otra Activity. * Y la Activity hija puede tener varios "setResult()" para devolver los datos. * Es con esos dos parametros como se pueden controlar esos datos. * | * Al final no se uso para nada, no hubo forma de actualizar la pantalla tras interactuar con sus items. * Asi que el activity que crea */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != BACK) mViewPager.setCurrentItem(data.getBundleExtra("dataActivity").getInt("positionSlider")); } /** * Se capturan todas las pulsaciones de las teclas fsicas del dispositivo para poder personalizar los eventos que lanzan. */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //Si la tecla pulsada es la de Atrs, y el usuario ha configurado la solicitud de confirmacin. Se pide dicha solicitud: if (keyCode == KeyEvent.KEYCODE_BACK && prefs.isConfirmExit()) { // Se muestra el mensaje por pantalla: AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setIcon(android.R.drawable.ic_dialog_alert); alert.setTitle(getResources().getString(R.string.main_exit_title)); alert.setMessage(getResources().getString(R.string.main_exit_summary)); alert.setNegativeButton(android.R.string.cancel, null); alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); alert.show(); // Como se ha tratado el evento de la tecla atrs, se devuelve true. return true; } // Si aqu no se ha tratado el evento se le enva al padre para que lo trate l. return super.onKeyDown(keyCode, event); } /** * */ @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); } /** * Se carga el ActionBar y se recupera el Campo de Busqueda. */ @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); inflater.inflate(R.menu.main_actionbar, menu); //Cuadro de busqueda MenuItem searchItem = menu.findItem(R.id.main_actionbar_search); mSearchView = (SearchView) searchItem.getActionView(); setupSearchView(searchItem); return true; } /** * Desde el metodo onOptionsItemSelected(), se tratan los eventos que produzcan los diferentes Items de los Menus. * Se tratan tanto los eventos del menu del boton fisico como los producidos por el boton del ActionBar. */ @SuppressLint("NewApi") public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Se trata el evento del boton Menu, y de sus SubMenus metidos en un PopupMenu: case R.id.main_actionbar_menu: PopupMenu popup = new PopupMenu(this, findViewById(R.id.main_actionbar_menu)); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.main_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.main_menu_newtask: // Se crea un Intent y un Bundle con la informacion a enviar al nuevo Activity: Intent intent = new Intent(context, NewTask.class); Bundle bundle = new Bundle(); bundle.putBoolean("isNewTask", true); bundle.putInt("positionSlider", mViewPager.getCurrentItem()); intent.putExtra("dataActivity", bundle); startActivityForResult(intent, Main.NEWTASK); return true; case R.id.main_menu_settings: startActivity(new Intent(Main.this, Settings.class)); return true; case R.id.main_menu_exit: finish(); return true; default: return false; } } }); popup.show(); return true; case R.id.main_actionbar_search: return true; case R.id.main_menu_newtask: // Se crea un Intent y un Bundle con la informacion a enviar al nuevo Activity: Intent intent = new Intent(context, NewTask.class); Bundle bundle = new Bundle(); bundle.putBoolean("isNewTask", true); bundle.putInt("positionSlider", mViewPager.getCurrentItem()); intent.putExtra("dataActivity", bundle); startActivityForResult(intent, Main.NEWTASK); return true; case R.id.main_menu_settings: startActivity(new Intent(Main.this, Settings.class)); return true; case R.id.main_menu_exit: finish(); return true; default: return false; } } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary * sections of the app. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } /** * */ @Override public Fragment getItem(int i) { Fragment fragment = new DummySectionFragment(); Bundle args = new Bundle(); args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1); fragment.setArguments(args); return fragment; } /** * Devuelve el numero de elementos/menus del slider. */ @Override public int getCount() { return tagArrayList.size(); } /** * Devuelve el nombre del elemento del slider segun la posicion correspondiente. */ @Override public CharSequence getPageTitle(int position) { if (tagArrayList.size() > 0) return tagArrayList.get(position).getName(); else return null; } } /** * A dummy fragment representing a section of the app, but that simply displays dummy text. */ public static class DummySectionFragment extends Fragment { public DummySectionFragment() { } public static final String ARG_SECTION_NUMBER = "section_number"; /** * Devuelve el View que contiene la informacion de la pagina del slider que se esta viendo. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { taskArrayList = taskHelper .getArrayTasks(tagArrayList.get(getArguments().getInt(ARG_SECTION_NUMBER) - 1).getID()); listTask = new ListView(context); listTask.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) { // Se recupera la tarea que ha lanzado el evento. Tambien su taskArrayListAdapter: final Task task = (Task) parent.getItemAtPosition(position); // Se instancia un menu PopupMenu para mostrar las opciones del Item: PopupMenu popup = new PopupMenu(parent.getContext(), view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.main_task_item_menu, popup.getMenu()); // Se crea el listener del popupMenu para tratar los eventos de cada subitem: popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { // Se trata los eventos de los Items de edicion y eliminacion de tareas: switch (item.getItemId()) { case R.id.main_task_item_menu_edit: // Se prepara un Intent con toda la informacion necesaria para el Activity de Editar tarea: Intent intent = new Intent(context, NewTask.class); // Se preparan los parametros a pasar dentro de un Bundle: Bundle bundle = new Bundle(); bundle.putBoolean("isNewTask", false); bundle.putInt("positionSlider", mViewPager.getCurrentItem()); bundle.putInt("id", task.getID()); bundle.putInt("idTag", task.getIDTag()); bundle.putString("title", task.getTitle()); bundle.putString("description", task.getDescription()); // Y por ultimo se adjunta el Bundle con los parametros al Intent y se envia al nuevo Activity: intent.putExtra("dataActivity", bundle); context.startActivityForResult(intent, Main.NEWTASK); return true; case R.id.main_task_item_menu_delete: // Se crea un AlertDialog de advertencia para la eliminacion de la tarea: AlertDialog.Builder alert = new AlertDialog.Builder(context); alert.setTitle(getString(R.string.main_task_item_menu_delete_alert_title)); // Se crea el listener para tratar los eventos de los botones del AlertDialog: alert.setNegativeButton(android.R.string.cancel, null); alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Se elimina la tarea de la base de datos: taskHelper.deleteTask(task); // Se elimina la etiqueta y se refresca la pantalla: taskArrayList.remove(position); taskArrayListAdapter.notifyDataSetChanged(); } }); alert.show(); return true; default: return false; } } }); // Se muestra el Men por pantalla: popup.show(); } }); taskArrayListAdapter = new TaskArrayListAdapter(context, taskArrayList); listTask.setAdapter(taskArrayListAdapter); return listTask; } } /** * @param searchItem */ private void setupSearchView(MenuItem searchItem) { searchItem.setShowAsActionFlags( MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); mSearchView.setOnQueryTextListener(this); } /** * Este metodo permite obtener el texto del campo de busqueda en tiempo real (caracter a caracter) */ public boolean onQueryTextChange(String newText) { return false; } /** * Obtiene el texto del cuadro de busqueda al pulsar ENVIAR * y lo envia al activity que muestra el resultado por pantalla: */ public boolean onQueryTextSubmit(String query) { if (query.length() > 0) { Intent intent = new Intent(context, SearchResults.class); Bundle bundle = new Bundle(); bundle.putString("query", query); intent.putExtra("dataSearch", bundle); startActivity(intent); return true; } return false; } }