android - 在这个递归方法中返回什么?
问题描述
我正在创建一种方法来递归View
搜索ArrayList
. 它将遍历这个ArrayList
,如果它包含 a ArrayList
,它也会搜索View
s ,依此类推,直到找到View
要返回的 a 。这样我就可以让View
里面的任何东西都看不见了。
fun searchForView(arrayList: ArrayList<*>): View {
arrayList.forEach { item ->
if (item is View) {
return item
} else if (item is ArrayList<*>) {
item.forEach {
searchForView(it as ArrayList<*>)
}
}
}
} // Error here, needs to return a View
所以我会这样使用它:
someArrayList.forEach {
searchForView(someArrayList).visibility = View.INVISIBLE
}
return someView
但是它给了我一个错误,因为在方法的末尾需要有一个声明。每当我调用它时,ArrayList
被搜索的总是会有一个View
. 那么我到底应该返回什么,知道View
找到的任何东西都会被归还?
解决方案
我以前也想做和你一样的事情,这就是我所做的
class VisibilitySwitcher(private val mutableViewSet: MutableSet<View?>, private val onCondition: Boolean = true){
fun betweenVisibleOrGone(){
if(onCondition)
mutableViewSet.forEach {
when (it?.visibility) {
View.VISIBLE -> {it.visibility = View.GONE}
View.GONE -> {it.visibility = View.VISIBLE}
}
}
}
fun betweenVisibleOrInvisible(){
if(onCondition)
mutableViewSet.forEach {
when (it?.visibility) {
View.VISIBLE -> {it.visibility = View.INVISIBLE}
View.INVISIBLE -> {it.visibility = View.VISIBLE}
}
}
}
fun betweenInVisibleOrGone(){
if(onCondition)
mutableViewSet.forEach {
when (it?.visibility) {
View.INVISIBLE -> {it.visibility = View.GONE}
View.GONE -> {it.visibility = View.INVISIBLE}
}
}
}
}
使用示例
class LoginActivity : BaseActivity() {
@Inject
@ViewModelInjection
lateinit var viewModel: LoginVM
private lateinit var mutableViewSet: MutableSet<View?>
override fun layoutRes() = R.layout.activity_login
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
facebookBtn.setOnClickListener { handleClickEvent(it) }
googleBtn.setOnClickListener { handleClickEvent(it) }
}
private fun handleClickEvent(view: View) {
when (view) {
facebookBtn -> { viewModel.smartLoginManager.onFacebookLoginClick() }
googleBtn -> { viewModel.smartLoginManager.onGoogleLoginClick() }
}
mutableViewSet = mutableSetOf(facebookBtn, googleBtn, progressBar)
VisibilitySwitcher(mutableViewSet).betweenVisibleOrGone() // <----- Use without Condition
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
VisibilitySwitcher(mutableViewSet, resultCode != -1).betweenVisibleOrGone() //<-- Use with Conditions
viewModel.smartLoginManager.onActivityResultCallBack(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}
关键是每当您从 facebook 或 google 按钮单击登录时,它将设置 facebook 和 google 的可见性消失并将进度条(进度条的默认值是 View.GONE)设置为可见
如果结果代码不是 -1,则在覆盖 fun onActivityResult() 时,这意味着它出现了一些错误或取消,因此它将切换回进度条消失并更改 facebook 和 google 按钮再次可见
如果您想修复自己的代码,我会这样做
fun searchForView(mutableViewSet: MutableSet<View?>){
mutableViewSet.forEach {
when (it?.visibility) {
View.VISIBLE -> {it.visibility = View.INVISIBLE}
View.INVISIBLE -> {it.visibility = View.VISIBLE} //<-- you can delete this if you don't want
}
}
}
或者很短的形式
fun searchForView(mutableViewSet: MutableSet<View?>) = mutableViewSet.forEach { when (it?.visibility) {View.VISIBLE -> it.visibility = View.INVISIBLE } }
用法
val mutableViewSet = mutableSetOf(your view1,2,3....)
searchForView(mutableViewSet)
如果它必须使用arrayList: ArrayList<*> 然后
fun searchForView(arrayList: ArrayList<*>) = arrayList.forEach{ if (it is View) it.visibility = View.INVISIBLE
推荐阅读
- compression - 用于压缩的二元决策图等工具
- excel - VBA,excel:删除/插入行,没有错误,没有结果
- c# - AddorUpdate 字典中的数据
- python - Pytest隐藏了一些参数值
- selenium-webdriver - selenium c# 边缘浏览器:'意外错误。未知错误'
- r - 将列添加到数据框中
- spring-boot - 使用接口投影方法名称呈现结果集列名称时出现问题 - 从多个表中获取多个列
- conda - conda 使用更新版本的 glibc
- python - 在python中根据名称和时间聚合数据
- css - 如何在浏览器中更改简单的长方形/线条的长度、粗细和曲率?