entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

[Android] Menu deslizante usando Activities en vez de Fragments

Estoy intentando usar el NavigationDrawer, pero en lugar de usar Fragments usando Activities. Es decir, quiero tener un menu deslizante que aparezca en varias activities independientes. Lo he intentado usando 3 Activities:

Index.class

    mTitle = mDrawerTitle = getTitle();

    // load slide menu items
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

    // nav drawer icons from resources
    navMenuIcons = getResources()
            .obtainTypedArray(R.array.nav_drawer_icons);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

    navDrawerItems = new ArrayList<NavDrawerItem>();
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));

    navMenuIcons.recycle();

    adapter = new NavDrawerListAdapter(getApplicationContext(),
            navDrawerItems);
    mDrawerList.setAdapter(adapter);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, 
            R.string.app_name, 
            R.string.app_name 
    ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);

            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);

            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {

        displayView(0);
    }
}

/**
 * Slide menu item click listener
 * */
public class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar actions click
    switch (item.getItemId()) {
    case R.id.action_settings:
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

/***
 * Called when invalidateOptionsMenu() is triggered
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}

private void displayView(int position) {
    switch (position) {
    case 0:
        Intent case0 = new Intent(this, Home.class); 
        startActivity(case0);
        break;
    case 1:
        Intent case1 = new Intent(this, FindPeople.class); 
        startActivity(case1);
        break;
    case 2:
        Intent case2 = new Intent(this, Photos.class); 
        startActivity(case2);
        break;
    case 3:
        Intent case3 = new Intent(this, Community.class); 
        startActivity(case3);
        break;
    case 4:
        Intent case4 = new Intent(this, Pages.class); 
        startActivity(case4);
        break;
    case 5:
        Intent case5 = new Intent(this, WhatsHot.class); 
        startActivity(case5);
        break;

    default:
        break;
    }

}
    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

NavDrawerList.class

private Context context;
private ArrayList<NavDrawerItem> navDrawerItems;

public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
    this.context = context;
    this.navDrawerItems = navDrawerItems;
}

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

@Override
public Object getItem(int position) {       
    return navDrawerItems.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.drawer_list_item, null);
    }

    ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
    TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
    TextView txtCount = (TextView) convertView.findViewById(R.id.counter);

    imgIcon.setImageResource(navDrawerItems.get(position).getIcon());        
    txtTitle.setText(navDrawerItems.get(position).getTitle());

    // displaying count
    // check whether it set visible or not
    if(navDrawerItems.get(position).getCounterVisibility()){
        txtCount.setText(navDrawerItems.get(position).getCount());
    }else{
        // hide the counter view
        txtCount.setVisibility(View.GONE);
    }

    return convertView;
}

NavDrawerItem.class

Cuando usaba este mismo código con los Fragments todo iba de maravilla hasta que modifiqué el código para que iniciara las actividades. Pero al hacer esto la app mostraba una screen en negro.
Leí que se podía crear una activity que ejecutara el NavigationDrawer mostrando así el menú, en las demás actividades se implementa la actividad Index y debería de mostrar el menú sin problema.

Espero que podáis ayudarme.

0voto

egoitz_gonzalez comentado

Hola.

Y en el log te lanza algún error? cual?

saludos.

0voto

Rubbasoft comentado

Buenas,
eso es lo más asombroso, el log no muestra errores. Al parecer la aplicación entra en un bucle y recargar de manera indefinida Index.class.

3 Respuestas

2votos

Villanuevand Puntos5730

Yo te recomendaría usar los Fragments, si no estás muy empapado de qué son estos puedes visitar este enlace que de verdad está muy bueno. Indice Android - SekthDroid.
Con respecto al comentario que hace "novus-ordo-seclorum" es bastante acertado debes estár pendiente de la compatibilidad con apis menores al nivel 11 versión 3.
Usa la librería de support.v4 que puedes descargar en el android SDK.
Para que estes más claro de cómo se hace esto, te recomiendo seguir este enlace.

Espero te sirva esta información.

2votos

egoitz_gonzalez Puntos10050

Hola.

Estoy mirando mis proyecto y una diferencia que veo es en el index.class, la siguiente linea:

// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

Yo la tengo mediante el context:

this.menuListaOpciones = context.getResources().getStringArray(R.array.menuListaOpcArray);

0voto

Rubbasoft comentado

He probado con eso, pero nada.. El logCat muestra que la app intenta abrir la actividad pero no lo consigue.. Se queda en un bucle como he dicho anteriormente.

0voto

egoitz_gonzalez comentado

Yo el constructor index.class lo tengo de la siguiente manera:

public ActionBarImplementation (Context context, final Activity actividad, final int Idtitulo, int position) {
this.position = position;
this.context = context;
this.activity = actividad; //Es necesaria, ya que nos dice en que activity se carga el menu.

//Cargamos un array que esta en values/string dentro del adaptador del listview drawer
this.menuListaOpciones = context.getResources().getStringArray(R.array.menuListaOpcArray);

2votos

Y como para que necesitas que se abran Activities en lugar de Fragments, acabo de hacer una aplicación usando el NavigationDrawer usando fragments y todo va de maravilla..

otra cosa que necesitas checar es que tu aplicacion sea compatible con las versiones 2.x por que creo que tu codigo solo corre a partir de la 3.x, no estoy seguro, pero checalo.

0voto

Villanuevand comentado

Pero puede hacerse compatible con las versiones 2.x usando la libreria de compatibilidad.

0voto

Novus Ordo Seclorum comentado

claro que es posible, yo nunca dije que no.. de echo yo la uso en mi aplicación, solo hay que cambiar unas cuantas cosas.

0voto

Villanuevand comentado

Si, solo unas cuantas cositas y listo! Un detallazo que tiene la librería de soporte es que no trae la capacidad de compatiblidad de PreferenceFragment. A título personal creo que debería implementarse, para poder usarla en apps 2.x.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta