Я использую новые функции 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);
Так что я в основном знаю немного о причине. Но почему они установили такой большой код запроса? И как я могу решить эту проблему?