首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >startActivityForResult迁移,调用registerForActivityResult外部活动

startActivityForResult迁移,调用registerForActivityResult外部活动
EN

Stack Overflow用户
提问于 2022-07-21 21:26:27
回答 1查看 82关注 0票数 0

在我的android/java应用程序(个人使用)中,可以追溯到几年前,我不得不将许多startActivityForResult调用迁移到registerForActivityResult (图片库拾取、拍照、扫描仪等)。但是,尽管花了很多小时,我还是不能一个人做这件事。我还远远不是一个确定的开发人员,我迷失了方向。如果我能有一个工作的例子,我想我会设法调整它,但是即使是最简单的例子在我的上下文中也是行不通的。显然,我想避免过于深入的修改,我将无法实施.

以下是一个例子:

我有一个带有菜单的RanktActivity.java活动。该菜单中的一个选项(add)打开了一个弹出窗口(使用RangtInputDialog类),在其中我创建了一篇文章,并将图库中的图像关联起来(我通常会调整大小,然后保存)。下面是我试图尽可能简化的原始代码:

活性:

代码语言:javascript
复制
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;
            }
        }
    }
}

类:

代码语言:javascript
复制
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/,但是

  1. 如果我把"ActivityResultLauncher mGetContent=.“在活动的onCreate中,我不知道如何从RangtInputDialog类调用它。我尝试了((活动) mContext).mGetContent.launch("image/*");但是没有成功,如果我把它放在RangtInputDialog (无论如何,这在我看来是不可能的),registerForActivityResult就不会被识别,因为它不是一个活动。

我真的需要帮助,请尽可能详细,因为我已经用了15天了,我哪儿也找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-07 20:15:18

一个解决办法不可能是:

代码语言:javascript
复制
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类中,只需初始化:

代码语言:javascript
复制
public RangtInputDialog(Context context, ActivityResultLauncher<String> backFunctionGallerie
) {
    mContext = context;
    mBackFunctionGallery = backFunctionGallerie;
    this.init();
}

然后打电话:

代码语言:javascript
复制
    imgButtonGal.setOnClickListener(view -> {
        mBackFunctionGallery.launch("image/*");
    }

?这是一个清洁的解决方案,还是有更好的方法,应该避免?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73072829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档