Android-koders guide til surfing på ekstern lagring

En av fremtredende mulighetene på Android-plattformen er støtte for ekstern lagring. Muligheten til å lagre data, medier og til og med applikasjoner på et avtakbart SD-kort gjør plattformen mer fleksibel og fremtidssikker enn andre som konkurrerer på samme plass. Som utvikler drar jeg ofte fordel av enhetens eksterne lagring, og for det meste er jeg fornøyd med bibliotekene Google har gitt meg for å takle fil i / o.

Jeg sier for det meste fordi det er ett område der jeg synes SDK mangler. Jeg vil virkelig se en widget for filleseren - det vil si en komponent som forenkler jobben med å knytte brukergrensesnittet til den underliggende Dalvik-filimplementeringen. Jeg ser tvingende grunner til at Google gir en widget for filsøking. Mitt viktigste resonnement er at en "offisiell" komponent vil gi en jevn brukeropplevelse på tvers av et økosystem som er utrolig mangfoldig når det gjelder maskinvare, og spesielt skjermoppløsninger. Akk, til en slik widget blir tilgjengelig, må vi utviklere gjøre det.

Opplæringen som følger demonstrerer en enkel listebasert filleseraktivitet jeg har brukt i et av prosjektene mine. Du kan laste ned hele kilden her, eller følge trinn for trinn.

1. Lag et nytt Android-prosjekt i Eclipse målrettet mot Android 1.6 eller nyere.

2. I mappen / res / drawable trenger vi noen bilder. Jeg har tatt med fire bildefiler: file.png, folder.png, root.png og up.png. Disse filene blir brukt senere i vår tilpassede adapter for å tjene som ikoner.

3. Vi trenger noen oppsett, så legg til en main.xml i mappen / res / layout. Oppsettet inneholder ikke annet enn en listevisning.

 main.xml 
 "1.0" encoding = "utf-8" ?> 
 "Http://schemas.android.com/apk/res/android" 
 android: orientering = "vertikal" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" > 
 android: id = "@ + id / android: list" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: dividerHeight = "1dip" /> 

4. Vi må definere de individuelle radene i listevisningen, og vi gjør dette i /res/layout/list_row.xml. For å holde ting enkelt, legger vi bare til en tekstvisning for filnavnet og ett bildevisning som vert for ikonet vårt.

 list_row.xml 
 "1.0" encoding = "utf-8" ?> 
 "Http://schemas.android.com/apk/res/android" 
 android: layout_width = "fill_parent" 
 android: layout_height = "? android: attr / listPreferredItemHeight" 
 android: padding = "6dip" > 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" > 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: layout_gravity = "venstre" 
 android: polstring = "2dip" 
 android: id = "@ + id / fileicon" /> 
 android: id = "@ + id / filnavn" 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: textSize = "14sp" 
 android: polstring = "2dip" 
 android: textStyle = "fet" 
 android: gravitasjon = "venstre | bunn" 
 android: layout_gravity = "venstre | bunn" /> 

5. Vi går videre til / src-mappen. Vi ønsker å lage en tilpasset listevisningsadapter som håndterer å vise filnavnet og tilordne det aktuelle ikonet. Merk at posisjon 0 og posisjon 1 i listen vår alltid vil være spesielle tilfeller, da dette vil være navigasjonsknappene våre.

 CustomAdapter.java 
 pakke com.authorwjf; 
 import java.io.File; 
 importer java.util.ArrayList; 
 import android.content.Context; 
 import android.view.LayoutInflater; 
 import android.view.View; 
 import android.view.ViewGroup; 
 import android.widget.ArrayAdapter; 
 import android.widget.ImageView; 
 import android.widget.TextView; 
 Custom class CustomAdapter utvider ArrayAdapter { 
 private ArrayList-varer; 
 privat kontekst c = null ; 
 / ** 
 * Konstruksjon av standard datadapter 
 * / 
 public CustomAdapter (Kontekstkontekst, int textViewResourceId, ArrayList-elementer) { 
 super (kontekst, textViewResourceId, elementer); 
 dette .items = elementer; 
 dette .c = kontekst; 
 } 
 / ** 
 * Kode påberopes når container varsler datasett om endring. 
 * / 

@Overstyring

 public View getView ( int- posisjon, View convertView, ViewGroup-overordnede) { 
 Vis v = convertView; 
 if (v == null ) { 
 LayoutInflater vi = (LayoutInflater) c.getSystemService (Kontekst. LAYOUT_INFLATER_SERVICE ); 
 v = vi.inflate (R.layout. list_row, null ); 
 } 
 TextView filnavn = null ; 
 ImageView fileicon = null ; 
 Fil f = items.get (posisjon); 
 if (f! = null ) { 
 filnavn = (TextView) v.findViewById (R.id. filnavn ); 
 fileicon = (ImageView) v.findViewById (R.id. fileicon ); 
 } 
 if (filnavn! = null ) { 
 if (posisjon == 0) { 
 filename.setText (f.getAbsolutePath ()); 
 } annet hvis (posisjon == 1) { 
 filename.setText (f.getAbsolutePath ()); 
 } annet { 
 filename.setText (f.getName ()); 
 } 
 } 
 if (fileicon! = null ) { 
 if (posisjon == 0) { 
 fileicon.setImageResource (R.drawable. root ); 
 } annet hvis (posisjon == 1) { 
 fileicon.setImageResource (R.drawable. opp ); 
 } annet hvis (f.isDirectory ()) { 
 fileicon.setImageResource (R.drawable. mappe ); 
 } annet { 
 fileicon.setImageResource (R.drawable. fil ); 
 } 
 } 
 retur v; 
 } 
 } 

6. Vi må implementere Main.java-filen for å utvide listevisningen og håndtere klikkene på listen. Metoden refreshFileList håndterer administrasjonen av innholdet av datadaptere. Det er verdt å se nærmere på onSaveInstanceState-overstyringen også; det er her vi bevarer roten, den nåværende og den siste noden. Hvis du fjernet denne funksjonen og den tilhørende logikken i onCreate-metoden, ville du funnet ut at å rotere telefonen vil føre brukeren tilbake til rotkatalogen, som selv ikke er en dødelig feil, absolutt er en ulempe.

 Main.java 
 pakke com.authorwjf; 
 import java.io.File; 
 importer java.util.ArrayList; 
 import android.app.ListActivity; 
 import android.os.Bundle; 
 import android.os. Miljø; 
 import android.view.View; 
 import android.widget.ListView; 
 import android.widget.Toast; 
 public class Main utvider ListActivity { 
 privat fil mCurrentNode = null ; 
 privat fil mLastNode = null ; 
 privat fil mRootNode = null ; 
 private ArrayList mFiles = new ArrayList (); 
 privat tilpasset adapter mAdapter = null ; 
 / ** Ringes når aktiviteten først opprettes. * / 
 @Overstyring 
 public void onCreate (Bundle savedInstanceState) { 
 super .onCreate (savedInstanceState); 
 setContentView (R.layout. main ); 
 mAdapter = ny CustomAdapter ( dette, R.layout. list_row, mFiles); 
 setListAdapter (mAdapter); 
 if (savedInstanceState! = null ) { 
 mRootNode = (File) savedInstanceState.getSerializable ("root_node"); 
 mLastNode = (File) savedInstanceState.getSerializable ("last_node"); 
 mCurrentNode = (File) savedInstanceState.getSerializable ("current_node"); 
 } 
 refreshFileList (); 

}

 private void refreshFileList () { 
 if (mRootNode == null ) mRootNode = ny fil (Miljø. getExternalStorageDirectory () .toString ()); 
 if (mCurrentNode == null ) mCurrentNode = mRootNode; 
 mLastNode = mCurrentNode; 
 File  files = mCurrentNode.listFiles (); 
 mFiles.clear (); 
 mFiles.add (mRootNode); 
 mFiles.add (mLastNode); 
 if (filer! = null ) { 
 for ( int i = 0; i <files.length; i ++) mFiles.add (files i); 
 } 
 mAdapter.notifyDataSetChanged (); 
 } 
 @Overstyring 
 beskyttet tomrom onSaveInstanceState (Bundle outState) { 
 outState.putSerializable ("root_node", mRootNode); 
 outState.putSerializable ("current_node", mCurrentNode); 
 outState.putSerializable ("last_node", mLastNode); 
 super .onSaveInstanceState (outState); 
 } 
 / ** 
 * Listevisning på klikkbehandler. 
 * / 
 @Overstyring 
 public void onListItemClick (ListView-overordnet, Vis v, int- posisjon, lang id) { 
 Fil f = (Fil) overordnet.getItemAtPosition (posisjon); 
 if (posisjon == 1) { 
 if (mCurrentNode.compareTo (mRootNode)! = 0) { 
 mCurrentNode = f.getParentFile (); 
 refreshFileList (); 
 } 
 } annet hvis (f.isDirectory ()) { 
 mCurrentNode = f; 
 refreshFileList (); 
 } annet { 
 Skål. makeText ( dette, "Du valgte:" + f.getName () + "!", toast. LENGTH_SHORT ) .show (); 
 } 
 } 
 } 

Gratulerer! Du har nå en helt egen ekstern lagringsleser. For enkelhets skyld er implementeringen pene barbeiner. Trinnene som trengs for å legge til flere funksjoner som filstørrelse, endret dato osv., Bør være åpenbare. Det kan også være interessant å bruke en rutenettimplementering i stedet for en listevisning, spesielt for å bla gjennom filer på Android-baserte nettbrett. Bruk gjerne diskusjonstråden til å dele tweaksene dine med andre lesere.

© Copyright 2020 | mobilegn.com