1

我正在嘗試創建一個應用程序,讓用戶可以選擇要在其個人資料中顯示的圖片。我可以在imageview上瀏覽和設置他們選定的圖像。但是一旦活動被破壞,圖像就會丟失。我試圖實現onSaveInstanceState,但它仍然是一樣的。我想知道我是否正確使用它。我希望你能幫助像我這樣的新手。提前致謝。下面是我使用的代碼:活動被破壞後ImageView丟失圖像

public class AccountFragment extends Fragment implements OnClickListener { 
private LoginDataBaseAdapter loginDataBaseAdapter; 
Bitmap image; 
Bitmap bitmap; 
String picture_location; 
TextView textTargetUri; 
ImageView targetImage; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 


     View rootView = inflater.inflate(R.layout.fragment_account, container, false); 


      textTargetUri = (TextView) rootView.findViewById(R.id.targeturi); 

      targetImage=(ImageView) rootView.findViewById(R.id.profpic); 

      targetImage.setOnClickListener(new ImageView.OnClickListener(){ 
      @Override 
      public void onClick(View arg0) { 
       Intent intent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(intent, 0); 
      }}); 

      if (savedInstanceState != null) { 
       //if there is a bundle, use the saved image resource (if one is there) 
       image = savedInstanceState.getParcelable("BitmapImage"); 
       targetImage.setImageBitmap(image); 
       textTargetUri.setText(savedInstanceState.getString("path_to_picture")); 
      } 



     return rootView; 



    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState){ 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putParcelable("BitmapImage", bitmap); 
     savedInstanceState.putString("path_to_picture", picture_location); 
    } 


    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (resultCode == Activity.RESULT_OK){ 
      Uri targetUri = data.getData(); 
      picture_location = targetUri.toString(); 
      textTargetUri.setText(targetUri.toString()); 
      Bitmap bitmap; 
      try { 
       bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(targetUri)); 
       targetImage.setImageBitmap(bitmap); 
      } 
      catch (FileNotFoundException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

    }} 

順便說一句,你可能已經注意到,而不是在OnCreate後使用onRestoreInstanceState,我試圖用不同的方法。我從另一個問題找到了一個答案,你也可以在oncreate中實現它。我使用它,因爲每當我聲明函數onRestoreInstanceState我被要求刪除@Override註釋。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState){  
      image = savedInstanceState.getParcelable("BitmapImage"); 
      targetImage.setImageBitmap(image); 
      textTargetUri.setText(savedInstanceState.getString("path_to_picture")); 
    } 
+0

您是否想要在用戶返回時保存圖像? – 2014-08-29 14:26:56

+0

如果你想保留圖片,即使用戶離開應用程序,那麼你應該保存在'SharedPrefs'或DB的文件路徑。 – codeMagic 2014-08-29 14:29:31

回答

1

使用onSaveInstanceState和onCreate/onRestoreInstanceState用於短期活動狀態保存 - 但不用於持久存儲應用程序的數據。

你可以閱讀有關的onSaveInstanceState here

你可以閱讀有關持久性存儲here

codeMagic使用SharedPrefs(見持久存儲鏈接)爲您的長期持久性存儲建議。如果你想這樣做,我會建議在你的onActivityResult方法中保存圖像URI(鏈接有一個很好的例子),然後調用一個方法來讀取SharedPref並加載你可以調用的圖像onCreate以及onActivityResult。

您可能還希望將自己的圖像/位圖副本存儲在應用程序自己的內部存儲器中(請參閱持久存儲鏈接)。

1

如果你沒有完成的活動,您可以使用onSavedInstance()存儲picture_location值,並將其綁定回無論是從picture_locationonCreate(SavedInst)/onRestore()

0

如果位圖實例狀態不是建議的方式來保存所選圖像的信息。

您可以在這裏找到的解釋:Handling configuration Changes

我廣泛地在這裏的博客上講述它:Retain selected Image during Screen Rotation

下面我貼我的實現圖示的解決方案:

1 - 創建一個片段,並對其進行配置保留在內存中

import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 

public class ImageRetainingFragment extends Fragment { 
    private Bitmap selectedImage; 

    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain this fragment   
     setRetainInstance(true); 
} 

public void setImage(Bitmap selectedImage) { 
    this.selectedImage = selectedImage; 
} 

public Bitmap getImage() { 
    return this.selectedImage; 
} 
} 

2 - 在您的活動中使用它

private static final String FRAGMENT_NAME = "imageFragment"; 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    .... 

    initializeImageRetainingFragment(); 
    tryLoadImage(); 
} 


private void initializeImageRetainingFragment() { 
    // find the retained fragment on activity restarts  
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    this.imageRetainingFragment = (ImageRetainingFragment) fragmentManager.findFragmentByTag(FRAGMENT_NAME); 
    // create the fragment and bitmap the first time 
    if (this.imageRetainingFragment == null) { 
     this.imageRetainingFragment = new ImageRetainingFragment(); 
     fragmentManager.beginTransaction() 
     // Add a fragment to the activity state. 
     .add(this.imageRetainingFragment, FRAGMENT_NAME) 
     .commit(); 
    } 
} 
private void tryLoadImage() { 
    if (this.imageRetainingFragment == null) { 
     return; 
    } 

    Bitmap selectedImage = this.imageRetainingFragment.getImage(); 
     if (selectedImage == null) { 
     return; 
     } 

     ImageView selectedImageView = (ImageView)findViewById(R.id.selectedImage); 
     selectedImageView.setImageBitmap(selectedImage); 
} 
相關問題