这是用kotlin写的,但我很确定它在java中几乎是一样的。
something.setOnClickListener {
availableReportRecycler.isActivated = !availableReportRecycler.isActivated
if (availableReportRecycler.isActivated) availableReportRecycler.visibility = View.VISIBLE
else availableReportRecycler.visibility = View.GONE
}
在kotlin / java中是否有办法简化此代码?
我觉得它应该能够将它减少到像(伪代码)那样的东西:
something.setOnClickListener {
availableReportRecycler.visibility =
{availableReportRecycler.isActivated = !self} ? View.VISIBLE:View.GONE
}
在没有找到任何相关的在线工作后,我已经强制使用各种组合,但仍无法使其工作。
你能做多么美好? 最佳答案是获得虚拟啤酒和“我没事”贴纸!
答案 0 :(得分:5)
所呈现的代码的主要部分远不是漂亮的是重复长availableReportRecycler
名称。将Kotlin标准库中的作用域函数with
与导入和if
表达式相结合,可以使这些代码更加清晰,而不会让它更难理解:
something.setOnClickListener {
with (availableReportRecycler) {
isActivated = !isActivated
visibility = if (isActivated) VISIBLE else GONE
}
}
您可以应用also
等进一步的作用域功能,以避免在第二个语句中重复isActivated
,但是,根据我的口味,它不会使这个特定代码更好。
答案 1 :(得分:1)
我认为Roman Elizarov有一个很好的方法。但是如果你想链接激活和可见性
您可能需要考虑覆盖struct Foo
{
struct namedStruct
{
int memb1, memb2;
};
static namedStruct namedStructObj;
struct
{
int memb1, memb2;
} unnamedStructObj;
};
Foo::namedStruct Foo::namedStructObj;
// The unnamed type doesn't seem to have a type you can write
,如下所示:
setActivated
这样,您可以将可见性链接到已激活的状态。你可以这样称呼它:
class AvailableReportRecycler(context: Context) : View(context) {
override fun setActivated(value : Boolean) {
super.setActivated(value)
visibility = if(value) View.VISIBLE else View.GONE
}
}
不是面向对象的美丽吗? :)