ActivityResultRegistry önerilen yaklaşımdır
ComponentActivityartık + ve + akışlarını, yöntemlerinizde geçersiz kılmadan ActivityResultRegistryele almanıza olanak tanıyan veya aracılığıyla daha fazla tür güvenliği sağlar ve bu akışları sınamak için kancalar sağlar. startActivityForResult()onActivityResult()requestPermissions()onRequestPermissionsResult()ActivityFragmentActivityResultContract
AndroidX Activity 1.2.0-alpha02 ve Fragment 1.3.0-alpha02'de sunulan Etkinlik Sonucu API'larının kullanılması önemle tavsiye edilir.
Bunu build.gradle
def activity_version = "1.2.0-alpha03"
// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"
Önceden oluşturulmuş sözleşme nasıl kullanılır?
Bu yeni API aşağıdaki önceden oluşturulmuş işlevlere sahiptir
- Video çek
- PickContact
- İçeriğe eriş
- GetContents
- OpenDocument
- opendocuments
- OpenDocumentTree
- CreateDocument
- tuşlamak
- Fotoğraf çek
- RequestPermission
- RequestPermissions
TakePicture sözleşmesini kullanan bir örnek:
private val takePicture = prepareCall(ActivityResultContracts.TakePicture())
{ bitmap: Bitmap? ->
// Do something with the Bitmap, if present
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener { takePicture() }
}
Peki burada neler oluyor? Hadi biraz parçalayalım. takePictureyalnızca boş bir Bitmap döndüren bir geri aramadır - boş olup olmadığı onActivityResultişlemin başarılı olup olmadığına bağlıdır . prepareCalldaha sonra bu çağrıyı ComponentActivityadlı yeni bir özelliğe kaydeder ActivityResultRegistry- buna daha sonra geri döneceğiz. ActivityResultContracts.TakePicture()Google'ın bizim için oluşturduğu yerleşik yardımcılardan biridir ve son olarak çağırmak takePicture, Niyeti daha önce yaptığınız şekilde tetikler Activity.startActivityForResult(intent, REQUEST_CODE).
Özel bir sözleşme nasıl yazılır?
Int'yi bir Girdi olarak alan ve Etkinlik'in sonuç Niyetinde döndürmesini isteyen bir Dize döndüren basit sözleşme.
class MyContract : ActivityResultContract<Int, String>() {
companion object {
const val ACTION = "com.myapp.action.MY_ACTION"
const val INPUT_INT = "input_int"
const val OUTPUT_STRING = "output_string"
}
override fun createIntent(input: Int): Intent {
return Intent(ACTION)
.apply { putExtra(INPUT_INT, input) }
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
return when (resultCode) {
Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
else -> null
}
}
}
class MyActivity : AppCompatActivity() {
private val myActionCall = prepareCall(MyContract()) { result ->
Log.i("MyActivity", "Obtained result: $result")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
button.setOnClickListener {
myActionCall(500)
}
}
}
Kontrol bu daha fazla bilgi için resmi belgeler.