我有 MainActivity 從我開始 SecondActivity 的地方。
在那里,我從畫廊中選擇了一張圖片,我想把它推回 MainActivity。
主要活動:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
srButton = findViewById(R.id.super_resolution)
srButton.setOnClickListener { view: View ->
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
val bitmap = getIntent().getParcelableExtra<Bitmap>("bitmap")
第二活動:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_selected_image)
image = findViewById(R.id.the_selected_image);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
val permissions = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
requestPermissions(permissions, SelectedImage.PERMISSION_CODE)
} else {
chooseImageGallery()
}
} else {
chooseImageGallery()
}
}
// Receiver for camera
private val getResultCamera =
registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
if (it.resultCode == Activity.RESULT_OK) {
image.setImageURI(it.data?.data)
imageUri = it.data?.data as Uri
bitmap = uriToBitmap(imageUri!!)!!
image.setImageBitmap(bitmap)
val intent = Intent(this, MainActivity::class.java)
//intent.data = imageUri;
intent.putExtra("bitmap", bitmap)
startActivity(intent)
}
}
private fun chooseImageGallery() {
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
getResultCamera.launch(intent)
}
現在,我收到位圖的空值。
此外,當我從圖庫中選擇影像時,螢屏轉到 MainActivity,因此用戶看不到activity_selected_image布局(因此,影像)
uj5u.com熱心網友回復:
首先,如果您想將某些內容傳遞回第一個活動,則應該使用第二個活動setResult(),然后finish()將物件發送回現有的 MainActivity。你這樣做的方式是在堆疊上創建 MainActivity 的第二個副本。
其次,startActivity()呼叫是異步的。在您的 MainActivity 的單擊偵聽器中,當您呼叫 時startActivity(),它會將第二個活動排入佇列以在主執行緒上啟動,但它會首先完成已經在主執行緒上運行的代碼,即您的單擊偵聽器代碼的其余部分。因此,您的val bitmap行在第二個活動出現之前就被評估了。無論如何,您甚至無法保證在 SecondActivity 完成后將出現的 MainActivity 實體甚至與您開始使用的實體相同。作業系統在幾種型別的條件下自由地銷毀和重新生成 Activity 實體,其中一種是螢屏旋轉。
MainActivity 應該用于registerActivityForResult()啟動第二個活動并回應注冊合約中的結果。
class MainActivity: AppCompatActivity() {
private val getImageResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val bitmap = result.data?.getParcelableExtra<Bitmap>("bitmap")
if (bitmap != null) {
//...
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ...
srButton = findViewById(R.id.super_resolution)
srButton.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
getImageResult.launch(intent)
}
}
}
// In second activity:
// Receiver for camera
private val getResultCamera =
registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
if (it.resultCode == Activity.RESULT_OK) {
imageUri = it.data?.data as Uri
bitmap = uriToBitmap(imageUri!!)!!
val result = Intent()
intent.putExtra("bitmap", bitmap)
setResult(Activity.RESULT_OK, intent)
finish()
}
}
I took out the part about setting the bitmap to an ImageView in the second activity, because the second activity will be destroyed before it can be seen.
uj5u.com熱心網友回復:
活動二:
try {
//Write file
String filename = "bitmap.png";
FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
//Cleanup
stream.close();
bmp.recycle();
//Pop intent
Intent in1 = new Intent();
in1.putExtra("image", filename);
setResult(CODE,in1);
startActivity(in1);
} catch (Exception e) {
e.printStackTrace();
}
在活動 1 中,加載位圖:
Bitmap bmp = null;
String filename = getIntent().getStringExtra("image");
try {
FileInputStream is = this.openFileInput(filename);
bmp = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
更新活動 2
//Convert to byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent in1 = new Intent();
in1.putExtra("image",byteArray);
setResult(CODE,in1)
然后在活動 1 中:
byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/440837.html
上一篇:如何在Kotlin中重置亂數
