2013-08-09 1 views
6

Ich habe die Frage komplett neu geschrieben, um den Umfang zu unterschreiben.Fragment Flips und Verluste Image

Ich habe zwei Fragmente, die wie eine Karte herumfliegen (links, rechts). Wenn das vordere Fragment verschwindet, zeigt es den Rücken. Sobald die Schaltfläche erneut angeklickt wird, springt sie wieder nach vorne, aber das ImageView auf dem vorderen Fragment ist verschwunden.

Ich habe verschiedene Methoden zum Speichern der Daten des Bilds ausprobiert.

  1. das Fragment onSaveInstanceState Speicher

Das gibt mir einen Null-Zeiger, so dachte ich, ich etwas konstanteren benötigen einmal erstellt werden.

  1. So, jetzt spare ich das Bild einmal
  2. Picked sdcard

Das würde ich arbeiten dachte, und prüfen Sie einfach den Pfad und packen es, wenn seine nach vorne oder die Aktivität gekippt wird neu erstellt. Hier

ist ein Code

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-Button klicken Listener

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

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

flipCard Methode:

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

stellte ich das Bild onActivityResult von ihrer Fotogalerie

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

Dies ist, wie ich das Bild am Zugriff auf und versuche, es auf Neustart, um mein Image zu setzen()

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

Das ist wie der beste Weg scheint in das Bild bekommen und einstellen, aber es wird nicht funktionieren. Was wäre die beste Praxis und wie bekomme ich sie so, wie ich es brauche?

Sehr geschätzt mit jeder Hilfe!

+0

Sollten Sie nicht nach NOT NULL suchen? if (outState! = null). – Tool

+0

Ich habe beides versucht und bekomme immer noch den Null Pointer Error. @Tool – Keeano

+0

Haben Sie versucht, die Zeile if (outState == null) vollständig zu entfernen? – Tool

Antwort

2

savedInstanceState dient einem anderen Zweck.

onSaveInstanceState (Bundle): Diese Methode wird aufgerufen, bevor eine Tätigkeit getötet werden, so dass, wenn es kommt in Zukunft vor einiger Zeit kann es sein Zustand

Und

wiederherstellen, in In Ihrem speziellen Fall ist es möglicherweise nicht einmal erforderlich. Beim Klicken auf die Schaltfläche ändern Sie Fragmente und starten Ihre App nicht neu.

Von dem, was ich sehen kann, lassen Sie den Benutzer eine Postkarte erstellen: ein Bild auf einer Seite (sagen wir, Seite A) und eine Nachricht auf der anderen Seite (sagen wir, Seite B).Wenn die App startet, ist Seite A sichtbar. In gewisser Weise lässt der Benutzer ein Bild aus der Galerie auswählen. Ich gehe davon aus, dass onActivityResult(int, int, Intent) wie erwartet funktioniert, und setzt das Image auf ImageView - R.id.imageView. Wenn auf eine Schaltfläche geklickt wird, ändert sich die Ansicht zu Seite B. Wenn die Schaltfläche erneut angeklickt wird, ändert sich die Ansicht zu Seite A, aber das vom Benutzer ausgewählte Bild ist nicht vorhanden.

Eine Sache, die Sie innerhalb onActivityResult(int, int, Intent) tun können, ist: Speichern Sie den Pfad des Bildes in 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(); 

    .... 
    .... 
} 

In onActivityResult(int, int, Intent), speichern Sie das Bild Pfad:

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

Auf diese Weise, wenn der Benutzer die App startet, er/sie entweder das Standardbild sehen werden, oder ein Bild vorher ausgewählt.

Wo savedInstanceState wäre nützlich: Angenommen, Sie dem Benutzer eine Option geben nun eine kurze Nachricht schreiben, auf Seite B, wenn während der Nachricht zu schreiben, der Benutzer das Gerät von Landschaft zu Portrait dreht (oder umge versa), die Nachricht, die er/sie geschrieben hat, ist weg, weil die Aktivität zerstört und neu erstellt wird. Um die Nachricht zu speichern, würden Sie onSaveInstanceState(Bundle) verwenden:

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

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

Bei Drehung, Aktivität onCreate(Bundle)' will be called. The bundle passed is the same one from onSaveInstanceState (Bundle) `. Um den Text abzurufen:

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

Erstaunliche Antwort und es scheint eine Menge davon zu kümmern, aber wo würde ich das ImageView für den gespeicherten konstanten Pfad reinitialisieren? Ich probierte es in der onCreate und ich bekomme einen Null-Zeiger-Fehler auf der imageview.setDrawable (postcard.getString (imageConst, null)); @vikram – Keeano

+0

@KeeanoMartin Vielen Dank. Können Sie Ihre Frage bearbeiten und den aktualisierten Code veröffentlichen? Oder wir können chatten: [hier] (http://chat.stackoverflow.com/rooms/35250/fragment-flips-and-losses-image). – Vikram