ImageView在屏幕旋转时无法保留图像

13
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    ImageView iv;
    Bitmap bTemp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




        Button cameraClick = (Button) findViewById(R.id.click);
        iv = (ImageView) findViewById(R.id.imageView1);

        final Bitmap data = (Bitmap) getLastNonConfigurationInstance();
        if (data == null) { 

           iv.setImageBitmap(bTemp);
        }


        cameraClick.setOnClickListener(myhandler);

    }


    OnClickListener myhandler = new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 0);
        }
      };


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Bitmap bm = (Bitmap) data.getExtras().get("data");
        iv.setImageBitmap(bm);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }




    @Override
    @Deprecated
    public Object onRetainNonConfigurationInstance() {
        bTemp = iv.getDrawingCache();
        return bTemp;
    }


}

我正在使用一个ImageView来存储通过相机意图捕获的图像,但当屏幕旋转时,图像会丢失。 我尝试使用onRetainNonConfigurationInstance(),但它不起作用。

而且我不想将该图像写入文件。


1
不要返回你甚至没有构建的DrawingCache(顺便说一下),而是返回Bitmap。 - Sherif elKhatib
你能详细解释一下吗? - oomkiller
请检查我发布的答案。 - Sherif elKhatib
6个回答

13

虽然这解决了我的问题,但其他因素如键盘出现等也可能导致问题。使用 '|' 运算符附加必要的条件(例如 android:configChanges="keyboard|orientation|screenSize")。 - Kewal Shah
感谢Kewal,键盘是一个重要的参数。已进行更新! - Bharath Kumar

6
这可能会对您有所帮助...
@Override
protected void onSaveInstanceState(Bundle outState) {
    BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
    Bitmap bitmap = drawable.getBitmap();
    outState.putParcelable("image", bitmap);
    super.onSaveInstanceState(outState);
}

protected void onCreate(Bundle savedInstanceState) {
     if(savedInstanceState != null) {
        Bitmap bitmap = savedInstanceState.getParcelable("image");
        imageView.setImageBitmap(bitmap);
     }
}

4
当屏幕旋转时,您的图像消失的原因是活动被销毁并重新创建。在此过程中,所选的图像未保留,您可以在这里阅读到相关信息。
注意:每次用户旋转屏幕时,系统都会销毁并重新创建前台活动,因为屏幕配置已更改,您的活动可能需要加载替代资源(如布局)。
如果要保留所选的图像,则不应使用实例状态,您可以在这里阅读到相关信息。
系统使用onSaveInstanceState()回调保存的Bundle不能携带大型对象(如位图),其中的数据必须进行序列化和反序列化,这可能会消耗大量内存并使配置更改变慢。在这种情况下,您可以通过在由于配置更改而重新启动您的活动时保留片段来减轻重新初始化活动的负担。此片段可以包含对要保留的有状态对象的引用。

我实现了这个解决方案,你可以在我回答此问题时找到代码。


0

只需在您的活动的清单文件中的活动标记中使用此代码

android:configChanges="orientation"

0

getLastNonConfigurationInstance() 返回一个活动实例。您可以从该实例中获取先前的值:

在您的 onCreate() 中:

YourActivity prevActivity = (YourActivity) getLastNonConfigurationInstance();

if(prevActivity!= null) { 
      this.bTemp = prevActivity.bTemp;
   }

而你的onRetainNonConfigurationInstance()方法应该是:

@Override
@Deprecated
public Object onRetainNonConfigurationInstance() {
    return bTemp;
}

而你的 'onActivityResult()` 方法应该是:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    bTemp = (Bitmap) data.getExtras().get("data");
    iv.setImageBitmap(bTemp);
}

抱歉,错过了一些前缀。现在请检查一下。你需要按照Sherif的说法返回位图。 - Anup Cowkur
获取一个转换异常 MainActivity prevActivity = (MainActivity) getLastNonConfigurationInstance();if(prevActivity!= null) { this.bTemp = (Bitmap)prevActivity.bTemp; iv.setImageBitmap(this.bTemp); } - oomkiller
这可能是因为你一开始就设置了bTemp。现在请检查更新后的代码。 - Anup Cowkur

0

不要返回你甚至没有构建的DrawingCache(顺便说一下),而是返回Bitmap


实现:

在您的onActivityResult中,将位图保留在bTemp中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    bTemp = (Bitmap) data.getExtras().get("data");
    iv.setImageBitmap(bTemp);

}

在您的配置保存中,保存此位图:
@Override
@Deprecated
public Object onRetainNonConfigurationInstance() {
    return bTemp;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接