ActivityResultLauncher успешно запускает ActivityResultContracts в первый раз в AppCompatActivity, но вылетает во второй раз - PullRequest
1 голос
/ 13 июля 2020

Я использую новые функции androidx.activity:

activity_version = "1.2.0-alpha06"
implementation "androidx.activity:activity:$activity_version"

Предположим, что есть кнопка. Когда я щелкаю по нему, отображается каталог изображений, и я могу выбрать несколько изображений за раз. После подтверждения выбора я получаю список uris выбранных изображений. Код выглядит так:

package com.example.test_contracts;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button test_button=findViewById(R.id.test_button);
        test_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActivityResultContracts.GetMultipleContents contracts=new ActivityResultContracts.GetMultipleContents();

                ActivityResultLauncher<String> launcher=registerForActivityResult(contracts, new ActivityResultCallback<List<Uri>>() {
                    @Override
                    public void onActivityResult(List<Uri> result) {
                        //.....do something with the list of urls
                    }
                });

                launcher.launch("image/*");
            }
        });
    }
}  

Этот фрагмент кода отлично работает на фрагменте, но при запуске на AppCompatActivity происходят некоторые странные вещи, как я описываю в заголовке : в первый раз когда я нажимаю кнопку, появляется каталог изображений. После того, как я подтверждаю выбор, вернусь к предыдущему действию и снова нажмите кнопку, приложение немедленно обнаружит sh. В исключении говорится: java .lang.IllegalArgumentException: для requestCode можно использовать только младшие 16 бит.

Итак, я пытаюсь выяснить, почему это произошло. После установки множества точек останова я обнаружил, что когда я применяю этот фрагмент кода к AppCompatActivity, код запроса будет изначально установлен на 65535 в классе ActivityResultRegistry; И когда я снова запускаю действие, код запроса +1 и установлен на 65536, что приводит к исключению.

 private final AtomicInteger mNextRc = new AtomicInteger(0x0000ffff);

Так что я в основном знаю немного о причине. Но почему они установили такой большой код запроса? И как я могу решить эту проблему?

...