onClick 中的第二个意图在第一个之前执行

Posted

技术标签:

【中文标题】onClick 中的第二个意图在第一个之前执行【英文标题】:Second intent in onClick is executed before first 【发布时间】:2018-12-03 11:26:19 【问题描述】:

我正在编写一个 android 应用程序并遇到了问题: 我需要从图库中选择一张图片,然后将其发送到其他活动(并转到该活动)。当我只有一个从图库中选择图像的意图时,它运行良好,打开图库,让您选择图像,然后什么也没有发生,很好。 但是当我添加另一个 Intent 去其他活动时,它会忽略第一个 Intent。

ImageButton gallery;

@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gallery = (ImageButton) findViewById(R.id.imageButton2);
        gallery.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);

                goToConfirmActivity();
            
        );
    
    public void goToConfirmActivity()
        Intent goToConfirmIntent = new Intent(MainActivity.this, confirmActivity.class);
        goToConfirmIntent.putExtra("image", uri);
        startActivity(goToConfirmIntent);
    

它直接转到confirmActivity,无需从图库中选择图片。我想知道如何解决这个问题。提前谢谢你。

【问题讨论】:

从结果中获取图片uri后覆盖onActivityResult然后调用goToConfirmActivity() 【参考方案1】:

您应该覆盖 onActivityResult,这样您就可以检查用户是否实际从图库中选择了图像,或者在打开图库后只是按下了返回按钮。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK)
        Uri uri= data.getData();
        goToConfirmActivity(uri);
     else 
        //Some error has occurred.
    

你的 goToConfirmActivity 方法应该是这样的:

void goToConfirmActivity(Uri uri)
    Intent goToConfirmIntent = new Intent(MainActivity.this, confirmActivity.class);
    goToConfirmIntent.putExtra("image", uri);
    startActivity(goToConfirmIntent);
 

【讨论】:

【参考方案2】:

您在启动Intent.ACTION_GET_CONTENT 后立即调用goToConfirmActivity();。由于获取内容的调用是异步的,控制将继续执行下一行。结果goToConfirmActivity(); 将被执行并启动下一个意图。为了避免这种覆盖onActivityResult如下

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == PICK_IMAGE_REQUEST)
        //You can get URI from intent data
        goToConfirmActivity();
    

【讨论】:

以上是关于onClick 中的第二个意图在第一个之前执行的主要内容,如果未能解决你的问题,请参考以下文章

将第二个功能添加到单个按钮

如何连续响应两列?在第一个文本中,在bootstrap 4中的第二个图像中

WIX React本机导航:堆栈中的第二个屏幕显示在第一个屏幕上

第二个 AJAX 调用中的函数发生在第一个 AJAX 调用之前

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个

放置在 tabcontrol 的第二个 tabitem 中的数据网格的 WPF-'Index out of Range' 错误(但如果放置在第一个 tabitem 中,它工作正常)