Et kontekstaktiveret gittervisning til Android

En af de ting, jeg sætter mest pris på ved at arbejde på en open source-platform som Android, er al den communitystøtte, der er tilgængelig for udviklere. Google har sin officielle Android-dokumentation, men hvis denne ressource ikke er forventet, kan jeg normalt skrive, hvad problemet er i min foretrukne søgemaskine og voila, har jeg flere svar, end jeg kan ryste en pind på. Der er selvfølgelig undtagelser.

Sidste uge stødte jeg på en af ​​disse undtagelser, mens jeg arbejdede på et projekt, der krævede, at jeg brugte en kontekstmenu inden for et rutenavn. (Kontekstmenuen er den menu, som Android lejlighedsvis dukker op, når du trykker på og holder fingeren på et emne.) Der var masser af eksempler på gittervisninger og masser af eksempler på kontekstmenuen, men at gifte sig med de to havde nogle unikke aspekter, og Jeg kunne ikke finde en pålidelig tutorial, der demonstrerer den kraftfulde kombination.

Som en hund med en knogle, når jeg først har fået tænderne i noget, vil jeg sandsynligvis ikke lade det gå. Og jeg ville ikke være meget ingeniør, hvis jeg til sidst ikke lykkedes at få min gittervisning og kontekstmenu til at spille pæn. Nu i ånden om deling, der er så udbredt blandt Android-udviklere, præsenterer jeg for dig min kontekstbevidste netvisning. Føl dig fri med at følge trinvis vejledning, eller download hele Eclipse-projektet her.

1. Start et nyt projekt i Eclipse, der er målrettet mod SDK 1.6 eller nyere.

2. Opret et simpelt layout bestående af en tekst og en gittervisning i mappen / res / layout.

 main.xml 
 "1.0" encoding = "utf-8" ?> 
 "Http://schemas.android.com/apk/res/android" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: orientering = "lodret" > 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: text = "Grid Demo" /> 
 android: id = "@ + id / gridview" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: polstring = "5dp" 
 android: verticalSpacing = "5dp" 
 android: horizontalSpacing = "10dp" 
 android: numColumns = "auto_fit" 
 android: columnWidth = "60dp" 
 android: stretchMode = "columnWidth" 
 android: gravitation = "center_horizontal" /> 

3. I mappen / res / layout bliver vi også nødt til at oprette layoutet til vores elementer i gittervisning - denne gang en tekstvisning og en billedvisning.

 grid_item.xml 
 "Http://schemas.android.com/apk/res/android" 
 android: id = "@ + id / GridItem" 
 android: layout_width = "fill_parent" 
 android: layout_height = "wrap_content" 
 android: orientering = "lodret" 
 android: gravity = "center_horizontal" > 
 "@ + Id / grid_item_text" 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: gravitation = "center_horizontal" /> 
 "@ + Id / grid_item_image" 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" /> 

4. I mappen / res / drawable har jeg inkluderet en serie billeder. Billederne er enkle PNG'er, der repræsenterer tallene 0 til 9, navngivet smart zero.png, one.png osv.

5. I vores / src-mappe vil vi starte med at definere en brugerdefineret adapter til netvisningen. Med undtagelse af sagsangivelsen, der er ansvarlig for at vælge, hvilken grafik der skal vises, tror jeg, du finder ud af, at jeg lige implementerer standardversioner af de krævede metoder, man skal tilsidesætte for at stamme fra baseadapterklassen.

 CustomAdapter.java 
 pakke com.authorwjf; 
 import java.util.ArrayList; 
 import android.content.Context; 
 import android.view.LayoutInflater; 
 import android.view.View; 
 import android.view.ViewGroup; 
 import android.widget.BaseAdapter; 
 import android.widget.ImageView; 
 import android.widget.TextView; 
 Custom Class CustomAdapter udvider BaseAdapter { 
 privat kontekst mContext; 
 private ArrayList-emner; 
 public CustomAdapter (Kontekst c, ArrayList-emner) { 
 mContext = c; 
 mItems = varer; 
 } 
 @Override 
 public int getCount () { 
 return mItems.size (); 
 } 
 @Override 
 public Object getItem ( int position) { 
 return mItems.get (position); 
 } 
 @Override 
 offentlig lang getItemId ( int position) { 
 returposition ; 
 } 
 @Override 
 public View getView ( int position, View convertView, ViewGroup parent) { 
 Se v = convertView; 
 if (v == null ) { 
 LayoutInflater li = (LayoutInflater) mContext.getSystemService (kontekst. LAYOUT_INFLATER_SERVICE ); 
 v = li.inflate (R.layout. grid_item, null ); 
 TextView tv = (TextView) v.findViewById (R.id. Grid_item_text ); 
 tv.setText ("Vare #" + mItems.get (position)); 
 ImageView iv = (ImageView) v.findViewById (R.id. Grid_item_image ); 
 switch (position) { 
 sag 0: 
 iv.setImageResource (R. udtrækkelig. nul ); 
 pause ; 
 sag 1: 
 iv.setImageResource (R. udtrækkelig. en ); 
 pause ; 
 sag 2: 
 iv.setImageResource (R. udtrækkelig. to ); 
 pause ; 
 sag 3: 
 iv.setImageResource (R. udtrækkelig. tre ); 
 pause ; 
 sag 4: 
 iv.setImageResource (R. udtrækkelig. fire ); 
 pause ; 
 sag 5: 
 iv.setImageResource (R. udtrækkelig. fem ); 
 pause ; 
 sag 6: 
 iv.setImageResource (R. udtrækkelig. seks ); 
 pause ; 
 sag 7: 
 iv.setImageResource (R. udtageligt. syv ); 
 pause ; 
 sag 8: 
 iv.setImageResource (R. udtrækkelig. otte ); 
 pause ; 
 sag 9: 
 iv.setImageResource (R. udtrækkelig. ni ); 
 pause ; 
 } 
 } 
 return v; 
 } 
 } 

6. Main.java-filen er, hvor vi vil registrere og svare på kontekstmenu-relaterede begivenheder. Lad os starte med at oprette et par klassetrin-variabler og tilsidesætte aktiviteten onCreate (). Vær opmærksom på opkaldet registerForContextMenu (); dette opkald registrerer i sagens natur hver visning indeholdt i gittervisning til kontekstmenu detektion. Med andre ord behøver du ikke registrere børnene individuelt, når du udfylder gitteret. Det er et af de emner, der ikke straks blev klart for mig, da jeg læste dokumentationen til netvisningsklassen.

 Main.java 
 pakke com.authorwjf; 
 import android.app.Aktivitet; 
 import android.os.Bundle; 
 import android.view.ContextMenu; 
 import android.view.MenuItem; 
 import android.view.View; 
 import android.view.ContextMenu.ContextMenuInfo; 
 import android.widget.GridView; 
 import android.widget.Toast; 
 import android.widget.AdapterView.AdapterContextMenuInfo; 
 import java.util.ArrayList; 
 public class Main udvider aktivitet { 
 privat tilpasset adapter mAdapter; 
 privat ArrayList mItems = new ArrayList (); 
 @Override 
 offentligt tomrum onCreate (Bundle gemtInstanceState) { 
 super .onCreate (gemtInstanceState); 
 setContentView (R.layout. main ); 
 for ( int i = 0; i <10; i ++) { 
 mItems.add (Integer. toString (i)); 
 } 
 mAdapter = ny CustomAdapter ( dette, mItems); 
 GridView g = (GridView) findViewById (R.id. Gridview); 
 g.setAdapter (mAdapter); 
 registerForContextMenu (g); 
 } 
 } 

7. Dernæst tilføjer vi den funktion, der indeholder kontekstmenuen. Bemærk den første parameter for .add-metoden - dette er gruppeidentifikatoren, og vi vil bruge dette senere til at bestemme, hvilken handling brugeren har anmodet om (dvs. handling en eller handling to).

 Main.java 
 @Override 
 public void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
 super .onCreateContextMenu (menu, v, menuInfo); 
 menu.setHeaderTitle ("Kontekstmenu"); 
 AdapterContextMenuInfo cmi = (AdapterContextMenuInfo) menuInfo; 
 menu.add (1, cmi.position, 0, "Handling 1"); 
 menu.add (2, cmi.position, 0, "Handling 2"); 
 } 

8. Det sidste trin er at skrive menushåndtereren. Ved hjælp af menupunktet, der er videregivet til metoden af ​​rammen, kan vi få ID på det valgte element i netvisningsadapteren. I vores tilfælde er id og position synonyme, så det er en no brainer at få det element, brugeren har valgt. Hvis dine id'er og positioner ikke er de samme, skal du muligvis løbe gennem adapteren med id'et på udkig efter positionen via getItemIdAtPosition-metoden.

 Main.java 
 @Override 
 offentlig boolsk onContextItemSelected (MenuItem item) { 
 GridView g = (GridView) findViewById (R.id. Gridview); 
 Streng s = (streng) g.getItemAtPosition (item.getItemId ()); 
 switch (item.getGroupId ()) { 
 sag 1: 
 Ristet brød. makeText ( dette, "Action 1, Item" + s, Toast. LENGTH_SHORT ) .show (); 
 pause ; 
 sag 2: 
 Ristet brød. makeText ( dette, "Action 2, Item" + s, Toast. LENGTH_SHORT ) .show (); 
 pause ; 
 } 
 vende tilbage sandt ; 
 } 

Det afslutter selvstudiet. At køre det giver dig et gitter, der er befolket med cifrene 0 - 9, og valg af en vil simpelthen præsentere en skålbesked, der fortæller dig, hvilken handling der skal udføres på hvilket emne.

Som du kan se, når det først er lagt ud, er det virkelig ikke så kompliceret at kombinere en ristevisning med en kontekstmenu - det er bare en af ​​disse kodningssituationer, hvor det at komme i gang kan være skræmmende. Mange gange har jeg inkorporeret øvelser og erfaringer fra andre udviklere i mine Android-projekter. Det er dejligt at have mulighed for at give tilbage nu og da.

Figur A

Figur B

Fig

© Copyright 2021 | pepebotifarra.com