2013-08-09 11 views
6

Całkowicie napisałem ponownie to pytanie, aby ograniczyć zakres.Odrzucanie fragmentów i utrata obrazu Image

Mam dwa fragmenty, które odwracają się jak karty (lewo, prawo). Kiedy fragment z przodu zniknie, pokazuje się tył. Po ponownym kliknięciu przycisku następuje jego ponowne przejście do przodu, ale obraz z przodu fragmentu zniknął.

Próbowałem różnych metod zapisywania danych wybranego obrazu.

  1. Zapisywanie fragmentu onSaveInstanceState

To daje mi Null Pointer, więc pomyślałam, że potrzebuję czegoś bardziej stałego raz tworzony.

  1. Więc teraz zapisać obraz do sdcard raz Zbierane

Ten Pomyślałem będzie działać i po prostu sprawdzić ścieżkę i chwycić go jeśli jej przerzucony na front lub działalność jest odtworzony.

Oto kod

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"); 
      } 

Odwróć Kliknij przycisk Listener

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

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

flipCard Metoda:

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

ustawić obraz onActivityResult z ich PhotoGallery

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(); 
       } 

To jak mam dostępu obraz i próbuje ustawić go do mojego ImageView na restart()

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

Wydaje się, że najlepszym trasie uzyskanie obrazu i ustawienie go, ale nie będzie działać. Jaka byłaby najlepsza praktyka i jak mogę ją wykonać tak, jak tego potrzebuję?

Bardzo doceniane przy każdej pomocy!

+0

Nie powinieneś sprawdzić, czy NIE NULL? if (outState! = null). – Tool

+0

Próbowałem obu i nadal otrzymuję błąd wskaźnika zerowego. @Tool – Keeano

+0

Czy próbowałeś całkowicie usunąć linię if (outState == null)? – Tool

Odpowiedz

2

savedInstanceState służy do innego celu.

onSaveInstanceState (Bundle): Metoda ta jest wywoływana przed działaniem może być zabity tak, że gdy wraca jakiś czas w przyszłości może przywrócić jego stan

A w w twoim konkretnym przypadku, może nawet nie być wymagane. Po kliknięciu przycisku zmieniasz fragmenty, a nie ponownie uruchamiasz aplikację.

Z tego co widzę, pozwalasz użytkownikowi utworzyć pocztówkę: zdjęcie z jednej strony (powiedzmy, Strona A) i wiadomość na odwrocie (powiedzmy, Strona B).Gdy aplikacja się uruchamia, strona A jest widoczna. W pewien sposób pozwalasz użytkownikowi wybrać obraz z galerii. Zakładam, że onActivityResult(int, int, Intent) działa zgodnie z oczekiwaniami i ustawia obraz na ImageView - R.id.imageView. Po kliknięciu przycisku widok zmienia się na Stronę B. A kiedy przycisk zostanie kliknięty ponownie, widok zmienia się na Stronę A, ale obraz wybrany przez użytkownika nie istnieje.

Jedną z rzeczy, którą można wykonać w ramach onActivityResult(int, int, Intent) jest: zapisanie ścieżki obrazu w SharedPreferences.

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(); 

    .... 
    .... 
} 

W onActivityResult(int, int, Intent) zapisz ścieżkę obrazu:

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(); 
    } 
} 

W ten sposób, gdy użytkownik uruchamia aplikację, on/ona będzie zobaczyć zarówno domyślnego obrazu lub obraz uprzednio wybrany.

Gdzie savedInstanceState byłaby przydatna: Powiedzmy, że daje użytkownikowi możliwość pisania krótkich wiadomości po stronie B. Teraz, jeśli podczas pisania wiadomości, użytkownik obraca urządzenie z poziomego na pionowy (lub vice versa), wiadomość, którą napisał, zniknie, ponieważ działalność zostanie zniszczona i odtworzona. Aby zapisać wiadomość, należy użyć onSaveInstanceState(Bundle):

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

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

dniu obrotu, działalność w onCreate(Bundle)' will be called. The bundle passed is the same one from onSaveInstanceState (Bundle) `. Aby pobrać tekst:

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

Zdumiewająca odpowiedź i wydaje się, że dużo się nią zajmuje, ale gdzie powinienem ponownie zainicjować ImageView dla zapisanej stałej ścieżki? Próbowałem go w onCreate i otrzymałem błąd wskaźnika Null na imageview.setDrawable (postcard.getString (imageConst, null)); @vikram – Keeano

+0

@KeeanoMartin Dzięki. Czy możesz zmodyfikować swoje pytanie i opublikować zaktualizowany kod? Lub możemy porozmawiać: [tutaj] (http://chat.stackoverflow.com/rooms/35250/fragment-flips-and-losses-image). – Vikram

Powiązane problemy