2010-12-16 13 views
17

को रीफ्रेश/प्रतिबिंबित नहीं कर रहा है, मैं एक छवि चुनने के लिए एक फोटो पिकर इरादा का उपयोग कर रहा हूं और उसे एप्लिकेशन-प्राइवेट फ़ाइल में लिख सकता हूं। मेरा अधिकांश महत्वपूर्ण स्रोत कोड नीचे दिखाया गया है। एक बार जब मैं एक बटन दबाता हूं और पहला चित्र चयन उद्देश्य करता हूं, तो यह छवि दृश्य को सफलतापूर्वक अपडेट करता है। हालांकि, एक बार जब मैं छवि चयन बटन को फिर से (उसी गतिविधि में) दबाता हूं, तो छवि दृश्य अपडेट नहीं होता है, जब तक कि मैं बाहर निकलता हूं और गतिविधि को पुनरारंभ नहीं करता। इसलिए मुझे पता है कि छवि सफलतापूर्वक सहेजी जा रही है, लेकिन लेआउट में ImageView क्यों ताज़ा नहीं होगा या अपडेट नहीं होगा?ImageView

public void onResume() { 
    super.onResume(); 
    ImageView myImageView = (ImageView)findViewById(R.id.contact_image); 
    if (hasImage) { 
     myImageView.setImageURI(Uri.fromFile(getFileStreamPath(TEMP_PHOTO_FILE))); 
    } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
    case PHOTO_PICKED: 
     if (resultCode == RESULT_OK) { 
     if (data != null) { 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
      hasImage = true; 
      bmp = (Bitmap) extras.get("data"); 
      } 
     } 
     } 
     break; 
    } 
    } 

    private OnClickListener mChooseImage = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
     // Launch picker to choose photo for selected contact 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); 
     intent.setType("image/*"); 
     intent.putExtra("crop", "true"); 
     intent.putExtra("aspectX", 1); 
     intent.putExtra("aspectY", 1); 
     intent.putExtra("outputX", ICON_SIZE); 
     intent.putExtra("outputY", ICON_SIZE); 
     intent.putExtra("scale", true); 
     intent.putExtra("return-data", false); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile())); 
     intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
     startActivityForResult(intent, PHOTO_PICKED); 
     } catch (ActivityNotFoundException e) { 
     // LOG THIS 
     } 
    } 
    }; 

private File getTempFile() { 
    try { 
     if (!hasImage) { 
     FileOutputStream fos = openFileOutput(TEMP_PHOTO_FILE, MODE_WORLD_WRITEABLE); 
     fos.close(); 
     } 
     return getFileStreamPath(TEMP_PHOTO_FILE); 
    } catch (FileNotFoundException e) { 
     // To be logged later 
     return null; 
    } catch (IOException e) { 
     // To be logged later 
     return null; 
    } 
    } 

गतिविधि परिणाम पर, मैंने ImageView की छवि यूआरआई को इस फ़ाइल में सेट किया है।

जब यह पहली बार पूर्ण हो जाता है, तो छवि दृश्य इसे प्रतिबिंबित करने के लिए बदलता है। हालांकि, अगर मैं छवि को फिर से (एक ही गतिविधि) चुनने का प्रयास करता हूं, तो छवि दृश्य तब तक अपडेट नहीं होगा जब तक कि मैं बाहर निकलता हूं और गतिविधि को फिर से दर्ज नहीं करता। मुझे यकीन नहीं है कि ऐसा क्यों होता है, ऐसा इसलिए है क्योंकि मैं temp.jpg को हर बार लिखने की कोशिश कर रहा हूं? या क्या मुझे ImageView में बदलावों को प्रतिबिंबित करने के लिए किसी भी तरह से अपना लेआउट रीफ्रेश करने की आवश्यकता है?

+0

क्या कोई कोड गुम है? आपने जो लिखा है उससे चयनित छवि में आउटपुट स्ट्रीम खोलने की आवश्यकता नहीं है। –

+0

मैंने अपने स्रोत कोड का बहुमत जोड़ा है। मुझे यह भी लगता है कि अगर मैं बिटमैप के रूप में इरादे से मूल्य वापस कर देता हूं, तो छवि दृश्य सफलतापूर्वक अपडेट हो जाता है। हालांकि, मैं अभी भी समस्या का स्रोत जानना चाहता हूं। – damonkashu

+0

तो क्या ऐसा कुछ है जिसे मैं ImageViews या छवि पिकर इरादे के बारे में नहीं जानता? कुछ ऐसा जो गतिविधि को पुनरारंभ करने तक परिवर्तन को प्रतिबिंबित नहीं करता है? – damonkashu

उत्तर

1

अपने विजेट redrawing बाध्य करने के लिए/दृश्य सिर्फ View.invalidate();

+3

मैं इसे ImageView पर कॉल कर रहा हूं, और ऐसा लगता है कि यह कुछ भी नहीं कर रहा है – damonkashu

+1

मुझे यहां एक ही समस्या है। अमान्य मेरा कस्टम इमेजव्यू रीफ्रेश नहीं कर रहा है –

18

फोन imageView स्रोत कोड से परखने के बाद, imageView छवि को फिर से लोड नहीं होगा यदि आप एक ही यूआरआई के साथ setImageURI कहते हैं। आप अपनी छवि को दूसरी फ़ाइल में लिखकर यूआरआई को बदलने का प्रयास कर सकते हैं।

+4

धन्यवाद! मैंने इसे समझने की कोशिश में बहुत घंटे बिताए। स्रोत को देखने के बाद और view.requestLayout() और view.invalidate() जो कोशिश नहीं कर रहा है, मैंने निष्कर्ष निकाला है कि इसे स्थापित करने से पहले उरी को शून्य से सेट करना सबसे अच्छा है अगर setImageUri का उपयोग करने का एकमात्र तरीका नहीं है एक ही बदलती छवि फ़ाइल के लिए। –

+3

इसके लिए आप दोनों को धन्यवाद। यह सिर्फ ImageView रीफ्रेश के संबंध में मुझे कुछ घंटों भ्रम बचाया। मेरे मामले में, मैं चाहता था कि एक लोकेल अपडेट पर एक छवि रीफ्रेश हो, लेकिन जाहिर है, ऐसा लगता है कि, क्योंकि resId नहीं बदलता है, इसलिए ImageView केवल आपके अनुरोध को अनदेखा करता है, यह जांच नहीं करता कि संसाधन स्वयं बदल गया है या नहीं। बस एक setImageDrawable (शून्य) नियमित setImageResource (R.drawable.image) के बाद किया और यह काम करता है। प्रदर्शन उद्देश्यों के लिए एक कार्यान्वयन विकल्प होना चाहिए। – Toryu

+0

धन्यवाद @ पायलट_51 और टोरीयू ... छवि को सेट करने के लिए ड्रॉ करने योग्य और फिर मेरे लिए भी काम करने के बाद ImageURi सेट करना। – Akshat

1

मुझे एक ऐसी ही समस्या थी जहां मैं एक तस्वीर लेने के लिए डिवाइस कैमरे का उपयोग कर रहा था और फिर जब मैं वापस लौटा तो रीफ्रेश करने के लिए मूल स्क्रीन में छवि दृश्य देखना चाहता था। समाधान View.invalidate() को रेज़्यूम() में कॉल करना था।

11

छवि दृश्य दृश्य नहीं करेगा यदि "नया" यूआरआई पुराना जैसा ही है। "View.invalidate()" काम नहीं करेगा। अद्यतन करने के लिए "बल" करने के लिए आप कर सकते हैं:

public void onResume() { 
    super.onResume(); 
    ImageView myImageView = (ImageView)findViewById(R.id.contact_image); 
    if (hasImage) { 
    myImageView.setImageDrawable(null); // <--- added to force redraw of ImageView 
    myImageView.setImageURI(Uri.fromFile(getFileStreamPath(TEMP_PHOTO_FILE))); 
    } 
} 
3

अवैध() काम नहीं किया गया। हैक का प्रयास करें:

imageView.setImageURI(null); 
    imageView.setImageURI(newUri); 
संबंधित मुद्दे