2013-08-09 14 views
6

मैंने इस सवाल को पूरी तरह से दायरे में लिखने के लिए फिर से लिखा है।टुकड़े टुकड़े और नुकसान छवि

मेरे पास दो टुकड़े हैं जो एक कार्ड (बाएं, दाएं) की तरह फ़्लिप करते हैं। जब सामने का टुकड़ा फ्लिप गायब हो जाता है तो यह पीछे दिखाता है। एक बार बटन फिर से क्लिक हो जाने पर यह फिर से सामने आ जाता है लेकिन सामने के टुकड़े पर ImageView चला गया है।

मैंने उठाई गई छवि के डेटा को सहेजने के विभिन्न तरीकों का प्रयास किया है।

  1. सहेजा जा रहा है टुकड़ा onSaveInstanceState

यह मैं देता एक अशक्त सूचक, तो मैं सोचा मैं और अधिक लगातार एक बार बनाया जा रहा कुछ की जरूरत है।

  1. तो अब मैं एक बार चुना गया

यह मैं काम करेगा और सिर्फ पथ की जाँच करें और इसे हड़पने अगर सामने करने के लिए अपने फ़्लिप या गतिविधि से निर्मित किया गया है सोचा sdcard के लिए छवि बचाने के लिए।

यहाँ) कुछ कोड

OnCreate (है:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.new_postcard_activity); 
     //UI call 
     frontImageView = (ImageView) findViewById(R.id.imageView); 
     Log.d(tag, "onCreate() Instance:" + savedInstanceState); 
     //fragment start 
      if (savedInstanceState == null) { 
       Log.d(tag,"Instance Null"); 
       getFragmentManager() 
         .beginTransaction() 
         .add(R.id.postcardFrame, new CardFrontFragment()) 
         .commit(); 
       if(!mShowingBack){ 
        Log.d(tag,"Not showing back"); 
        if(newPath != null && newPath != ""){ 
         Log.d(tag, "entered new path, not empty"); 
         Drawable drawable = Drawable.createFromPath(newPath); 
         Log.d(tag, "Should be setting saved image."); 
         frontImageView.setImageDrawable(drawable); 
        } 
        } 
      } 
      else 
      { 
       mShowingBack = (getFragmentManager().getBackStackEntryCount() > 0); 
       Log.d(tag, "Instance is not Null"); 
      } 

फ्लिप बटन क्लिक श्रोता

//flip card 
final Button cardBackButton = (Button) findViewById(R.id.cardBackButton); 
cardBackButton.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     flipCard(); 
}); 

फ़्लिपकार्ड विधि:

private void flipCard() 
    { 
     Log.d(tag2, "Log after flipCard:" + mShowingBack); 
     if(mShowingBack) 
     { 
      //Flip to front 
      flipFront(); 
      return; 
     } 
     // Flip to back 
     flipBack(); 
    } 

मैं उनके PhotoGallery से छवि onActivityResult सेट

protected void onActivityResult(int requestCode, int resultCode, 
      Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 

     if (resultCode == RESULT_OK) { 
      Uri photoUri = intent.getData(); 

      if (photoUri != null) { 
       try { 
        ImageView setImage = (ImageView)findViewById(R.id.imageView); 
        frontImage = MediaStore.Images.Media.getBitmap(this 
         .getContentResolver(), photoUri); 
        imageSet = true; 
        //save image to SD 
        if(imageSet == true){ 
         Log.d(tag, "Inside Image Set if Statement"); 
        String path = getExternalCacheDir() + "Postcards.png"; 
        if(path != null && path != ""){ 
        Log.d(tag, "Path is:" + path); 
        File file = new File(path); 
        newPath = file.getAbsolutePath(); 
        Log.d(tag, "New Path:" + newPath); 
        if(file.exists()){ 
         Log.d(tag, "File Exists"); 
         Drawable d = Drawable.createFromPath(newPath); 
         setImage.setImageDrawable(d); 

        }else{ 
         try{ 
          Log.d(tag,"File didnt exist"); 
          FileOutputStream out = new FileOutputStream(file); 
          frontImage.compress(Bitmap.CompressFormat.PNG, 90, out); 
          if(file.exists()){ 
           Log.d(tag, "file exists now"); 
          newPath = file.getAbsolutePath(); 
          Drawable b = Drawable.createFromPath(newPath); 
          setImage.setImageDrawable(b); 
          } 
         }catch(Exception e){ 
          e.printStackTrace(); 
         } 
        } 
       } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

यह कैसे मैं छवि तक पहुँचने कर रहा हूँ और पुनः प्रारंभ()

if(imageSet == true){ 
      if(newPath != null && newPath != ""){ 
       ImageView view = (ImageView) findViewById(R.id.imageView); 
       Drawable drawable = Drawable.createFromPath(newPath); 
       view.setImageDrawable(drawable); 
      } 
     } 

इस में सबसे अच्छा मार्ग की तरह लगता है पर मेरी imageView के लिए सेट करने की कोशिश कर रहा है छवि प्राप्त करना और इसे सेट करना लेकिन यह काम नहीं करेगा। सबसे अच्छा अभ्यास क्या होगा और मैं जिस तरीके से इसकी आवश्यकता है उसे करने के लिए मैं इसे कैसे प्राप्त कर सकता हूं?

किसी भी मदद से बहुत सराहना की!

+0

क्या आपको न्यूल की जांच नहीं करनी चाहिए? अगर (आउटस्टेट! = शून्य)। – Tool

+0

मैंने दोनों की कोशिश की और मुझे अभी भी शून्य सूचक त्रुटि मिल गई है। @ टूल – Keeano

+0

क्या आपने पूरी तरह से if (आउटस्टेट == नल) लाइन को हटाने का प्रयास किया है? – Tool

उत्तर

2

savedInstanceState एक अलग उद्देश्य प्रदान करता है।

onSaveInstanceState (बंडल): इस विधि एक गतिविधि मारा जा सकता है इससे पहले कि इसलिए जब यह वापस भविष्य में किसी समय आता है कि वह अपने राज्य

बहाल कर सकते हैं और कहा जाता है, में आपका विशेष मामला, यह भी आवश्यक नहीं हो सकता है। बटन क्लिक पर, आप अपने ऐप को पुनरारंभ नहीं करते, खंड बदल रहे हैं।

जो मैं देख सकता हूं, उससे आप उपयोगकर्ता को पोस्टकार्ड बना सकते हैं: एक तरफ एक तस्वीर (कहें, साइड ए) और फ्लिप-साइड (कहें, साइड बी) पर एक संदेश।जब ऐप शुरू होता है, तो साइड ए देखे जाते हैं। किसी भी तरह से, आप उपयोगकर्ता को गैलरी से एक छवि चुनने देते हैं। मुझे लगता है कि onActivityResult(int, int, Intent) अपेक्षित काम करता है, और छवि को ImageView - R.id.imageView पर सेट करता है। जब कोई बटन क्लिक किया जाता है, तो दृश्य को साइड बी में बदल दिया जाता है और जब बटन दोबारा क्लिक किया जाता है, तो दृश्य साइड ए में बदल जाता है, लेकिन उपयोगकर्ता द्वारा चुनी गई छवि वहां नहीं है।

onActivityResult(int, int, Intent) के अंदर आप एक चीज कर सकते हैं: साझा किए गए संदर्भ में छवि का पथ सहेजें।

SharedPreferences preferences; 
final String PREFS = "your.application.name.prefs"; 

// Keyword to find the path 
final String IMAGE_SELECTED_BY_USER = "image_selected_by_user"; 

// Use a default image when the user starts the app for the first time 
// or if the retrieved path points to a deleted image etc. 
final String PATH_TO_A_DEFAULT_IMAGE = "path_to_a_default_image"  

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    .... 
    .... 
    preferences = getActivity().getSharedPreferences(PREFS, 0); 
    imagePath = preferences.getString(IMAGE_SELECTED_BY_USER, PATH_TO_A_DEFAULT_IMAGE); 

    frontImageView = (ImageView) findViewById(R.id.imageView); 

    Drawable drawable = null; 

    if (new File(imagePath).exists()) { 
     drawable = Drawable.createFromPath(imagePath); 
    } else { 
     drawable = Drawable.createFromPath(PATH_TO_A_DEFAULT_IMAGE); 
    } 

    frontImageView.setImageDrawable(drawable); 

    getFragmentManager() 
     .beginTransaction() 
     .add(R.id.postcardFrame, new CardFrontFragment()) 
     .commit(); 

    .... 
    .... 
} 

onActivityResult(int, int, Intent) में, छवि पथ को बचाने:

if(file.exists()){ 
    Log.d(tag, "File Exists"); 
    Drawable d = Drawable.createFromPath(newPath); 
    setImage.setImageDrawable(d); 

    Editor editor = preferences.edit(); 
    editor.putString(IMAGE_SELECTED_BY_USER, newPath); 
    editor.commit(); 
} else{ 
    try{ 
     Log.d(tag,"File didnt exist"); 
     FileOutputStream out = new FileOutputStream(file); 
     frontImage.compress(Bitmap.CompressFormat.PNG, 90, out); 
     if (file.exists()) { 
      Log.d(tag, "file exists now"); 
      newPath = file.getAbsolutePath(); 
      Drawable b = Drawable.createFromPath(newPath); 
      setImage.setImageDrawable(b); 

      Editor editor = preferences.edit(); 
      editor.putString(IMAGE_SELECTED_BY_USER, newPath); 
      editor.commit(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

इस तरह, उपयोगकर्ता अनुप्रयोग शुरू होता है जब, वह/वह या तो डिफ़ॉल्ट छवि, या एक छवि पहले से चयनित देखेंगे।

कहाँ savedInstanceState उपयोगी होगा: चलो आप या उपाध्यक्ष अब साइड बी पर एक संक्षिप्त संदेश लेखन, जबकि संदेश लेखन, उपयोगकर्ता पोर्ट्रेट के लैंडस्केप से डिवाइस घूमता है यदि का एक विकल्प उपयोगकर्ता देना (मान लीजिए इसके विपरीत), वह संदेश जो लिखा है वह चलेगा क्योंकि गतिविधि नष्ट हो जाएगी और फिर से बनाई जाएगी। संदेश बचाने के लिए आप onSaveInstanceState(Bundle) का प्रयोग करेंगे:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putString("Text_To_Save", someEditText.getText().toString()); 
} 

रोटेशन पर, गतिविधि के onCreate(Bundle)' will be called. The bundle passed is the same one from onSaveInstanceState (बंडल) `। पाठ को पुनर्प्राप्त करने के लिए:

String savedString = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState != null) { 
     if (savedInstanceState.contains("Text_To_Save")) { 
      savedString = savedInstanceState.getString("Text_To_Save"); 
     } 
    } 

    someEditText.setText(savedString); 
} 
+0

कमाल का जवाब और ऐसा लगता है कि इसमें बहुत सारी देखभाल की गई है, लेकिन सहेजे गए निरंतर पथ के लिए मैं ImageView को फिर से शुरू करूंगा? मैंने इसे क्रिएट में करने की कोशिश की और मुझे imageview.setDrawable (postcard.getString (imageConst, null)) पर एक नल पॉइंटर त्रुटि मिलती है; @विक्राम – Keeano

+0

@KeeanoMartin धन्यवाद। क्या आप अपना प्रश्न संपादित कर सकते हैं और अद्यतन कोड पोस्ट कर सकते हैं? या, हम चैट कर सकते हैं: [यहां] (http://chat.stackoverflow.com/rooms/35250/fragment-flips-and-losses-image)। – Vikram

संबंधित मुद्दे