类属性延迟初始化

在Android中声明UI类型变量,由于Kotlin的类型安全机制必须进行初始化,比如:

Java:

 1 public class TestActivity extends AppCompatActivity {
 2 
 3     private TextView mTvNmae;
 4 
 5     @Override
 6     protected void OnCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         mTvNmae = findViewById(R.id.name);
11     }
12 }

 

Kotlin:

解决方法1 初始化为Null:

 1 class MainActivity : AppCompatActivity() {
 2 
 3     private var mTvName: TextView? = null
 4 
 5     override fun onCreate(savedInstanceState: Bundle?) {
 6         super.onCreate(savedInstanceState)
 7         setContentView(R.layout.activity_main)
 8 
 9         mTvName = findViewById(R.id.name)
10     }
11 }

初始化问题解决了,但是使用上非常不友好。

 

解决方法2 延迟初始化:

 1 class MainActivity : AppCompatActivity() {
 2 
 3     private lateinit var mTvName: TextView
 4 
 5     override fun onCreate(savedInstanceState: Bundle?) {
 6         super.onCreate(savedInstanceState)
 7         setContentView(R.layout.activity_main)
 8 
 9         mTvName = findViewById(R.id.name)
10     }
11 }

这方式也解决了初始化问题,就是mTvName是一个可变类型变量,在初始化后基本上不会改变变量的赋值了。

 

解决方法3 延迟初始化 lazy (推荐方式):

 1 class MainActivity : AppCompatActivity() {
 2 
 3     private val mTvName: TextView by lazy {
 4         findViewById(R.id.name)
 5     }
 6 
 7     override fun onCreate(savedInstanceState: Bundle?) {
 8         super.onCreate(savedInstanceState)
 9         setContentView(R.layout.activity_main)
10     }
11 }

 

相关文章:

  • 2021-07-25
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
  • 2022-01-19
  • 2021-06-17
  • 2022-12-23
  • 2021-12-28
猜你喜欢
  • 2022-12-23
  • 2021-05-31
  • 2022-12-23
  • 2022-12-23
  • 2022-02-25
  • 2021-10-08
相关资源
相似解决方案