2013-08-09 8 views
6

私はスコープを1つ下げるために質問を完全に書き直しました。フラグメントのフリップとロス画像

私はカードのように(左、右)フリップする2つの断片があります。前方の断片が消えると、それは裏を示す。ボタンをもう一度クリックすると、前面に再びフリップされますが、前面のフラグメントのImageViewは消えてしまいます。

私は、選択した画像のデータを保存するさまざまな方法を試しました。

  1. 保存断片onSaveInstanceState

これは私にNULLポインタを与えるので、私は、私は一度作成され、より一定の何かを必要と考え出し。

  1. は、だから今、私はSDカードに画像を保存すると

これを選んだ私は仕事とちょうどパスを確認し、そのフロントに裏返すか、アクティビティが再作成された場合にそれをつかむと考えました。

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

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

flipCard方法

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

フリップボタンは、リスナーをクリックします:ここで

は、いくつかのコード

のonCreate()である

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

は、私は彼らのフォトギャラリーから画像を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

NOT NULLをチェックするべきではありませんか? if(outState!= null)です。 – Tool

+0

私は両方を試みましたが、まだNull Pointer Errorが発生します。 @ツール – Keeano

+0

if(outState == null)行を完全に削除しようとしましたか? – Tool

答えて

2

savedInstanceStateは、別の目的を果たします。

onSaveInstanceState(バンドル): それは

その状態を復元して、中にできること が将来的に戻っていくつかの時間を来るときように活動が殺される前に、このメソッドが呼び出されますあなたの特定の場合、それは必要でさえないかもしれません。ボタンをクリックすると、フラグメントを変更していて、アプリを再起動しません。

私は見ることができるように、ユーザーには、片面に画像(サイドA)と裏側にメッセージ(サイドB)があるはがきを作成させます。アプリが起動すると、サイドAが表示されます。いくつかの方法で、ユーザーはギャラリーから画像を選択させます。私は、onActivityResult(int, int, Intent)が期待どおりに動作し、ImageView - R.id.imageViewに画像を設定すると仮定します。ボタンをクリックすると、ビューがサイドBに変更されます。ボタンを再度クリックするとビューはサイドAに変わりますが、ユーザーが選択したイメージは表示されません。

onActivityResult(int, int, Intent)の中でできることは、次のとおりです。SharedPreferencesに画像のパスを保存します。 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(); 

    .... 
    .... 
} 

、画像のパスを保存:

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

をこのように、ユーザーがアプリを起動したとき、彼/彼女は、デフォルトの画像、または以前に選択した画像のいずれかが表示されます。メッセージを書いている間、ユーザーは風景からポートレート(またはvice-にデバイスを回転させた場合、あなたは、ユーザーに今サイドBにショートメッセージを書くのオプションを与えるとしましょう: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を再初期化するだろうか?私はonCreateでそれを試して、imageview.setDrawable(postcard.getString(imageConst、null))でNULLポインタエラーを取得します。 @vikram – Keeano

+0

@KeeanoMartinありがとう。あなたの質問を編集し、更新されたコードを投稿できますか?または、私たちはチャットできます:[ここ](http://chat.stackoverflow.com/rooms/35250/fragment-flips-and-losses-image)。 – Vikram

関連する問題