Android: 查看返回 null
Android: View returning null
我正在尝试获取联系人并将其显示在列表中。我为此使用 RxPermissions。这里的问题是当我第一次允许视图 returns null 的权限并显示空列表时,即使列表中有项目。但是当我回到之前的 activity 并回来时它工作正常。
ContactsFragment.kt
override fun onResume() {
super.onResume()
if (isPermissionGranted) {
Timber.d("Permission is granted")
contactsPresenter.fetchContacts(context)
noPermissionsWarning.visibility = View.GONE
} else {
noPermissionsWarning.visibility = View.VISIBLE
showContactList(ArrayList()) // Show empty list when permissions not granted
}
}
private fun askPermissions() {
rxPermissions
.request(android.Manifest.permission.GET_ACCOUNTS,
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS)
.subscribe { permissionGranted ->
isPermissionGranted = permissionGranted
}
}
override fun showContactList(selectedContacts: ArrayList<Contact>) {
contactAdapter = ContactListAdapter(selectedContacts, this, context)
val layoutManager = LinearLayoutManager(this.context)
contactsRecyclerView?.layoutManager = layoutManager
contactsRecyclerView?.addItemDecoration(DividerItemDecoration(
contactsRecyclerView?.context,
DividerItemDecoration.VERTICAL
))
contactsRecyclerView?.adapter = contactAdapter
}
ContactsPresenter.kt
override fun takeView(view: ContactsContract.View, context: Context?) {
super.takeView(view)
contactList.clear()
tempContactList.clear()
}
override fun fetchContacts(context: Context?) {
contactManager.getContacts(context)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
it.let {
tempContactList.addAll(it.sortedWith(compareBy { it.userName }))
contactList.addAll(it.sortedWith(compareBy { it.userName }))
view?.showContactList(contactList)// this view is null at first
}
}, {
}).addDisposableTo(disposable)
}
我会在这里遗漏什么。
谢谢
看起来你应该在这一行之后立即获取你的联系人:
isPermissionGranted = permissionGranted
我通过在 onResume()
和 onViewCreated()
中附加视图解决了这个问题。感谢大家的帮助
- 很长一段时间后,我发现我正在清理
onPause()
上的一次性用品,在我的情况下,这应该在 onDestroy()
内完成。我写了解决方案以防它对某些人有帮助
在检查是否授予权限时调用您的方法
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED) {
Filtering filtering=new Filtering();
//contactFetch method here
} else {
Permission.requestStoragePermission(MainActivity.this,
STORAGE_PERMISSION_CODE);
}
之后当你请求权限时......
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == STORAGE_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
Filtering filtering=new Filtering();
//Again your fetching method
} else {
Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
Permission.requestStoragePermission(MainActivity.this,
STORAGE_PERMISSION_CODE);
}
}
}
尝试这个我不确定,但我认为它会对你有所帮助
我正在尝试获取联系人并将其显示在列表中。我为此使用 RxPermissions。这里的问题是当我第一次允许视图 returns null 的权限并显示空列表时,即使列表中有项目。但是当我回到之前的 activity 并回来时它工作正常。
ContactsFragment.kt
override fun onResume() {
super.onResume()
if (isPermissionGranted) {
Timber.d("Permission is granted")
contactsPresenter.fetchContacts(context)
noPermissionsWarning.visibility = View.GONE
} else {
noPermissionsWarning.visibility = View.VISIBLE
showContactList(ArrayList()) // Show empty list when permissions not granted
}
}
private fun askPermissions() {
rxPermissions
.request(android.Manifest.permission.GET_ACCOUNTS,
android.Manifest.permission.READ_CONTACTS,
android.Manifest.permission.WRITE_CONTACTS)
.subscribe { permissionGranted ->
isPermissionGranted = permissionGranted
}
}
override fun showContactList(selectedContacts: ArrayList<Contact>) {
contactAdapter = ContactListAdapter(selectedContacts, this, context)
val layoutManager = LinearLayoutManager(this.context)
contactsRecyclerView?.layoutManager = layoutManager
contactsRecyclerView?.addItemDecoration(DividerItemDecoration(
contactsRecyclerView?.context,
DividerItemDecoration.VERTICAL
))
contactsRecyclerView?.adapter = contactAdapter
}
ContactsPresenter.kt
override fun takeView(view: ContactsContract.View, context: Context?) {
super.takeView(view)
contactList.clear()
tempContactList.clear()
}
override fun fetchContacts(context: Context?) {
contactManager.getContacts(context)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
it.let {
tempContactList.addAll(it.sortedWith(compareBy { it.userName }))
contactList.addAll(it.sortedWith(compareBy { it.userName }))
view?.showContactList(contactList)// this view is null at first
}
}, {
}).addDisposableTo(disposable)
}
我会在这里遗漏什么。
谢谢
看起来你应该在这一行之后立即获取你的联系人:
isPermissionGranted = permissionGranted
我通过在 onResume()
和 onViewCreated()
中附加视图解决了这个问题。感谢大家的帮助
- 很长一段时间后,我发现我正在清理
onPause()
上的一次性用品,在我的情况下,这应该在onDestroy()
内完成。我写了解决方案以防它对某些人有帮助
在检查是否授予权限时调用您的方法
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED) {
Filtering filtering=new Filtering();
//contactFetch method here
} else {
Permission.requestStoragePermission(MainActivity.this,
STORAGE_PERMISSION_CODE);
}
之后当你请求权限时......
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == STORAGE_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
Filtering filtering=new Filtering();
//Again your fetching method
} else {
Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
Permission.requestStoragePermission(MainActivity.this,
STORAGE_PERMISSION_CODE);
}
}
}
尝试这个我不确定,但我认为它会对你有所帮助