BaseActivity para la navegación

Estoy construyendo una actividad básica para la navegación y deseo algo flexible así que la actividad dicta a la actividad baja qué disposición a inflar.

Tengo lo siguiente

public abstract class BaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private int mLayoutRes; protected void setLayout(int layoutRes) { mLayoutRes = layoutRes; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(mLayoutRes); // Layout implements toolbar Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null){ setSupportActionBar(toolbar); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // The layout implements the nav if (drawer != null){ ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } } // Other Nav code ommitted as its too verbose } 

A continuación, el diseño se pasa de la actividad como continuación

 public class Home extends BaseActivity { private final String TAG = "Home"; @Override protected void onCreate(Bundle savedInstanceState) { super.setLayout(R.layout.activity_home); super.onCreate(savedInstanceState); // Other Activity code } } 

¿Hay una mejor manera de lograr esto? Tal vez la configuración de un diseño de base con un marco de contenido e inflar en eso?

Cualquier sugerencia sera apreciada.

Puede seguir BaseActivity desde la aplicación Google IO. Simplemente anula setContentView y no necesita setLayout

Aquí está mi BaseActivity

 package com.vtcmobile.kqviet.activity; public class BaseActivity extends AppCompatActivity { private Toolbar toolbar; private DrawerLayout drawerLayout; private ActionBarDrawerToggle drawerToggle; private NavigationView navigationView; protected Context mContext; public NavigationView getNavigationView() { return navigationView; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = BaseActivity.this; } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); initToolbar(); } private void initToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } private void setUpNav() { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); drawerToggle = new ActionBarDrawerToggle(BaseActivity.this, drawerLayout, R.string.app_name, R.string.app_name); drawerLayout.setDrawerListener(drawerToggle); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); navigationView = (NavigationView) findViewById(R.id.navigation); // Setting Navigation View Item Selected Listener to handle the item // click of the navigation menu navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { public boolean onNavigationItemSelected(MenuItem menuItem) { // Checking if the item is in checked state or not, if not make // it in checked state if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); // Closing drawer on item click drawerLayout.closeDrawers(); // Check to see which item was being clicked and perform // appropriate action Intent intent; switch (menuItem.getItemId()) { case R.id.xxxx: return true; } return false; } }); // Setting the actionbarToggle to drawer layout // calling sync state is necessay or else your hamburger icon wont show // up drawerToggle.syncState(); } @Override public void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); setUpNav(); drawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); drawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) return true; // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

Puede consultar mi siguiente código, preste atención a addContentView en mi actividad base (aquí lo llamo NavigationDrawerActivity )

Actividad básica:

 public class NavigationDrawerActivity extends AppCompatActivity { private DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); mDrawerLayout.setDrawerListener(toggle); toggle.syncState(); } /** * called in extending activities instead of setContentView... * * @param layoutId The content Layout Id of extending activities */ public void addContentView(int layoutId) { LayoutInflater inflater = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View contentView = inflater.inflate(layoutId, null, false); mDrawerLayout.addView(contentView, 0); } } 

Luego en otras actividades, por ejemplo, MainActivity:

 public class MainActivity extends NavigationDrawerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.addContentView(R.layout.activity_main); } } 

¡Espero que esto ayude!

Realizo algunos cambios en la clase BaseActivity utilizando el método de inflado de la baseactividad y la reutilización, puedes usar la siguiente clase para extenderla solo a cualquiera de tu clase de actividad.

 import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.widget.FrameLayout; public class BaseActivity extends AppCompatActivity { public Toolbar toolbar; public DrawerLayout drawerLayout; public ActionBarDrawerToggle drawerToggle; public NavigationView navigationView; public Context mContext; public NavigationView getNavigationView() { return navigationView; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = BaseActivity.this; setContentView(R.layout.base_activity); } @Override public void setContentView(int layoutResID) { DrawerLayout fullView = (DrawerLayout)getLayoutInflater().inflate(R.layout.base_activity, null); FrameLayout activityContainer = (FrameLayout) fullView.findViewById(R.id.activity_content); getLayoutInflater().inflate(layoutResID, activityContainer, true); super.setContentView(fullView); initToolbar(); } private void initToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } private void setUpNav() { drawerLayout = (DrawerLayout) findViewById(R.id.activity_container); drawerToggle = new ActionBarDrawerToggle(BaseActivity.this, drawerLayout, R.string.app_name, R.string.app_name); drawerLayout.setDrawerListener(drawerToggle); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); navigationView = (NavigationView) findViewById(R.id.navigation); // Setting Navigation View Item Selected Listener to handle the item // click of the navigation menu navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { public boolean onNavigationItemSelected(MenuItem menuItem) { // Checking if the item is in checked state or not, if not make // it in checked state if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); // Closing drawer on item click drawerLayout.closeDrawers(); // Check to see which item was being clicked and perform // appropriate action Intent intent; switch (menuItem.getItemId()) { case R.id.xxxx: return true; } return false; } }); // Setting the actionbarToggle to drawer layout // calling sync state is necessay or else your hamburger icon wont show // up drawerToggle.syncState(); } @Override public void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); setUpNav(); drawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); drawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) return true; // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

Esta es mi base_activity.xml,

 <android.support.v4.widget.DrawerLayout android:id="@+id/activity_container" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?actionBarSize" /> <FrameLayout android:id="@+id/activity_content" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" /> </android.support.v4.widget.DrawerLayout> 

setContentView anular setContentView en su BaseActivity e inicializar todo después de la super llamada o mover todas las cosas relacionadas con DrawerLayout a un método protected y llamar desde cada hijos de BaseActivity , después de llamar a setContentView . Creo que el primero debe ser sencillo, a partir de lo que publicó, se puede evitar para anular onCreate en el BaseActivity

  Common Navigation DraweFor All Activity ## BaseActivity.java ## public class BaseActivity extends FragmentActivity { final String[] navDrawMenuItems = {"My Project" , "My Project1", "MyProject2", "MyProject3" ,"MyProject4","MyProject5","MyProject6"}; final int[] navDrawMenuIcons = {R.drawable.vendor, R.drawable.vendor, R.drawable.vendor, R.drawable.vendor, R.drawable.log_icon, R.drawable.vendor, }; public RelativeLayout mRelativeLayout; public FrameLayout actContent; public ListView navList; LinearLayout drawer_List; TextView text_emp_name; public MenuDrawerAdapter menuDrawerAdapter; public ArrayList<Vendor_Wrapper> menuDrawerList = new ArrayList<>(); public DrawerArrowDrawable drawerArrowDrawable; public ImageView drawer_indicator; public DrawerLayout drawer_layout; public float offset; public boolean flipped; SharedPreferences _SP; SharedPreferences.Editor _EDITOR; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for (int i = 0; i < navDrawMenuItems.length; i++) { menuDrawerList.add(new Vendor_Wrapper(""+i,navDrawMenuItems[i], navDrawMenuIcons[0])); } } @Override public void setContentView(int layoutResID) { mRelativeLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_base, null); actContent = (FrameLayout) mRelativeLayout.findViewById(R.id.main); // set the drawer dialog_view as main content view of Activity. setContentView(mRelativeLayout); // add dialog_view of BaseActivities inside framelayout.ie frame_container getLayoutInflater().inflate(layoutResID, actContent, true); drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout); // ========================================= final Resources resources = getResources(); drawerArrowDrawable = new DrawerArrowDrawable(resources); drawer_indicator = (ImageView) findViewById(R.id.drawer_indicator); drawerArrowDrawable.setStrokeColor(resources.getColor(android.R.color.white)); drawer_indicator.setImageDrawable(drawerArrowDrawable); // ========================================= text_emp_name=(TextView)findViewById(R.id.text_emp_name) ; _SP = getSharedPreferences(Constants.pref_name, MODE_PRIVATE); text_emp_name.setText(_SP.getString("empName","")); drawer_List=(LinearLayout)findViewById(R.id.drawer_List); navList = (ListView) findViewById(R.id.drawer_List1); menuDrawerAdapter = new MenuDrawerAdapter(BaseActivity.this, menuDrawerList); navList.setAdapter(menuDrawerAdapter); navList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { Intent intent; // Toast.makeText(getApplicationContext(),"position "+position,30).show(); Log.i(Constants.TAG,"drawer_position: "+position); switch (position) { case 0: intent = new Intent(BaseActivity.this, List_of_projects.class); startActivityForResult(intent,Constants.EXIT); // break; case 1: intent = new Intent(BaseActivity.this, List_of_projects.class); startActivityForResult(intent,Constants.EXIT); // drawer_indicator.performClick(); break; case 2: intent = new Intent(BaseActivity.this, List_of_projects.class); startActivityForResult(intent,Constants.EXIT); // drawer_indicator.performClick(); break; case 3: intent = new Intent(BaseActivity.this, List_of_projects.class); startActivityForResult(intent,Constants.EXIT); // drawer_indicator.performClick(); break; case 4: intent = new Intent(BaseActivity.this, List_of_projects.class); intent.putExtra("Type","Complaints"); startActivityForResult(intent,Constants.EXIT); // drawer_indicator.performClick(); break; case 5: intent = new Intent(BaseActivity.this, List_of_projects.class); intent.putExtra("Type","Suggestions"); startActivityForResult(intent,Constants.EXIT); break; case 6: intent = new Intent(BaseActivity.this, List_of_projects.class); startActivityForResult(intent,Constants.EXIT); break; case 7: System.out.println("Logout clickedddddd "); SharedPreferences.Editor editor = getSharedPreferences("my_pref", MODE_PRIVATE).edit(); editor.clear(); editor.commit(); setResult(Constants.EXIT); finish(); break; default: break; } } }); initViewsandSharedPreferencesandSQLiteAdapter(); clickToViews(); } public void setMenuDrawer(ArrayList<Vendor_Wrapper> menuDrawerList, String email) { navList = (ListView) findViewById(R.id.drawer_List1); menuDrawerAdapter = new MenuDrawerAdapter(BaseActivity.this, menuDrawerList); navList.setAdapter(menuDrawerAdapter); } public void initViewsandSharedPreferencesandSQLiteAdapter() { _SP = getSharedPreferences(Constants.TAG, MODE_PRIVATE); _EDITOR = _SP.edit(); drawer_indicator_LL = (LinearLayout) findViewById(R.id.drawer_indicator_LL); } /** * Take care of popping the fragment back stack or finishing the activity * as appropriate. */ @Override public void onBackPressed() { super.onBackPressed(); if (drawer_layout.isDrawerVisible(Gravity.RIGHT)) { drawer_layout.closeDrawer(drawer_List); } else { finish(); } } public void clickToViews() { drawer_layout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { offset = slideOffset; // Sometimes slideOffset ends up so close to but not quite 1 or 0. if (slideOffset >= .995) { flipped = true; drawerArrowDrawable.setFlip(flipped); } else if (slideOffset <= .005) { flipped = false; drawerArrowDrawable.setFlip(flipped); } drawerArrowDrawable.setParameter(offset); } }); drawer_indicator.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (drawer_layout.isDrawerVisible(Gravity.RIGHT)) { drawer_layout.closeDrawer(drawer_List); } else { drawer_layout.openDrawer(drawer_List); } } }); drawer_indicator_LL.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (drawer_layout.isDrawerVisible(Gravity.RIGHT)) { drawer_layout.closeDrawer(drawer_List); } else { drawer_layout.openDrawer(drawer_List); } } }); } public void NavigationPerformClick() { drawer_indicator.performClick(); } private class MenuDrawerAdapter extends BaseAdapter { ArrayList<Vendor_Wrapper> menuDrawerList; Context context; public MenuDrawerAdapter(Context context, ArrayList<Vendor_Wrapper> menuDrawerList) { super(); this.context = context; this.menuDrawerList = menuDrawerList; } @Override public int getCount() { return menuDrawerList.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater layoutInflater = LayoutInflater.from(BaseActivity.this); ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.row_menu_drawer, null); viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title); viewHolder.imgIcon = (ImageView) convertView.findViewById(R.id.img_icon); viewHolder.main_RL = (RelativeLayout)convertView.findViewById(R.id.main_RL); viewHolder.imgIcon.setVisibility(View.GONE); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Vendor_Wrapper menuDrawerModel = menuDrawerList.get(position); //## Setup Data below String Name = menuDrawerModel.getName(); String id = menuDrawerModel.getId(); viewHolder.tvTitle.setText(menuDrawerModel.getName()); // viewHolder.main_RL.setOnClickListener(new ClickToView(BaseActivity.this,position,id,Name)); viewHolder.imgIcon.setImageResource(menuDrawerModel.getDrawable_icon()); return convertView; } public class ViewHolder { TextView tvTitle; ImageView imgIcon; RelativeLayout main_RL; } } protected class MenuDrawerModel { private String title; private int icon; public String Icon_url; public MenuDrawerModel(String title, int icon, String icon_url) { this.title = title; this.icon = icon; Icon_url = icon_url; } public MenuDrawerModel(String title, int icon) { super(); this.title = title; this.icon = icon; } public MenuDrawerModel() { super(); } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); System.out.println("Logout onActivityResult "+resultCode); if(resultCode==Constants.EXIT) { setResult(Constants.EXIT); finish(); } } } ## MainActivity.java ## public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } ## activity_base.xml ## <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:custom="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:background="@color/white"> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <include android:id="@+id/header_view" layout="@layout/layout_header_view" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/header_view"> </FrameLayout> </RelativeLayout> <LinearLayout android:id="@+id/drawer_List" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="start" android:layout_marginTop="50dp" android:background="@color/white" android:choiceMode="singleChoice" android:orientation="vertical" android:weightSum="10"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" android:background="@drawable/bagroundg" android:orientation="vertical" android:visibility="gone" android:weightSum="5"> </LinearLayout> <ListView android:id="@+id/drawer_List1" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white" android:choiceMode="singleChoice" /> </LinearLayout> </android.support.v4.widget.DrawerLayout> </RelativeLayout> ## activity_main.xml ## <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="Hello World!" android:textSize="30dp" /> </LinearLayout> </RelativeLayout> public class Vendor_Wrapper { private String id; public Vendor_Wrapper(String id, String name, int drawable_icon) { this.id = id; Name = name; this.drawable_icon = drawable_icon; } private String Name; private String contact_no; private String Email_id; private String Address; private String img; private String PAY_MODE; private String min; private String max; private String imgs; private int drawable_icon; public int getDrawable_icon() { return drawable_icon; } public void setDrawable_icon(int drawable_icon) { this.drawable_icon = drawable_icon; } public String getEmail_id() { return Email_id; } public void setEmail_id(String email_id) { Email_id = email_id; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } public String getContact_no() { return contact_no; } public void setContact_no(String contact_no) { this.contact_no = contact_no; } public String getAddress() { return Address; } public void setAddress(String address) { Address = address; } public String getImg() { return img; } public void setImg(String img) { this.img = img; } public String getPAY_MODE() { return PAY_MODE; } public void setPAY_MODE(String PAY_MODE) { this.PAY_MODE = PAY_MODE; } public String getMin() { return min; } public void setMin(String min) { this.min = min; } public String getMax() { return max; } public void setMax(String max) { this.max = max; } public String getImgs() { return imgs; } public void setImgs(String imgs) { this.imgs = imgs; } public Vendor_Wrapper(String id, String name, String contact_no, String email_id, String address, String img, String PAY_MODE, String min, String max, String imgs) { this.id = id; Name = name; this.contact_no = contact_no; Email_id = email_id; Address = address; this.img = img; this.PAY_MODE = PAY_MODE; this.min = min; this.max = max; this.imgs = imgs; } } 
  • Cajón de navegación de Android
  • Encabezado de grupo de navegación - cómo configurarlo?
  • Cómo mostrar / ocultar el cajón de navegación mediante programación
  • Toque en cualquier lugar para deslizar el menú abierto para el cajón de navegación
  • ActionBarDrawerToggle no está configurando el Indicador de cajón
  • Cajón arrastrable con un asa (en lugar de barra de acción) encima de otras aplicaciones
  • El gaviota de navegación de Android no pasa onTouchEvent a la actividad
  • Adición de un diseño lineal al cajón de navegación (termina chocando con un ClassCastException)
  • Cambiar el icono del cajón de nuevo a la flecha de retroceso
  • Android: NavigationDrawer / múltiples actividades / mismo menú
  • Cajón de navegación Android Studio 1.4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.