Autore Topic: Problema "grafico" con elementi navigation drawer  (Letto 412 volte)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Problema "grafico" con elementi navigation drawer
« il: 22 Ottobre 2015, 16:28:33 CEST »
0
Ho un problemino che sembra semplice ma che non riesco a risolvere con il navigation drawer; le icone assegnate alle voci "slittano" di una posizione lasciando il primo elemento senza nulla e l'ultima icona inutilizzata.

Non uso nessuna libreria per il navigation drawer; eccovi i layout:

Principale (come vedete una semplice listview):
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:background="#33b5e5">
    <LinearLayout
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <include
            android:id="@+id/tool_bar"
            layout="@layout/tool_bar" />

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    </LinearLayout>

        <ListView
            android:id="@+id/drawer_list"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#FFF"
            android:choiceMode="singleChoice"
            android:dividerHeight="1dp" />

</android.support.v4.widget.DrawerLayout>

il drawer header:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/drawer_header"
        android:background="#33b5e5"
    android:gravity="center_horizontal">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:contentDescription="@string/content_icon" />

    <TextView
            android:id="@+id/nome"
            android:text=""
            android:padding="15dp"
            android:textSize="12sp"
            android:layout_marginTop="15dp"
            android:layout_width="match_parent"
            android:gravity="center"
            android:textColor="#fff"
            android:layout_height="wrap_content"/>
    <TextView
            android:id="@+id/datan"
            android:text=""
            android:padding="15dp"
            android:textSize="12sp"
            android:layout_width="match_parent"
            android:gravity="center"
            android:textColor="#fff"
            android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/sex"
        android:text=""
        android:padding="15dp"
        android:textSize="12sp"
        android:layout_width="match_parent"
        android:gravity="center"
        android:textColor="#fff"
        android:layout_height="wrap_content"/>

</LinearLayout>

Gli elementi della lista:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/item_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="start" >
    </ImageView>

    <TextView
        android:id="@+id/item_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/item_icon"
        android:layout_toEndOf="@+id/item_icon"
        android:textColor="@android:color/darker_gray"
        android:gravity="start" >
    </TextView>
</RelativeLayout>

Ora un po' di codice, main activity (giusto la parte interessata):
Codice: [Seleziona]
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (horizontal) { setContentView(R.layout.activity_main_h); }
        else { setContentView(R.layout.activity_main); }
        fragMan = getSupportFragmentManager();
        String titolo = getString(R.string.appname);
        toolbar = (Toolbar)findViewById(R.id.tool_bar);
        toolbar.setTitle(titolo);
        setSupportActionBar(toolbar);
        String[] items = getResources().getStringArray(R.array.menu_drawer);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.drawer_list);
        mDrawerList.addHeaderView((View) getLayoutInflater().inflate(R.layout.drawer_header, null));
        Drawer_List_Adapter adapter = new Drawer_List_Adapter(this,R.layout.drawer_base_item,items);
        mDrawerList.setAdapter(adapter);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
            public void onDrawerClosed(View drawerView) {
                super.onDrawerOpened(drawerView);
            }
            public void onDrawerOpened(View drawerView) {
                super.onDrawerClosed(drawerView);
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerToggle.syncState();
        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
                mDrawerLayout.closeDrawer(mDrawerList);
            }
        });
        selectItem(1);
        CheckConfigData();
    }

L'adapter:
Codice: [Seleziona]
public class Drawer_List_Adapter  extends ArrayAdapter<String> {
    private final Context cont;
    private final int ViewResourceId;
    private final String[] VociMenu;

    public Drawer_List_Adapter (Context context, int parViewResourceId, String[] voci) {
        super(context, parViewResourceId, voci);
        cont = context;
        ViewResourceId = parViewResourceId;
        VociMenu = voci;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) cont.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(ViewResourceId, null);
        TextView voce = (TextView) convertView.findViewById(R.id.item_text);
        voce.setText(VociMenu[position]);
        ImageView icona = (ImageView) convertView.findViewById(R.id.item_icon);
        switch (position) {
                case 1://in vasca/allenamenti
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_casetta));
                    break;
                case 2://eventi/acque libere
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_posizione));
                    break;
                case 3://cronologia
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_crono));
                    break;
                case 4: //calendario
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_calendar));
                    break;
                case 5://tests
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_tests));
                    break;
                case 6://grafici
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_graphs));
                    break;
                case 7://utilita'
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_utils));
                    break;
                case 8://info
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_info));
                    break;
                case 9://stili
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_stile));
                    break;
                case 10://aggiungi
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_aggiungi));
                    break;
                case 11://setup
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_setup));
                    break;
                case 12://esci
                    icona.setImageDrawable(ContextCompat.getDrawable(cont, R.drawable.ic_uscita));
                    break;
        }
        return convertView;
    }
}

Nel caso non mi fossi spiegato correttamente, allego lo screenshot del drawer, come vedete l'icona della casetta dovrebbe corrispondere alla voce allenamenti.

Se la mia risposta ti è utile, per favore un thanks!

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:Problema "grafico" con elementi navigation drawer
« Risposta #1 il: 23 Ottobre 2015, 09:56:01 CEST »
0
Ciao,

occhio che position parte da zero non da uno:

Codice (Java): [Seleziona]
switch (position) {
                case 1://in vasca/allenamenti

deve essere:

Codice (Java): [Seleziona]
switch (position) {
                case 0://in vasca/allenamenti

ciao :)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Problema "grafico" con elementi navigation drawer
« Risposta #2 il: 23 Ottobre 2015, 13:18:01 CEST »
0
Avrei dovuto accorgermi della cosa già dal fatto che la voce testuale era giusta:
Codice: [Seleziona]
voce.setText(VociMenu[position]);Però restavo convintissimo che dovesse iniziare da 1 lo switch (si lo so che position inizia da 0), nel listener onItemclick la prima voce è in posizione 1 essendo la 0 occupata dall'headerview!
grazie mille.

Edit:
ho riletto e avevo sbagliato il senso della frase!
« Ultima modifica: 24 Ottobre 2015, 00:18:54 CEST da LonelyWolf »
Se la mia risposta ti è utile, per favore un thanks!