JavascriptProva

mercoledì 27 gennaio 2016

Creazione di un form per il caricamento di immagini in database e creazione di un bordo in un LinearLayout programmaticamente.

Prendere un'immagine dalla memoria e metterla in un database, insieme a etichetta e categoria.
Mi predispongo una tabella di database in cui vi siano i tre campi.
 class Helper extends SQLiteOpenHelper{

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

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABLE TABELLA(_ID INTEGER PRIMARY KEY,ETICHETTA TEXT,CATEGORIA TEXT,IMMAGINE BLOB)");
   
   
  }
  
  

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   
  }
  
 }
Ora creo il metodo save e il metodo query.
Ma prima forse mi conviene definire una classe che abbia tutte le proprietà
E qui la cosa si fa interessante per la gestione dell'immagine.
Credo che mi convenga memorizzare un array di bytes.

 class JImage{
  public String Etichetta;
  public String Categoria;
  public byte[] ImageByteArray;
 }
Questo presuppone che nell'immissione di dati venga creata prima la ByteArrayOutputStream e quindi dalla bitmap venga fatta la compressione con successiva conversione della ByteArrayOutputStream in byte di array.

Adesso provo a creare il metodo save().
  public void save(JImage jImage){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("ETICHETTA", jImage.Etichetta);
   values.put("CATEGORIA", jImage.Categoria);
   values.put("IMMAGINE", jImage.ImageByteArray);
   db.insert("TABELLA", null, values);
  }
Ecco.

Adesso devo costruire il meccanismo per l'immissione dell'immagine e delle sue caratteristiche.

Fatto.
Il codice che ho inserito è questo (completo):
public class Scelta extends Activity {

 //DICHIARAZIONI
 Bitmap bmp;
 JImage jImage;
 Helper helper;
 Button button;
 Adapter adapter;

 ImageView imageView;
 EditText editText;
 AutoCompleteTextView autoComplete;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_scelta);
  
  //DEFINIZIONI
  helper=new Helper(this);
  imageView=(ImageView) findViewById(R.id.imageView1);
  editText=(EditText) findViewById(R.id.editText1);
  autoComplete=(AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
  button=(Button) findViewById(R.id.button1);
  button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent=new Intent();
    intent.setData(Uri.parse("content://media/external/images/media"));
    intent.setAction(Intent.ACTION_PICK);
    startActivityForResult(intent,0);
    
   }
  });
  
  adapter=new Adapter(this,helper.catQuery(" "));
  autoComplete.setAdapter(adapter);
  autoComplete.setOnEditorActionListener(new TextView.OnEditorActionListener() {
   
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    ByteArrayOutputStream stream=new ByteArrayOutputStream();
    bmp.compress(CompressFormat.JPEG, 50, stream);
    byte[] blob=stream.toByteArray();
    jImage=new JImage();
    jImage.Etichetta=editText.getText().toString();
    jImage.Categoria=autoComplete.getText().toString();
    jImage.ImageByteArray=blob;
    helper.save(jImage);
    jImage=null;
    bmp=null;
    return false;
   }
  });
  

  
 }
 public void onActivityResult(int requestCode, int resultCode, Intent data){
  if(resultCode==RESULT_OK){
   BitmapFactory.Options opzioni=new BitmapFactory.Options();
   opzioni.inJustDecodeBounds=true;
   BitmapFactory.decodeFile(getPathFromUri(data.getData()),opzioni);
   int fattore=1;
   while(opzioni.outWidth/fattore>200 && opzioni.outHeight/fattore>200){
    fattore*=2;
   }
   opzioni.inSampleSize=fattore;
   opzioni.inJustDecodeBounds=false;
   bmp=BitmapFactory.decodeFile(getPathFromUri(data.getData()),opzioni);
   imageView.setImageBitmap(bmp);
   
   
   
   
  }
 }
 
 private String getPathFromUri(Uri uri){
  Cursor crs=getContentResolver().query(uri, null, null, null, null);
  crs.moveToFirst();
  int index=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
  String s=crs.getString(index);
  return s;
 }
 class Helper extends SQLiteOpenHelper{

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

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABLE TABELLA(_id INTEGER PRIMARY KEY,ETICHETTA TEXT,CATEGORIA TEXT,IMMAGINE BLOB)");
   db.execSQL("CREATE TABLE TBLCATEGORIE(_id INTEGER PRIMARY KEY,CATEGORIA TEXT)");
  }
  
  public void save(JImage jImage){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("ETICHETTA", jImage.Etichetta);
   values.put("CATEGORIA", jImage.Categoria);
   values.put("IMMAGINE", jImage.ImageByteArray);
   db.insert("TABELLA", null, values);
   values.clear();
   values.put("CATEGORIA", jImage.Categoria);
   db.insert("TBLCATEGORIE", null, values);
   imageView.setImageBitmap(null);
   editText.setText(null);
   autoComplete.setText(null);
  }
  
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor c = db.rawQuery("SELECT * FROM TABELLA", null);
   c.moveToFirst();
   return c;
  }
  
  public Cursor catQuery(String str){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor c=db.rawQuery("SELECT * FROM TBLCATEGORIE WHERE CATEGORIA LIKE '"+str+"%'", null);
   c.moveToFirst();
   return c;
  }
  

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   
   
  }
  
 }
 
 class JImage{
  public String Etichetta;
  public String Categoria;
  public byte[] ImageByteArray;
 }
 
 class Adapter extends CursorAdapter{

  public Adapter(Context context, Cursor c) {
   super(context, c);
   
  }

  @Override
  public View newView(Context context, Cursor cursor, ViewGroup parent) {
   LayoutInflater inflater=(LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
   TextView v=(TextView) inflater.inflate(android.R.layout.simple_dropdown_item_1line, null);
   return v;
  }

  @Override
  public void bindView(View view, Context context, Cursor cursor) {
   ((TextView)view).setText(cursor.getString(1));
   
  }
  
  @Override
  public Cursor runQueryOnBackgroundThread(CharSequence constraint){
   if(constraint!=null) return helper.catQuery(constraint+"");
   return null;
  }
  
  @Override
  public String convertToString(Cursor cursor){
   return cursor.getString(1);
   
  }
  
 }
Questo codice è stato trasferito su un'altra activity, chiamata "Scelta".
Ora vorrei visualizzare le immagini su dei LinearLayout.
Per prima cosa, trasferisco il codice su un'altra activity.

E l'ho fatto, ripassando l'Intent esplicito (per passare da un'activity all'altra.
  button=(Button) findViewById(R.id.button1);
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    
    Intent intent=new Intent(MainActivity.this,Scelta.class);
    startActivity(intent);
    
   }
  });
Bene.
Ora, all'avvio di questa Activity, voglio che le immagini salvate nel database vengano riportate su dei LinearLayout.
Devo ripassare le procedure per creare programmaticamente un linearlayout.
LinearLayout ll = new LinearLayout(this);
E poi?
Ecco il codice per aggiungere un Layout all'Activity:
  LinearLayout ll = new LinearLayout(this);
  ll.setBackgroundColor(Color.BLUE);
  ll.setOrientation(LinearLayout.VERTICAL);
  AbsoluteLayout.LayoutParams params=new AbsoluteLayout.LayoutParams(200,200,100,0);
  ll.setLayoutParams(params);
  AbsoluteLayout abs=(AbsoluteLayout)findViewById(R.id.lay);
  abs.addView(ll);
Ora potrebbe essere utile disegnare un bordo al layout.
Questa è una novità.
E ho trovato subito la soluzione
  LinearLayout ll = new LinearLayout(this);
  
  ll.setOrientation(LinearLayout.VERTICAL);
  AbsoluteLayout.LayoutParams params=new AbsoluteLayout.LayoutParams(200,200,100,0);
  ll.setLayoutParams(params);
  GradientDrawable gd=new GradientDrawable();
  gd.setColor(Color.WHITE);
  gd.setStroke(5, Color.BLACK);
  ll.setBackground(gd);
  AbsoluteLayout abs=(AbsoluteLayout)findViewById(R.id.lay);
  abs.addView(ll);
...che mi dà un Layout bianco con un bordo nero di spessore 5 (il numero che appare come parametro nel metodo setStroke).

Nessun commento:

Posta un commento