美文网首页
Kotlin使用扩展函数简化findViewById事件

Kotlin使用扩展函数简化findViewById事件

作者: ModestStorm | 来源:发表于2022-09-27 11:28 被阅读0次

    1.android中调用

    public class MainJavaActivity extends Activity {    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {        
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView label = (TextView) findViewById(R.id.label);
            Button btn = (Button) findViewById(R.id.btn);
    
            label.setText("hello");
            label.setOnClickListener(new View.OnClickListener() {            
                @Override
                public void onClick(View v) {
                    Log.d("Glen","onClick TextView");
                }
            });
            btn.setOnClickListener(new View.OnClickListener(){           
                 @Override
                public void onClick(View v) {
                    Log.d("Glen","onClick Button");
                }
            });
        }
    

    2.kotlin中使用

    // Kotlin,没有了冗余的findViewById,我们可以直接对资源id进行操作,也不需要匿名内部类的声明,更关注函数的实现本身,抛弃了复杂的格式
    class MainKotlinActivity:Activity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            R.id.label.setText("hello")
            R.id.label.onClick { Log.d("Glen","onClick TextView") }
            R.id.btn.onClick { Log.d("Glen","onClick Button") }
        }
    }
    

    kotlin扩展函数使用

    我们考虑利用扩展函数结合泛型,避免频繁的类型转换,扩展函数定义如下:

    //kotlin
    fun <T : View> Activity.find(@IdRes id: Int): T {    
        return findViewById(id) as T
    }
    

    调用的时候如下:

    // Kotlin
        TextView label = find(R.id.label);
        Button btn = find(R.id.btn);
    

    只是我们还是需要获取到label,btn,这样无意义的中间变量,如果在Int类上扩展,可以直接对R.id.*操作,这样更直接,再结合高阶函数,函数定义如下:

    //Kotlin
    
    fun Int.setText(str:String){
        val label = find<TextView>(this).apply {
            text = str
        }
    }
    
    fun Int.onClick(click: ()->Unit){
        val tmp = find<View>(this).apply {
            setOnClickListener{
                click()
            }
        }
    }
    

    我们就可以这样调用:

    //Kotlin
    R.id.label.setText("hello")
    R.id.label.onClick { Log.d("Glen","onClick TextView") }
    R.id.btn.onClick { Log.d("Glen","onClick Button") }
    

    通常这些扩展函数可以放到基类中,根据扩展函数的作用域知识,我们可以在所有子类中都调用到这些方法,所以kotlin的Activity可以写成:

    // Kotlin
    class MainKotlinActivity:KotlinBaseActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            R.id.label.setText("hello")
            R.id.label.onClick { Log.d("Glen","onClick TextView") }
            R.id.btn.onClick { Log.d("Glen","onClick Button") }
        }
    }
    

    从原来JAVA冗余的20多行代码,精简到只需要3行代码,而且代码可读性更高,更加直观,这便是函数式编程语言Kotlin的强大威力。

    相关文章

      网友评论

          本文标题:Kotlin使用扩展函数简化findViewById事件

          本文链接:https://www.haomeiwen.com/subject/aphvortx.html