2

ユーザーがプロフィールに表示する写真を選択できるアプリを作成しようとしています。選択した画像を参照してイメージビューに設定できます。しかし、アクティビティが破棄されると、イメージは失われます。onSaveInstanceState を実装しようとしましたが、それでも同じです。正しく使えているか心配です。私のような初心者を助けていただければ幸いです。前もって感謝します。私が使用しているコードは次のとおりです。

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

4 に答える 4

1

onSaveInstanceState と onCreate/onRestoreInstanceState の使用は、アクティビティの状態を短期間保存するためのものですが、アプリケーションのデータを永続的に保存するために使用するものではありません。

ここでonSaveInstanceState について読むことができます

ここで永続ストレージについて読むことができます

codeMagic は、長期の永続ストレージに SharedPrefs (永続ストレージ リンクを参照) を使用することを提案しました。これを行いたい場合は、onActivityResult メソッドに画像 URI を保存することをお勧めします (リンクにはその方法の良い例があります)。次に、メソッドを呼び出して SharedPref を読み取り、呼び出すことができる画像を読み込みます。 onCreate および onActivityResult から。

画像/ビットマップの独自のコピーをアプリケーション独自の内部ストレージに保存することもできます (永続ストレージのリンクを参照)。

于 2014-08-29T15:02:54.407 に答える
1

アクティビティを終了していない場合は、 を使用onSavedInstance()して値を保存し、値内または値からpicture_locationバインドすることができます。onCreate(SavedInst)onRestore()picture_location

于 2014-08-29T14:49:17.457 に答える
0

Bitmaps Instance State の場合、選択した画像に関する情報を保持するための推奨される方法ではありません。

ここで説明を見つけることができます:構成変更の処理

私はここでそれについて広範囲にブログを書きました:画面の回転中に選択した画像を保持する

以下に、図示されたソリューションの実装を貼り付けます。

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);
}
于 2016-04-01T16:01:31.320 に答える