JavascriptProva

venerdì 26 maggio 2017

Mettere un layout in overlay

Dopo aver predisposto windowManager e i WindowManager.LayoutParams si istanzia un Layout e si aggiunge alla finestra.
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){

        windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams wParams=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );
        
        newLayout=new RelativeLayout(this);
        windowManager.addView(newLayout,wParams);

.....
E quindi si inflata il layout voluto al posto di quello già messo.
        LayoutInflater layoutInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        layoutInflater.inflate(R.layout.layout,newLayout);
Ecco il tutto:
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){

        windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
        WindowManager.LayoutParams wParams=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        newLayout=new RelativeLayout(this);
        windowManager.addView(newLayout,wParams);

        LayoutInflater layoutInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        layoutInflater.inflate(R.layout.layout,newLayout);



        return START_NOT_STICKY;
    }

martedì 25 aprile 2017

Programma per i successivi esercizi:
  1. Ricostruire l'activity per l'aggiunta di records nel database con immagine e edittext
  2. Addestrarsi all'uso del NumberPicker
  3. Allineamento nel LinearLayout

Esercizio ripetuto di ripasso dei Menu.



Altri esercizi sui database

Esercizio:
1) Eliminazione di un record da una tabella
2)Modifica di un campo di un record.

public class MainActivity extends AppCompatActivity {

    Helper helper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        

        /

        Cursor crs=helper.query();
        do{
            System.out.println(crs.getString(crs.getColumnIndex("nome"))+" "+crs.getString(crs.getColumnIndex("cognome")));
        }while(crs.moveToNext());

    }

}

class Helper extends SQLiteOpenHelper {

    public Helper(Context context) {
        super(context, "database.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table tabella(_id integer primary key, nome text, cognome text)");
    }

    public void save(String n, String c){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("nome",n);
        values.put("cognome",c);
        try {
            db.insertOrThrow("tabella", null, values);
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }
    }



    public Cursor query(){
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor crs=db.rawQuery("select*from tabella",null);
        crs.moveToFirst();
        return crs;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
Inseriamo la funzione che modifica:
    public void save(String n, String c){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("nome",n);
        values.put("cognome",c);
        try {
            db.insertOrThrow("tabella", null, values);
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }
    }
    
    public void modifica(String vecchio,String nuovo){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set nome='"+nuovo+"' where nome='"+vecchio+"'");
    }
Ora lo metto in opera:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica("Giuseppe","Pippo");

        
Vediamo...

04-25 14:57:01.773 6034-6034/? I/System.out: Mario Rossi
04-25 14:57:01.773 6034-6034/? I/System.out: Mario Verdi
04-25 14:57:01.774 6034-6034/? I/System.out: Pippo Verdi
Ricordare che il comando SQL inizia con UPDATE tabella, e poi SET... WHERE non è difficile.

Ora scrivo una procedura per eliminare il terzo record.
Provo con questa (nella classe Helper):
    public void cancella(String n){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where nome='"+n+"'");
    }
E la provo:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.cancella("Giuseppe");
Ecco:
04-25 15:03:58.850 9661-9661/? I/System.out: Mario Rossi
04-25 15:03:58.850 9661-9661/? I/System.out: Mario Verdi
Ancora con un altro nome. Riscrivo daccapo per allenarmi:
    public void cancella(String c){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where cognome='"+c+"'");
    }
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.cancella("Rossi");
04-25 15:07:32.736 11681-11681/? I/System.out: Mario Verdi
04-25 15:07:32.736 11681-11681/? I/System.out: Giuseppe Verdi


Operazione combinata di modifica e cancella. Modifico Giuseppe Verdi in Giuseppe Rossi e poi cancello Verdi.
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='Rossi' where nome='Giuseppe'");
    }

    public void cancella(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("delete from tabella where cognome='Verdi'");
    }
Provo:
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica();
        helper.cancella();
04-25 15:14:49.741 15579-15579/? I/System.out: Mario Rossi
04-25 15:14:49.741 15579-15579/? I/System.out: Giuseppe Rossi
perfetto!

Doppia modifica:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia' and nome='Cicciobello' where nome='Giuseppe'");
    }
No, ottengo uno zero.
Provo così:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia', nome='Cicciobello' where nome='Giuseppe'");
    }
04-25 15:19:57.107 18596-18596/? I/System.out: Mario Rossi
04-25 15:19:57.108 18596-18596/? I/System.out: Mario Verdi
04-25 15:19:57.108 18596-18596/? I/System.out: Cicciobello La Minchia
Perfetto!

Due clausole:
    public void modifica(){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("update tabella set cognome='La Minchia' where nome='Mario' and cognome='Rossi'");
    }
        helper=new Helper(this);
        helper.save("Mario","Rossi");
        helper.save("Mario","Verdi");
        helper.save("Giuseppe","Verdi");

        helper.modifica();
04-25 15:47:10.068 519-519/? I/System.out: Mario La Minchia
04-25 15:47:10.069 519-519/? I/System.out: Mario Verdi
04-25 15:47:10.069 519-519/? I/System.out: Giuseppe Verdi
Okay.

Esercizi sui database

Rifaccio gli esercizi sui database.

1) Inserire diversi records con i campi nome e cognome, in cui vi sia il vincolo di cognome unico, e l'inserimento di records con cognome ripetuto determini la comparsa di un messaggio di errore in LogCat.

2) Inserire record in cui il vincolo sia soltanto di nome e cognome ambedue ripetuti, sempre con segnalazione dell'errore in LogCat.

3)Modificare il nome di uno o più records.
CREAZIONE GENERALE DI UN SEMPLICE DATABASE.
CREAZIONE DI UN VINCOLO DI UNICITA'.
Se viene lasciato insert al posto di insertOrThrow, l'inserimento del record viene semplicemente ignorato senza segnalare alcun errore.

Se insert viene sostituito con insertOrThrow l'errore viene rilevato e il programma si interrompe.
Se invece "catturo" l'errore con un ciclo try...catch, il programma viene eseguito e l'errore può essere gestito con la comparsa di un messaggio nel quale figura anche il campo responsabile dell'errore, cosa che mi permette di avvisare l'utente circa l'errore e la sua causa.
VINCOLO DI UNICITA' DELLA COMBINAZIONE DI PIU' CAMPI DELLA TABELLA

MODIFICA DEL VALORE DI UN CAMPO DELLA TABELLA

mercoledì 19 aprile 2017

Creazione di funzioni separate per la conversione Uri-Path, Path-Bitmap e Bitmap-Stringa

Ora voglio rendere funzione autonoma la conversione del Path in Bitmap e di questa in Stringa.
Innanzitutto che parametro bisogna avere per ottenere il Path dall'Uri restituito da data.getData()?
La funzione deve restituire una String e avere come parametro un Uri.
Proviamo...
    private String UriToPath(Uri foundUri){
        Cursor crs=getApplicationContext().getContentResolver().query(foundUri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s=crs.getString(indice);
        return s;
    }
Dovrebbe funzionare.

Ora vediamo per la trasformazione del Path in Bitmap.
La funzione restituisce Bitmap, e deve avere come parametro Path.
    private Bitmap PathToBitmap(String path){
        Bitmap bmp= BitmapFactory.decodeFile(path);
        return bmp;
    }
C'era un modo per ricavare bmp più piccole e meno pesanti, e su quello mi devo esercitare dopo perché non sono sicuro di ricordarlo a memoria.

Ora la funzione che ha per tipo String e per parametro Bitmap per la trasformazione di Bitmap in una String.
    private String BitmapToString(Bitmap bmp){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b =stream.toByteArray(b);
        String s= Base64.encodeToString(b,Base64.DEFAULT);
        return s;
    }
Ora mettiamole in sequenza facendo scrivere la sringa in LogCat.
Sì, ho testato funzione per funzione e funzionano tutte.
Potrei tenere una libreria per la conversione, da inserire in ogni mio programma per il quale ce ne fosse l'utilità.

martedì 18 aprile 2017

Prendendo il Cursor dalla tabella del database, vorrei fare di ognuno un'immagine.
Per disporre una griglia di immagini, indipendentemente dal contenuto, devo avere:
  • il numero degli elementi
  • la lunghezza delle linee.
Però per mettere poi in ognuna delle immagini l'immagine giusta devo avere preventivamente un array di immagini. Se voglio metterci anche i tags devo avere un array di tags.
Se voglio questa funzione dal resto, posso creare un arraylist di immagini e tags e quindi disporla come parametro, usando il size dell'arraylist.
Il vantaggio è che ho una funzione separata e quindi più gestibile e più facile da revisionare.
Lo svantaggio è che devo prima trasferire i valori dei campi del Cursor in un arrayList.
Proviamo...
                //PRENDERE TUTTI I RECORDS
                Cursor crs=helper.query();

                    ArrayList<imgStorage> imgStorageArrayList=new ArrayList<imgStorage>();
                do{
                    imgStorageArrayList.add(new imgStorage(crs.getString(2),crs.getString(2)));
                }while(crs.moveToNext());
                System.out.println(imgStorageArrayList.size()); 
Funziona.
Ora devo creare la funzione a parte, che avendo questo array come parametro crea le immagini.
            private void disponi(ArrayList<imgStorage> arrayStorage,int rowlength){
                for(int i=0;i<arrayStorage.size();i++){
                    imageView=new ImageView(getApplicationContext());
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(100,100);
                    params.leftMargin=i%rowlength*100;
                    params.topMargin=i/rowlength*100;
                    imageView.setLayoutParams(params);
                    mainLayout.addView(imageView);
                    imageView.setTag(arrayStorage.get(i).getNome());
                    System.out.println(arrayStorage.get(1).getNome());
                }
            } 
e sembra funzionare egregiamente.