2017-09-27 2 views
0

Ich versuche, den Image-Pfad aus einem ImageView zu erhalten. Die ImageView wird über einen String-Pfadspeicher in SQLite db geladen.
Wenn ich ein Element meines Db in einigen Feldern außer dem Bildpfad eins ändere, kann ich den Pfad von imageView nicht zurücklesen, um die db korrekt zu aktualisieren. Daher wird der Feldbildpfad nach jeder Art von Aktualisierung zu null.Image-Pfad von einem ImageView abrufen

In Code, wenn ich auf die Schaltfläche Speichern klicken nenne ich die saveProduct() -Methode:

private void saveProduct() { 
    // Read from input field 
    //Use trim to eliminate leading or trailing white space 
    String nameString = mNameEditText.getText().toString().trim(); 
    String qtyString = mQtyEditText.getText().toString().trim(); 
    String priceString = mPriceEditText.getText().toString().trim(); 
    String mailString = mEmailEditText.getText().toString().trim(); 
    String phoneString = mPhoneEditText.getText().toString().trim(); 

    // Check if this is a new product or an existing one 
    if (mcurrentProdUri == null && 
      TextUtils.isEmpty(nameString) && TextUtils.isEmpty(qtyString) 
      && TextUtils.isEmpty(priceString)&& TextUtils.isEmpty(mailString) 
      && TextUtils.isEmpty(phoneString)) { 
     return; 
    } 

    //Create a ContentValues object to populate the database 
    ContentValues values = new ContentValues(); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_NAME, nameString); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_QTY, qtyString); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_PRICE, priceString); 
    values.put(InventoryContract.ProductEntry.COLUMN_EMAIL, mailString); 
    values.put(InventoryContract.ProductEntry.COLUMN_PHONE, phoneString); 
    values.put(InventoryContract.ProductEntry.COLUMN_PRODUCT_PIC, picPath); 

    //Determine if this is a new product or not by checking if mCurrentProdUri is null or not 
    if (mcurrentProdUri == null) { 

     Uri newUri = getContentResolver().insert(InventoryContract.ProductEntry.CONTENT_URI, values); 

     // check if newUri is null or not 
     if (newUri == null){ 
      //Show an error toast message 
      Toast.makeText(this, "There has been an error inserting a new product", Toast.LENGTH_SHORT).show(); 
     } else { 
      //Otherwise show a successful addition message 
      Toast.makeText(this, "A new product has been added!", Toast.LENGTH_SHORT).show(); 

     } 
    } else { 
     //Otherwise if this is an existing product proceed updating it with new data 

     int rowsAffected = getContentResolver().update(mcurrentProdUri, values, null, null); 

     if (rowsAffected == 0) { 
      // If no rows were affected show error toast message 
      Toast.makeText(this, "There has been an error in updating the product", Toast.LENGTH_SHORT).show(); 
     } else { 
      // Otherwise the update was successful and we can show the related Toast message 
      Toast.makeText(this, "The product has been updated!", Toast.LENGTH_SHORT).show(); 
     } 

    } 

} 

Ich habe bereits alle verwandten Beiträge lesen, aber ich weiß wirklich nicht, wie ich das Verfahren das Lesen machen kann Imageview, um aus den zugehörigen Bildpfad (oder Uri)

Vielen dank für die Unterstützung

+1

Ein 'ImageView' weiß nicht, woher das Bild kam. Sie müssen diese Informationen auf andere Weise speichern, z. B. über ein separates Feld in Ihrer Aktivität oder in Ihrem Fragment. – CommonsWare

+0

@CommonsWare danke für die schnelle Antwort. Ich lade die Daten auf der Benutzeroberfläche mit getLoaderManager(). InitLoader (EXISTING_PROD_LOADER, null, das);, Ich muss die Pfaddaten hier speichern? – akstavrh

+0

@CommonsWare! Ich habe das Hinzufügen einiger Logik in OnLoadFinished() gelöst, wie in diesem Beitrag https://stackoverflow.com/questions/14424624/using-cursorloader-with-loadermanager-to-retrieve-images-from-android-apps vorgeschlagen. Danke, dass du mich auf den richtigen Weg gebracht hast! – akstavrh

Antwort

0

Sie müssen sich auf die Aktivität/Fragment Ebene Spur des uri zu halten, bevor Sie den Imageview laden, wie es ist nicht die Verantwortung eines regelmäßig ImageView zu re Mitglied ist die Quelle.

können Sie bauen jedoch eine erweiterte Image, die dafür verantwortlich ist, wenn es Ihrem Fall hilft:

class MyImageView extends ImageView { 

    private Uri mImageUri; 

    public MyImageView(Context context) { 
     super(context); 
    } 

    @Override 
    public void setImageURI(@Nullable Uri uri) { 
     super.setImageURI(uri); 
     mImageUri = uri; 
    } 

    public Uri getImageUri(){ 
     return mImageUri; 
    } 
} 

Wenn Sie diesen Weg gehen, haben Sie den Ansichtszustand nehmen Speichern in Betracht während Konfigurationsänderungen oder du kannst diese uri verlieren.

Verwandte Themen