在我的android/java应用程序(个人使用)中,可以追溯到几年前,我不得不将许多startActivityForResult调用迁移到registerForActivityResult (图片库拾取、拍照、扫描仪等)。但是,尽管花了很多小时,我还是不能一个人做这件事。我还远远不是一个确定的开发人员,我迷失了方向。如果我能有一个工作的例子,我想我会设法调整它,但是即使是最简单的例子在我的上下文中也是行不通的。显然,我想避免过于深入的修改,我将无法实施.
以下是一个例子:
我有一个带有菜单的RanktActivity.java活动。该菜单中的一个选项(add)打开了一个弹出窗口(使用RangtInputDialog类),在其中我创建了一篇文章,并将图库中的图像关联起来(我通常会调整大小,然后保存)。下面是我试图尽可能简化的原始代码:
活性:
public class RangtActivity extends AppCompatActivity implements RangtCalls.CallbacksAll, RangtCalls.CallbacksDelete, RangtCalls.CallbacksAllImages,
ProductCalls.CallbacksAll, ProductCalls.CallbacksAllImages, SyncCalls.CallbacksUpload, SyncCalls.CallbacksDownload {
private RangtInputDialog mRangtInputDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initializations
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_add) {
mRangtInputDialog = new RangtInputDialog(this);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case Consts.RESULT_RANGT_REQUEST_GALLERY:
// image processing, resize, save...
break;
}
}
}
}类:
public class RangtInputDialog implements RangtCalls.CallbacksByTitle, RangtCalls.CallbacksCreate, RangtCalls.CallbacksUpdate {
private final Context mContext;
private AlertDialog mInputDialog;
private View mPromptsView;
public RangtInputDialog(Context context) {
mContext = context;
this.init();
}
private void init() {
LayoutInflater li = LayoutInflater.from(this.mContext);
mPromptsView = li.inflate(R.layout.text_input_rangt, nullParent);
final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this.mContext);
alertDialogBuilder.setView(mPromptsView);
final ImageButton imgButtonGal = mPromptsView.findViewById(R.id.addGal);
alertDialogBuilder
.setCancelable(false)
.setPositiveButton(android.R.string.ok, null)
.setNegativeButton(android.R.string.cancel,
(dialog, id) -> {
// some treatments
dialog.cancel();
});
this.mInputDialog = alertDialogBuilder.create();
// traitement imageButton Gallerie
imgButtonGal.setOnClickListener(view -> {
int resultCode = mEditMode ? Consts.RESULT_RANGT_EDIT_REQUEST_GALLERY : Consts.RESULT_RANGT_REQUEST_GALLERY;
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
((Activity) mContext).startActivityForResult(galleryIntent, resultCode);
});
init();
}
}我试着效仿https://apktutor.com/android-pick-image-and-display-in-imageview/,但是
我真的需要帮助,请尽可能详细,因为我已经用了15天了,我哪儿也找不到。
发布于 2022-08-07 20:15:18
一个解决办法不可能是:
public class RangtActivity extends AppCompatActivity {
private ActivityResultLauncher<String> mBackFunctionGallery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBackFunctionGallery = registerForActivityResult(new ActivityResultContracts.GetContent(),
new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri uri) {
...
}
});
if (id == R.id.action_add) {
mRangtInputDialog = new RangtInputDialog(this, mBackFunctionGallery);
return true;
}在RangtInputDialog类中,只需初始化:
public RangtInputDialog(Context context, ActivityResultLauncher<String> backFunctionGallerie
) {
mContext = context;
mBackFunctionGallery = backFunctionGallerie;
this.init();
}然后打电话:
imgButtonGal.setOnClickListener(view -> {
mBackFunctionGallery.launch("image/*");
}?这是一个清洁的解决方案,还是有更好的方法,应该避免?
https://stackoverflow.com/questions/73072829
复制相似问题