1 Βάσ εις δεδομένων - Αρχεία Σε αυτήν την ενότητα θα εξετάσ ουμε τον τρόπο με τον οποίο σ υνδέεται το android με βάσ εις δεδομένων και πιο σ υγκεκριμένα με Sqlite βάσ εις. 1.1 Παραδείγματα ArrayList Επειδή θα ασ χοληθούμε αναλυτικά με βάσ εις δεδομένων που απαιτούν χρήσ η ArrayList θα παρουσ ιάσ τει ένα αναλυτικό παράδειγμα αποθήκευσ ης αυτοκινήτων. Η κατηγορία Car έχει ως ακολούθως: 1 package t e i e p ; 3 public class Car { 4 private S t r i n g name ; 5 private S t r i n g brand ; 6 private double c o s t ; 7 public Car ( S t r i n g n, S t r i n g b, double c ) 8 { 9 name=n ; 10 brand=b ; 11 c o s t=c ; 1 } 13 S t r i n g getname ( ) { return name ; } 14 S t r i n g getbrand ( ) { return brand ; } 15 double g e t c o s t ( ) { return c o s t ; } 16 public S t r i n g t o S t r i n g ( ) 17 { 18 return brand+" : "+name+" : "+c o s t ; 19 } 0 } Για την αποθήκευσ η αντικειμένων της κατηγορίας χρησ ιμοποιείται ArrayList όπως και σ την επόμενη κατηγορία: 1 package t e i e p ; 3 import java. u t i l. ArrayList ; 4 5 public class CarList { 6 private ArrayList<Car> mycars ; 7 public CarList ( ) 8 { 9 mycars=new ArrayList<Car >(); 10 } 11 public void addcar ( S t r i n g n, S t r i n g b, double c ) 1 { 13 Car mycar=new Car (n, b, c ) ; 1
14 mycars. add ( mycar ) ; 15 } 16 public Car g e t c a r ( int p o s i t i o n ) 17 { 18 i f ( p o s i t i o n <0 p o s i t i o n >=mycars. s i z e ( ) ) 19 return null ; 0 return mycars. get ( p o s i t i o n ) ; 1 } 3 public void updatecar ( int pos, 4 S t r i n g n, S t r i n g b, double c ) 5 { 6 Car mycar=new Car (n, b, c ) ; 7 mycars. s e t ( pos, mycar ) ; 8 } 9 30 public void removecar ( int pos ) 31 { 3 i f ( pos<0 pos>=mycars. s i z e ( ) ) return ; 33 mycars. remove ( pos ) ; 34 } 35 36 public int t o t a l c a r s ( ) 37 { 38 return mycars. s i z e ( ) ; 39 } 40 } Τέλος για την διαχείρισ η της ArrayList χρησ ιμοποιείται το επόμενο πρόγραμμα: 1 package t e i e p ; import javax. swing. ; 3 public class Main { 4 public s t a t i c void main ( S t r i n g [ ] args ) { 5 CarList c l i s t=new CarList ( ) ; 6 int c h o i c e ; 7 do 8 { 9 System. out. p r i n t l n ( "1 I n s e r t new car " ) ; 10 System. out. p r i n t l n ( " Display c a r s " ) ; 11 System. out. p r i n t l n ( "3 Change car " ) ; 1 System. out. p r i n t l n ( "4 Remove car " ) ; 13 System. out. p r i n t l n ( "5 Exit " ) ; 14 c h o i c e=i n t e g e r. p a r s e I n t ( 15 JOptionPane. showinputdialog ( " Enter c h o i c e " ) ) ; 16 i f ( c h o i c e==1) 17 {
18 S t r i n g name, brand ; 19 double c o s t ; 0 name=joptionpane. showinputdialog ( " Enter name" ) ; 1 brand=joptionpane. showinputdialog ( " Enter brand" ) ; c o s t=double. parsedouble ( 3 JOptionPane. showinputdialog ( " Enter c o s t " ) ) ; 4 c l i s t. addcar (name, name, c o s t ) ; 5 } 6 else 7 i f ( c h o i c e==) 8 { 9 int i ; 30 for ( i =0; i<c l i s t. t o t a l c a r s ( ) ; i++) 31 { 3 Car c=c l i s t. g e t c a r ( i ) ; 33 System. out. p r i n t l n ( "Car at "+i+" i s "+c ) ; 34 } 35 } 36 else 37 i f ( c h o i c e==3) 38 { 39 S t r i n g name, brand ; 40 double c o s t ; 41 int pos ; 4 name=joptionpane. showinputdialog ( " Enter name" ) ; 43 brand=joptionpane. showinputdialog ( " Enter brand" ) ; 44 c o s t=double. parsedouble ( 45 JOptionPane. showinputdialog ( " Enter c o s t " ) ) ; 46 pos=i n t e g e r. p a r s e I n t ( 47 JOptionPane. showinputdialog ( " Enter p o s i t i o n " ) ) ; 48 c l i s t. updatecar ( pos, name, name, c o s t ) ; 49 } 50 else 51 i f ( c h o i c e==4) 5 { 53 int pos ; 54 pos=i n t e g e r. p a r s e I n t ( 55 JOptionPane. showinputdialog ( " Enter p o s i t i o n " ) ) ; 56 c l i s t. removecar ( pos ) ; 57 } 58 }while ( c h o i c e! = 5 ) ; 59 } 60 } 3
1. Δημιουργία βάσης δεδομένων Για να υπάρξει σ ύνδεσ η με βάσ εις δεδομένων χρειάζεται να επεκτείνουμε την κατηγορία SQLiteOpenHelper. Καταρχήν θα πρέπει να δώσ ουμε την επόμενη άδεια σ το AndroidManifest.xml <uses permission android:name=" android. permission.write_external_storage" /> καθώς θα πρέπει να αποθηκευτεί η ΒΔ σ ε ξεχωρισ τό αρχείο. Στην σ υνέχεια δημιουργούμε την επόμενη κατηγορία 1 public c l a s s Database extends SQLiteOpenHelper{ 3 private S t r i n g databasename=null ; 4 private S t r i n g tablename=" c a r s " ; 5 private SQLiteDatabase database=null ; 6 private Context mcontext=null ; 7 8 public Database ( Context context, S t r i n g name, 9 CursorFactory factory, int v e r s i o n ) { 10 super ( context, name, factory, v e r s i o n ) ; 11 databasename=name ; 1 mcontext=context ; 13 database=this. getwritabledatabase ( ) ; 14 } 15 16 @Override 17 public void oncreate ( SQLiteDatabase db ) { 18 db. execsql ( " c r e a t e t a b l e "+tablename+ 19 " (name text, brand text, c o s t double ) " ) ; 0 Log. d( "TEST", " Database Created " ) ; 1 } 3 @Override 4 public void onupgrade ( SQLiteDatabase db, 5 int oldversion, int newversion ) 6 { 7 Log. d( "TEST", " Database New Version : "+newversion ) ; 8 db. execsql ( " drop t a b l e i f e x i s t s "+tablename ) ; 9 oncreate ( db ) ; 30 } 31 } Σε αυτήν την κατηγορία θα πρέπει να παρατηρήσ ουμε τα ακόλουθα: 1. Στην μέθοδο δημιουργίας τα δύο βασ ικά σ τοιχεία είναι το όνομα της ΒΔ και η έκδοσ ή της (παράμετροι name και version). Το όνομα της ΒΔ σ υνήθως είναι με κατάληξη.db σ το τέλος. 4
. Η έκδοσ η μπορεί να είναι ένας ακέραιος αριθμός, ο οποίος σ υνήθως ξεκινά από 1. 3. Αν η ΒΔ δεν υπάρχει, τότε με την γραμμή database=this.getwritabledatabase(); καλείται η μέθοδος oncreate() η οποία και θα αναλάβει την δημιουργία των πινάκων. 4. Αν η ΒΔ υπάρχει και ο αριθμός έκδοσ ης είναι μεγαλύτερος από τον προηγούμενο καλείται η μέθοδος onupgrade Η επόμενη κατηγορία χρησ ιμοποιείται για την επικοινωνία με την ΒΔ 1 public class MainActivity extends A c t i v i t y { 3 LinearLayout mainlayout=null ; 4 int dbversion =1; 5 S t r i n g dbname=" c a r s. db" ; 6 Button createdb=null ; 7 Database mydb=null ; 8 9 @Override 10 protected void oncreate ( Bundle s a v e d I n s t a n c e S t a t e ) { 11 super. oncreate ( s a v e d I n s t a n c e S t a t e ) ; 1 mainlayout=new LinearLayout ( this ) ; 13 setcontentview ( mainlayout ) ; 14 mydb=new Database ( this, dbname, null, dbversion ) ; 15 createdb=new Button ( this ) ; 16 createdb. settext ( "CREATE DATABASE" ) ; 17 mainlayout. addview ( createdb ) ; 18 createdb. s e t O n C l i c k L i s t e n e r (new OnClickListener ( ) 19 { 0 1 @Override public void onclick ( View v ) { 3 mydb. c l o s e ( ) ; 4 ++dbversion ; 5 mydb=new Database ( MainActivity. this, 6 dbname, null, dbversion ) ; 7 8 } 9 30 } ) ; 31 } 3 } Στην εφαρμογή αυτή κάθε φορά που ο χρήσ της πατάει το πλήκτρο πίεσ ης η ΒΔ δημιουργείται και πάλι, αφού αυξάνει ο αριθμός έκδοσ ης. 5
1.3 Εισαγωγή δεδομένων -Εμφάνιση δεδομένων Στην σ υνέχεια παρουσ ιάζεται τροποποιημένη η κατηγορία Database με μεθόδους για εισ αγωγή και επισ τροφή των δεδομένων του πίνακα. 1 public c l a s s Database extends SQLiteOpenHelper{ 3 private S t r i n g databasename=null ; 4 private S t r i n g tablename=" c a r s " ; 5 private SQLiteDatabase database=null ; 6 private Context mcontext=null ; 7 8 public Database ( Context context, S t r i n g name, 9 CursorFactory factory, int v e r s i o n ) { 10 super ( context, name, factory, v e r s i o n ) ; 11 databasename=name ; 1 mcontext=context ; 13 database=this. getwritabledatabase ( ) ; 14 } 15 16 @Override 17 public void oncreate ( SQLiteDatabase db ) { 18 db. execsql ( " c r e a t e t a b l e "+tablename+ 19 " (name text, brand text, c o s t double ) " ) ; 0 Log. d( "TEST", " Database Created " ) ; 1 } 3 @Override 4 public void onupgrade ( SQLiteDatabase db, 5 int oldversion, int newversion ) 6 { 7 Log. d( "TEST", " Database New Version : "+newversion ) ; 8 db. execsql ( " drop t a b l e i f e x i s t s "+tablename ) ; 9 oncreate ( db ) ; 30 } 31 3 public ArrayList<String > g e t R e s u l t s ( ) 33 { 34 ArrayList<String > x=new ArrayList<String >(); 35 Cursor c u r s o r = database. rawquery ( 36 " s e l e c t from "+tablename, null ) ; 37 i f ( c u r s o r. getcount ()==0) 38 { 39 c u r s o r. c l o s e ( ) ; 40 return x ; 41 } 4 int nameindex, brandindex, c o s t i n d e x ; 6
43 nameindex=c u r s o r. getcolumnindex ( "name" ) ; 44 brandindex=c u r s o r. getcolumnindex ( "brand" ) ; 45 c o s t i n d e x=c u r s o r. getcolumnindex ( " c o s t " ) ; 46 i f ( c u r s o r. movetofirst ( ) ) { 47 do{ 48 x. add ( c u r s o r. g e t S t r i n g ( nameindex)+ 49 " : "+c u r s o r. g e t S t r i n g ( brandindex)+" : "+ 50 c u r s o r. g e t S t r i n g ( c o s t i n d e x ) ) ; 51 }while ( c u r s o r. movetonext ( ) ) ; 5 } 53 return x ; 54 } 55 56 public void i n sertrecord ( S t r i n g name, S t r i n g brand, double c o s t ) 57 { 58 S t r i n g query=" i n s e r t i n t o "+ 59 tablename+" (name, brand, c o s t ) v alues ( ' "+ 60 name+" ', ' "+brand+" ', "+c o s t+" ) " ; 61 database. execsql ( query ) ; 6 } 63 } Για την εισ αγωγή δεδομένων σ την ΒΔ χρησ ιμοποιείται η μέθοδος execsql(). Για την επισ τροφή δεδομένων από την ΒΔ πρέπει να χρησ ιμοποιηθεί η τεχνική των cursors όπως παρουσ ιάζεται σ την μέθοδο getresults(). Η κατηγορία mainactivity αλλάζει ως ακολούθως: 1 public class MainActivity extends A c t i v i t y { 3 LinearLayout mainlayout=null ; 4 int dbversion =1; 5 S t r i n g dbname=" c a r s. db" ; 6 Button createdb=null ; 7 Database mydb=null ; 8 EditText name=null, brand=null, c o s t=null ; 9 LinearLayout buttonlayout=null ; 10 Button addbutton=null, showbutton=null ; 11 ListView l i s t=null ; 1 ArrayAdapter<String > adapter=null ; 13 14 public void makeinputs ( ) 15 { 16 name=new EditText ( this ) ; 17 name. sethint ( "Car name" ) ; 18 mainlayout. addview (name ) ; 19 brand=new EditText ( this ) ; 0 brand. sethint ( "Car brand" ) ; 7
1 mainlayout. addview ( brand ) ; c o s t=new EditText ( this ) ; 3 c o s t. sethint ( "Car c o s t " ) ; 4 mainlayout. addview ( c o s t ) ; 5 } 6 public void makelist ( ) 7 { 8 Display d i s p l a y = getwindowmanager ( ). g e t D e f a u l t D i s p l a y ( ) ; 9 int height = d i s p l a y. getheight ( ) ; 30 l i s t=new ListView ( this ) ; 31 mainlayout. addview ( l i s t ) ; 3 LinearLayout. LayoutParams lparams= 33 ( LinearLayout. LayoutParams ) l i s t. getlayoutparams ( ) ; 34 lparams. height=height / 3 ; 35 l i s t. setlayoutparams ( lparams ) ; 36 } 37 38 public void updatelist ( ) 39 { 40 ArrayList<String > x=new ArrayList<String >(); 41 x=mydb. g e t R e s u l t s ( ) ; 4 ArrayAdapter<String > adapter=new ArrayAdapter<String >( 43 this, android.r. layout. simple_list_item_1, x ) ; 44 l i s t. setadapter ( adapter ) ; 45 l i s t. i n v a l i d a t e ( ) ; 46 } 47 48 public void makebuttons ( ) 49 { 50 buttonlayout=new LinearLayout ( t h i s ) ; 51 mainlayout. addview ( buttonlayout ) ; 5 addbutton=new Button ( this ) ; 53 addbutton. settext ( "ADD CAR" ) ; 54 buttonlayout. addview ( addbutton ) ; 55 showbutton=new Button ( this ) ; 56 showbutton. settext ( "SHOW CARS" ) ; 57 buttonlayout. addview ( showbutton ) ; 58 addbutton. s e t O n C l i c k L i s t e n e r (new OnClickListener ( ) 59 { 60 61 @Override 6 public void onclick ( View arg0 ) { 63 mydb. i n s ertrecord (name. gettext ( ). t o S t r i n g ( ), 64 brand. gettext ( ). t o S t r i n g ( ), 65 Double. parsedouble ( 66 c o s t. gettext ( ). t o S t r i n g ( ) ) ) ; 8
67 } 68 69 } ) ; 70 71 showbutton. s e t O n C l i c k L i s t e n e r (new OnClickListener ( ) 7 { 73 74 @Override 75 public void onclick ( View arg0 ) { 76 updatelist ( ) ; 77 } 78 79 } ) ; 80 } 81 8 @Override 83 protected void oncreate ( Bundle s a v e d I n s t a n c e S t a t e ) { 84 super. oncreate ( s a v e d I n s t a n c e S t a t e ) ; 85 mainlayout=new LinearLayout ( this ) ; 86 setcontentview ( mainlayout ) ; 87 mainlayout. s e t O r i e n t a t i o n ( LinearLayout.VERTICAL) ; 88 mydb=new Database ( this, dbname, null, dbversion ) ; 89 makeinputs ( ) ; 90 makelist ( ) ; 91 makebuttons ( ) ; 9 } 93 } Προφανώς κάποιος αν θέλει να εκτελέσ ει οποιοδήποτε ερώτημα σ ε Sqlite ΒΔ μπορεί να χρησ ιμοποιήσ ει την μέθοδο execsql 1.4 Αρχεία στην κάρτα μνήμης Το επόμενο θέμα που θα εξετάσ ουμε είναι η πρόσ βασ η σ ε αρχεία σ την κάρτα μνήμης του κινητού. Και σ ε αυτήν την περίπτωσ η θα πρέπει να υπάρχει η επόμενη άδεια σ το αρχείο AndroidManifest.xml <uses permission android:name=" android. permission.write_external_storage" /> Στο επόμενο παράδειγμα παρουσ ιάζεται η διαχείρισ η αρχείων κειμένου για τον υπολογισ μό απλών αριθμητικών πράξεων σ ε πίνακες όπως μέσ ος όρος, ελάχισ το και μέγισ το. 1 public class MainActivity extends A c t i v i t y { 3 LinearLayout mainlayout=null ; 4 Button c r e a t e F i l e=null ; 5 Button openfile=null ; 9
6 ArrayList<Double> data=null ; 7 ListView l i s t=null ; 8 TextView r e s u l t=null ; 9 LinearLayout buttonlayout=null ; 10 11 public double average ( ) 1 { 13 i f ( data==null ) 14 return 0. 0 ; 15 double mesos =0.0; 16 int i ; 17 for ( i =0; i<data. s i z e ( ) ; i++) 18 mesos=mesos+data. get ( i ) ; 19 return mesos/ data. s i z e ( ) ; 0 } 1 public double min ( ) 3 { 4 i f ( data==null ) return 0. 0 ; 5 double x=data. get ( 0 ) ; 6 int i ; 7 for ( i =0; i<data. s i z e ( ) ; i++) 8 i f ( data. get ( i )<x ) 9 x=data. get ( i ) ; 30 return x ; 31 } 3 33 public double max( ) 34 { 35 i f ( data==null ) return 0. 0 ; 36 double x=data. get ( 0 ) ; 37 int i ; 38 for ( i =0; i<data. s i z e ( ) ; i++) 39 i f ( data. get ( i )>x ) 40 x=data. get ( i ) ; 41 return x ; 4 } 43 44 public void makelist ( ) 45 { 46 Display d i s p l a y = getwindowmanager ( ). g e t D e f a u l t D i s p l a y ( ) ; 47 int height = d i s p l a y. getheight ( ) ; 48 TextView header=new TextView ( this ) ; 49 header. settext ( "PLEASE MAKE A SELECTION" ) ; 50 header. s etback groun dcolor ( Color.GRAY) ; 51 header. setgravity ( Gravity.CENTER) ; 10
5 mainlayout. addview ( header ) ; 53 l i s t=new ListView ( this ) ; 54 mainlayout. addview ( l i s t ) ; 55 LinearLayout. LayoutParams lparams= 56 ( LinearLayout. LayoutParams ) l i s t. getlayoutparams ( ) ; 57 lparams. height=height / 3 ; 58 l i s t. setlayoutparams ( lparams ) ; 59 ArrayList<String > c=new ArrayList<String >(); 60 c. add ( "AVERAGE" ) ; 61 c. add ( "MIN" ) ; 6 c. add ( "MAX" ) ; 63 ArrayAdapter<String > adapter=new ArrayAdapter<String >( this, 64 android.r. layout. simple_list_item_1, c ) ; 65 l i s t. setadapter ( adapter ) ; 66 l i s t. setonitemclicklistener (new OnItemClickListener ( ) 67 { 68 69 @Override 70 public void onitemclick ( AdapterView<?> parent, 71 View view, int p o s i t i o n, long id ) { 7 i f ( p o s i t i o n ==0) 73 { 74 r e s u l t. settext ( " Average : "+average ( ) ) ; 75 } 76 else 77 i f ( p o s i t i o n ==1) 78 { 79 r e s u l t. settext ( "Min : "+min ( ) ) ; 80 } 81 else 8 i f ( p o s i t i o n ==) 83 { 84 r e s u l t. settext ( "Max: "+max ( ) ) ; 85 } 86 } 87 88 } ) ; 89 } 90 91 public void makebuttons ( ) 9 { 93 buttonlayout=new LinearLayout ( t h i s ) ; 94 mainlayout. addview ( buttonlayout ) ; 95 c r e a t e F i l e=new Button ( this ) ; 96 c r e a t e F i l e. settext ( "CREATE FILE" ) ; 97 buttonlayout. addview ( c r e a t e F i l e ) ; 11
98 openfile=new Button ( this ) ; 99 openfile. settext ( "OPEN FILE" ) ; 100 buttonlayout. addview ( openfile ) ; 101 c r e a t e F i l e. s e t O n C l i c k L i s t e n e r (new OnClickListener ( ) 10 { 103 104 @Override 105 public void onclick ( View v ) { 106 AlertDialog. Builder a l e r t = new 107 AlertDialog. Builder ( MainActivity. this ) ; 108 a l e r t. s e t T i t l e ( " Create FILE" ) ; 109 a l e r t. setmessage ( " S p e c i f y f i l e name : " ) ; 110 f i n a l EditText input = new EditText ( MainActivity. this ) ; 111 a l e r t. setview ( input ) ; 11 a l e r t. s e t P o s i t i v e B u t t o n ( "Ok", 113 new D i a l o g I n t e r f a c e. OnClickListener ( ) 114 { 115 public void onclick ( D i a l o g I n t e r f a c e dialog, int whichbutton ) { 116 S t r i n g value = input. gettext ( ). t o S t r i n g ( ) ; 117 Random K=new Random ( ) ; 118 int N=1+Math. abs (K. nextint ()%0); 119 // Gia na min f t i a x e i p o l y megalous p i n a k e s 10 int i ; 11 data=new ArrayList<Double >(); 1 for ( i =0; i<n; i++) 13 data. add (K. nextdouble ( ) 0 ) ; 14 F i l e m y f i l e=new F i l e ( 15 Environment. g e t E x t e r n a l S t o r a g e D i r e c t o r y ( ), value ) ; 16 try { 17 Writer out = new BufferedWriter (new OutputStreamWriter ( 18 new FileOutputStream ( m y f i l e ), "UTF8" ) ) ; 19 S t r i n g l i n e=n+"\n" ; 130 out. append ( l i n e ) ; 131 for ( i =0; i<n; i++) 13 { 133 l i n e=data. get ( i )+"\n" ; 134 out. append ( l i n e ) ; 135 } 136 out. f l u s h ( ) ; 137 out. c l o s e ( ) ; 138 } catch ( Exception e ) 139 { 140 Log. d( "TEST", "Problem in f i l e "+e. getmessage ( ) ) ; 141 } 14 } 143 } ) ; 1
144 a l e r t. setnegativebutton ( " Cancel ", new 145 D i a l o g I n t e r f a c e. OnClickListener ( ) { 146 public void onclick ( D i a l o g I n t e r f a c e dialog, int whichbutton ) 147 { 148 } 149 } ) ; 150 151 a l e r t. show ( ) ; 15 } 153 } ) ; 154 openfile. s e t O n C l i c k L i s t e n e r (new OnClickListener ( ) 155 { 156 157 @Override 158 public void onclick ( View v ) { 159 AlertDialog. Builder a l e r t = new 160 AlertDialog. Builder ( MainActivity. this ) ; 161 16 a l e r t. s e t T i t l e ( "Open FILE" ) ; 163 a l e r t. setmessage ( " S p e c i f y f i l e name : " ) ; 164 165 f i n a l EditText input = new EditText ( MainActivity. this ) ; 166 a l e r t. setview ( input ) ; 167 168 a l e r t. s e t P o s i t i v e B u t t o n ( "Ok", new 169 D i a l o g I n t e r f a c e. OnClickListener ( ) { 170 public void onclick ( D i a l o g I n t e r f a c e dialog, int whichbutton ) 171 { 17 S t r i n g value = input. gettext ( ). t o S t r i n g ( ) ; 173 F i l e f i l e =new F i l e ( 174 Environment. g e t E x t e r n a l S t o r a g e D i r e c t o r y ( ), value ) ; 175 176 try { 177 BufferedReader br = new BufferedReader ( 178 new InputStreamReader ( new 179 FileInputStream ( f i l e ), " u t f 8 " ), 6 5 5 3 6 ) ; 180 S t r i n g l i n e="" ; 181 l i n e=br. readline ( ) ; 18 data=new ArrayList<Double >(); 183 int i ; 184 int N=I n t e g e r. p a r s e I n t ( l i n e ) ; 185 for ( i =0; i<n; i++) 186 { 187 l i n e=br. readline ( ) ; 188 double x=double. parsedouble ( l i n e ) ; 189 data. add ( x ) ; 13
190 } 191 } catch ( Exception e ) { 19 Log. d( "TEST", "Problem in f i l e "+e. getmessage ( ) ) ; 193 } 194 195 } 196 197 } ) ; 198 a l e r t. setnegativebutton ( " Cancel ", new 199 D i a l o g I n t e r f a c e. OnClickListener ( ) { 00 public void onclick ( D i a l o g I n t e r f a c e dialog, int whichbutton ) 01 { 0 } 03 } ) ; 04 05 a l e r t. show ( ) ; 06 } } ) ; 07 } 08 09 public void makeresult ( ) 10 { 11 r e s u l t=new TextView ( this ) ; 1 mainlayout. addview ( r e s u l t ) ; 13 r e s u l t. setbackgroundcolor ( Color.GREEN) ; 14 r e s u l t. settext ( "RESULT: " ) ; 15 } 16 17 @Override 18 protected void oncreate ( Bundle s a v e d I n s t a n c e S t a t e ) { 19 super. oncreate ( s a v e d I n s t a n c e S t a t e ) ; 0 mainlayout=new LinearLayout ( t h i s ) ; 1 setcontentview ( mainlayout ) ; mainlayout. s e t O r i e n t a t i o n ( LinearLayout.VERTICAL) ; 3 makelist ( ) ; 4 makebuttons ( ) ; 5 makeresult ( ) ; 6 } 7 } 1.5 Αρχεία στο Assets Ολες οι εφαρμογές android διαθέτουν και ένα βοηθητικό φάκελο με το όνομα assets Σε αυτόν τοποθετούνται αρχεία τα οποία είναι μικρά σ ε μέγεθος (<1ΜΒ) και τα οποία είναι μόνον προς ανάγνωσ η. Για να τοποθετήσ ουμε ένα αρχείο σ ε αυτόν τον φάκελο δίνουμε δεξί κλικ σ ε αυτόν και επιλέγουμε Import. Στο επόμενο 14
παράδειγμα τοποθετούμε σ τον φάκελο assets τρεις μικρές εικόνες. Ο χρήσ της διαλέγει από ένα ListView μια εικόνα και αυτή εμφανίζεται σ ε ένα ImageView. 1 public class MainActivity extends A c t i v i t y { 3 LinearLayout mainlayout=null ; 4 ListView l i s t=null ; 5 ArrayAdapter<String > adapter=null ; 6 ImageView image=null ; 7 8 @Override 9 protected void oncreate ( Bundle s a v e d I n s t a n c e S t a t e ) { 10 super. oncreate ( s a v e d I n s t a n c e S t a t e ) ; 11 mainlayout=new LinearLayout ( this ) ; 1 setcontentview ( mainlayout ) ; 13 mainlayout. s e t O r i e n t a t i o n ( LinearLayout.VERTICAL) ; 14 l i s t=new ListView ( this ) ; 15 mainlayout. addview ( l i s t ) ; 16 ArrayList<String >x =new ArrayList<String >(); 17 f i n a l AssetManager assetmanager = g e t A s s e t s ( ) ; 18 try { 19 S t r i n g [ ] f i l e s = assetmanager. l i s t ( " Images " ) ; 0 //mesa s t i n parametro t i s l i s t bazoume 1 // ton f a k e l o, an y p a r x e i k a p o i o s int i ; 3 for ( i =0; i<f i l e s. length ; i++) 4 x. add ( f i l e s [ i ] ) ; 5 adapter=new ArrayAdapter<String >( this, 6 android.r. layout. simple_list_item_1, x ) ; 7 l i s t. setadapter ( adapter ) ; 8 } catch ( Exception e1 ) { 9 Log. d( "TEST", "EXCEPTION "+e1. getmessage ( ) ) ; 30 e1. printstacktrace ( ) ; 31 } 3 l i s t. setonitemclicklistener (new OnItemClickListener ( ) 33 { 34 35 @Override 36 public void onitemclick ( AdapterView<?> parent, View view, 37 int p o s i t i o n, long id ) { 38 InputStream ims ; 39 try 40 { 41 ims = assetmanager. open ( 4 " Images /"+adapter. getitem ( p o s i t i o n ) ) ; 43 Drawable d = Drawable. createfromstream ( ims, null ) ; 15
44 image. setimagedrawable ( d ) ; 45 } catch ( Exception e ) { 46 Log. d( "TEST", "ERROR "+e. getmessage ( ) ) ; 47 } 48 } 49 } ) ; 50 image=new ImageView ( this ) ; 51 mainlayout. addview ( image ) ; 5 LinearLayout. LayoutParams iparams= 53 ( LinearLayout. LayoutParams ) image. getlayoutparams ( ) ; 54 iparams. width =100; 55 iparams. height =100; 56 image. setlayoutparams ( iparams ) ; 57 58 } 59 } 16