Autore Topic: Menù contestuale su GridView: Bug di Android?  (Letto 688 volte)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 774
  • Respect: +161
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Menù contestuale su GridView: Bug di Android?
« il: 12 Febbraio 2012, 01:06:39 CET »
0
Ho notato un comportamento ambiguo nella gestione del menù contestuale in GridView e ListView.

Basandomi sul semplice codice seguente:
Codice (Java): [Seleziona]
public class TestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        GridView myGrid;
       
        myGrid = (GridView) findViewById(R.id.myGridView);
       
        myGrid.setAdapter(new StringAdapter(this));

        registerForContextMenu(myGrid);

        ListView myList;
       
        myList = (ListView) findViewById(R.id.myListView);
       
        myList.setAdapter(new StringAdapter(this));

        registerForContextMenu(myList);
    }
   
   
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
                super.onCreateContextMenu(menu, v, menuInfo);
               
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.ctx_menu, menu);
        }


        public class StringAdapter extends BaseAdapter {
        private Context ctx;

        public StringAdapter(Context c) {
            ctx = c;
        }

        public int getCount() {
            return data.length;
        }

        public Object getItem(int position) {
            return null;
        }

        public long getItemId(int position) {
            return 0;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView;
            if (convertView == null) {
                textView = new TextView(ctx);
                textView.setLayoutParams(new GridView.LayoutParams(120, 40));
                textView.setPadding(8, 8, 8, 8);
            } else {
                textView = (TextView) convertView;
            }

            textView.setText(data[position]);
            return textView;
        }

        private String[] data = {
                "Testo 1",
                "Testo 2"
        };
    }
}

Definizione del layout:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">

    <GridView
       android:id="@+id/myGridView"
       
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       
       android:layout_centerHorizontal="true"
       android:layout_alignParentTop="true"

                android:numColumns="1"
                android:stretchMode="columnWidth"
                android:gravity="center" />

    <ListView
       android:id="@+id/myListView"
       
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       
       android:layout_centerHorizontal="true"
       android:layout_below="@+id/myGridView"
       android:layout_alignParentBottom="true"

                />
</RelativeLayout>

Definizione del menù contestuale
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:id="@+id/mnuTest"
            android:title="Test" />
</menu>

Si nota che mentre nel ListView viene correttamente eseguita l'animazione del background corrispondente al long click prima di aprire il menù contestuale, la corrispondente animazione non avviene nel GridView.

E' un errore nel codice riportato oppure è un problema insito in Android? Esiste qualche tipo di workaround per risolvere questa incongruenza?

Grazie in anticipo.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 774
  • Respect: +161
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Menù contestuale su GridView: Bug di Android?
« Risposta #1 il: 12 Febbraio 2012, 15:31:32 CET »
+2

Cercando nel codice sorgente dei ListView e GridView ho notato che la differenza sta nel selector. Fortunatamente è possibile ridefinire quello di base, e per risolvere l'incongruenza è sufficiente impostare nella griglia lo stesso selector delle liste:

Codice (Java): [Seleziona]
myGrid.setSelector(android.R.drawable.list_selector_background);
Spero torni utile.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.