ActivityResultRegistry önerilen yaklaşımdır
ComponentActivity
artık + ve + akışlarını, yöntemlerinizde geçersiz kılmadan ActivityResultRegistry
ele 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()
Activity
Fragment
ActivityResultContract
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. takePicture
yalnızca boş bir Bitmap döndüren bir geri aramadır - boş olup olmadığı onActivityResult
işlemin başarılı olup olmadığına bağlıdır . prepareCall
daha sonra bu çağrıyı ComponentActivity
adlı 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.