volver - Agregar iconos al cajón de navegación de Android?
quitar boton de aplicaciones android (4)
Cree una clase de adaptador como ...
public class AdapterClass extends ArrayAdapter<String> {
Context context;
private ArrayList<String> TextValue = new ArrayList<String>();
public AdapterClass(Context context, ArrayList<String> TextValue) {
super(context, R.layout.row_of_drawer, TextValue);
this.context = context;
this.TextValue= TextValue;
}
@Override
public View getView(int position, View coverView, ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.row_of_drawer,
parent, false);
TextView text1 = (TextView)rowView.findViewById(R.id.text1);
text1.setText(TextValue.get(position));
return rowView;
}
}
Y crea algún cambio en tu actividad principal.
utilizar
AdapterClass adClass = new AdapterClass(MainActivity.this, name_of_arrayList);
mDrawerList.setAdapter(adClass);
insinuado de
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
He buscado en la web una respuesta a esta pregunta, pero parece que no puedo encontrarla, incluso en la documentación oficial de Android.
Estoy en el proceso de crear una aplicación que implemente el nuevo diseño de Cajón de navegación de Android. La documentación de este diseño se puede encontrar aquí y aquí .
En la documentación de diseño, así como en una serie de aplicaciones populares como Facebook y Google Currents, los elementos de los cajones tienen íconos delante de ellos.
La documentación de diseño los menciona, en "Contenido del panel de navegación"
Los objetivos de navegación pueden tener iconos principales opcionales y contadores finales. Use los contadores para informar a los usuarios sobre un cambio en el estado de los datos en la vista correspondiente.
Lamentablemente, la documentación del desarrollador no menciona cómo implementar íconos en esta configuración. Describe cómo implementar la lista de elementos de la siguiente manera:
public class MainActivity extends Activity {
private String[] mPlanetTitles;
private ListView mDrawerList;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
// Set the list''s click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
...
}
}
Debido a que su implementación usa getStringArray (), no hay forma de que se me ocurra modificar el xml del elemento de fila para incluir un ícono.
Esto es desconcertante, porque muchas aplicaciones parecen implementar íconos antes de cada elemento de texto, y la documentación de diseño incluso hace referencia a la adición de íconos. Siento que debe haber una simple llamada API para lograr agregar estos iconos, y sin embargo, la única implementación que he encontrado hasta ahora parece ridículamente complicada.
¿Alguien sabe cómo agregar iconos a los elementos del Cajón de navegación? ¿Hay alguna manera de hacer esto con una simple llamada a la API o hacer que todas estas compañías (Facebook, Google, etc.) tuvieran que encontrar formas de solucionar el problema?
Gracias a todos.
Debido a que su implementación usa getStringArray (), no hay forma de que se me ocurra modificar el xml del elemento de fila para incluir un ícono.
La elección de datos de modelo para un ListAdapter
no tiene ningún impacto sobre si las filas creadas por ese ListAdapter
pueden tener iconos.
¿Alguien sabe cómo agregar iconos a los elementos del Cajón de navegación?
Ponga un ImageView
en el diseño de su fila para el ListAdapter
. Complete esa ImageView
través de su ListAdapter
, por ejemplo anulando getView()
en su ArrayAdapter
. IOW, lo haces de la misma manera que lo haces con cualquier otro ListView
, como se ha hecho durante años.
¿Hay alguna manera de hacer esto con una simple llamada API?
Eso depende de tus definiciones de "simple" y "API llamada".
La matriz de cadenas no es el diseño de definición de las filas. Su R.layout.drawer_list_item
representa el diseño de cada fila de la lista. Si desea incluir una imagen (o incluso otro diseño de filas complicado) incluirá la vista de imagen en ese diseño personalizado xml que reemplaza a R.layout.drawer_list_item
xml.
En cuanto a cómo establecer la imagen o el texto en cada fila diferente, todo esto se hace en el método getView()
del adaptador de matriz. Un ejemplo aproximado es el siguiente (suponiendo que hay una vista de texto y una vista de imagen en la fila):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.revise_listview, parent,false);
TextView tv = (TextView)convertView.findViewById(R.id.text);
ImageView iv = (ImageView)convertView.findViewById(R.id.image);
tv1.setText(stringArray.get(i));
if(//condition) {
iv.setImageResource(R.drawable.imagexx);
}
return convertView;
}
Una forma más eficiente de implementar las vistas para cada fila es usar el patrón del marcador de vista. Uno de los muchos lugares donde puedes encontrar ejemplos está aquí .
Para estructurar esto realmente, hice algunas líneas adicionales de código para una implementación orientada a objetos que genera todo desde una matriz de NavigationItem
s - una clase Java simple que contiene campos para texto, icono y fragmento de un elemento de menú:
En MainActivity, mi navegación se define simplemente por la matriz:
NavigationAdapter navigationMenuAdapter;
NavigationItem[] navigationMenuItems = {
new NavigationItem(R.string.menu_home, R.drawable.ic_menu_home, new MainFragment()),
new NavigationItem(R.string.menu_statistics, R.drawable.ic_statistics, new StatisticsFragment()),
new NavigationItem(R.string.menu_settings, R.drawable.ic_settings, new SettingsFragment()),
};
protected void onCreate(Bundle savedInstanceState) {
...
navigationMenuAdapter = new NavigationAdapter(this, navigationMenuItems);
mDrawerList.setAdapter(navigationMenuAdapter);
}
...
private void selectItem(int position) {
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, navigationMenuItems[position].fragment)
.commit();
mDrawerList.setItemChecked(position, true);
setTitle(navigationMenuItems[position].stringTitle);
mDrawerLayout.closeDrawer(mDrawerList);
}
La clase NavigationItem
:
public class NavigationItem
{
/**
*
* @param stringTitle The id of the string resource of the text of the item.
* @param drawableIcon The id of the drawable resource of icon of the item.
* @param fragment The Fragment to be loaded upon selecting the item.
*/
public NavigationItem(int stringTitle, int drawableIcon, Fragment fragment)
{
this.stringTitle = stringTitle;
this.drawableIcon = drawableIcon;
this.fragment = fragment;
}
/**
* The id of the string resource of the text of the item.
*/
public int stringTitle;
/**
* The id of the drawable resource of icon of the item.
*/
public int drawableIcon;
/**
* The Fragment to be loaded upon selecting the item.
*/
public Fragment fragment;
}
Y NavigationAdapter:
public class NavigationAdapter extends BaseAdapter {
private Context context;
private NavigationItem[] navigationItems;
public NavigationAdapter(Context context, NavigationItem[] items) {
this.context = context;
navigationItems = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.list_item_navigation, parent, false);
} else {
row = convertView;
}
TextView tvTitle = (TextView) row.findViewById(R.id.textView);
ImageView ivIcon = (ImageView) row.findViewById(R.id.imageView);
tvTitle.setText(navigationItems[position].stringTitle);
ivIcon.setImageResource(navigationItems[position].drawableIcon);
return row;
}
}
que usa un diseño de xml muy básico, list_item_navigation
, que solo contiene un ImageView
y un TextView
.