2013-08-09 10 views
6

Ho completamente riscritto la domanda per individuare lo scopo.Frammenti ribaltabili e perdite Image

Ho due frammenti che si girano come una carta (sinistra, destra). Quando il frammento anteriore scompare i salti mortali, mostra la parte posteriore. Dopo aver fatto nuovamente clic sul pulsante, si gira di nuovo in avanti, ma la visualizzazione di immagini sul frammento anteriore non è più disponibile.

Ho provato diversi metodi di salvataggio dei dati dell'immagine selezionata.

  1. Salvare il Frammento onSaveInstanceState

Questo mi dà un puntatore nullo, così ho pensato che mi serviva qualcosa di più costante una volta in fase di creazione.

  1. Così ora ho salvare l'immagine SDCARD volta Prelevato

Questo ho pensato che avrebbe funzionato e basta controllare il percorso e afferrarlo se girato verso la parte anteriore o l'attività viene ricreata.

Ecco il codice

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 Pulsante Fare clic Listener

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

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

Flipcard Metodo:

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

Ho impostare l'immagine onActivityResult dal loro 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(); 
       } 

Questo è come mi sono l'accesso l'immagine e cercando di impostare al mio ImageView su Restart()

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

Questo mi sembra il percorso migliore in ottenere l'immagine e impostarla ma non funzionerà. Quali sarebbero le migliori pratiche e come posso farlo funzionare nel modo in cui ne ho bisogno?

Molto apprezzato con qualsiasi aiuto!

+0

Non dovresti controllare per NOT NULL? if (outState! = null). – Tool

+0

Ho provato entrambi e ottengo ancora il Null Pointer Error. @Tool – Keeano

+0

Hai provato a rimuovere completamente la riga if (outState == null)? – Tool

risposta

2

savedInstanceState ha uno scopo diverso.

onSaveInstanceState (Bundle): Questo metodo viene chiamato prima di un'attività può essere ucciso in modo che quando si ritorna po 'di tempo in futuro in grado di ripristinare il suo stato

E, in il tuo caso particolare, potrebbe non essere nemmeno richiesto. Al clic del pulsante, stai modificando i frammenti, non riavviando la tua app.

Da quello che riesco a vedere, stai lasciando che l'utente crei una cartolina: un'immagine su un lato (ad esempio, Lato A) e un messaggio su un rovescio (ad esempio, Lato B).All'avvio dell'app, viene visualizzato il lato A. In qualche modo, si consente all'utente di selezionare un'immagine dalla galleria. Assumerò che onActivityResult(int, int, Intent) funzioni come previsto e imposta l'immagine su ImageView - R.id.imageView. Quando si fa clic su un pulsante, la vista viene modificata in Lato B. E quando si fa nuovamente clic sul pulsante, la vista cambia in Lato A, ma l'immagine selezionata dall'utente non è presente.

Una cosa che è possibile fare all'interno di onActivityResult(int, int, Intent) è: salvare il percorso dell'immagine 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), salvare il percorso dell'immagine:

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

In questo modo, quando l'utente avvia l'applicazione, lui/lei vedrà sia l'immagine di default, o un'immagine precedentemente selezionata.

Dove savedInstanceState sarebbe utile: Diciamo che si dà all'utente la possibilità di scrivere un breve messaggio sul lato B. Ora, se durante la scrittura del messaggio, l'utente ruota il dispositivo da orizzontale a verticale (o vice- versa), il messaggio che ha scritto sarà sparito perché l'attività sarà distrutta e ricreata. Per salvare il messaggio, si usa onSaveInstanceState(Bundle):

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

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

a rotazione, di attività onCreate(Bundle)' will be called. The bundle passed is the same one from onSaveInstanceState (Bundle) `. Per recuperare il testo:

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

Incredibile risposta e sembra che ci si prenda cura di molto ma dove reinizializzerò ImageView per il percorso costante salvato? L'ho provato su onCreate e ottengo un errore di puntatore Null su imageview.setDrawable (postcard.getString (imageConst, null)); @vikram – Keeano

+0

@KeeanoMartin Grazie. Potresti modificare la tua domanda e pubblicare il codice aggiornato? Oppure, possiamo chattare: [qui] (http://chat.stackoverflow.com/rooms/35250/fragment-flips-and-losses-image). – Vikram