本文是学习youtube上Android Studio教程一个手机编程案例的实践。
一个简单的android程序,实现简单的摇骰子,只有一个按钮。
版本为Android Studio Hedgehog 2023。
原教程视频链接如下:
https://www.youtube.com/watch?v=B0hYgONuh4g&list=PLsEC4qT8YxBLvNJBs1a_hHd2iwSrHieKu&index=4
1. 创建一个新的项目
项目名为Dice Roller, 语言为kotlin, 选择合适的仿真设备。
2 编译后成功,初步演示
编译成功
主活动布局文件activity_main.xml
这里看到只有一个TextView,在屏幕中间显示Hello World!
主活动程序MainActivity.kt
MainActivity()类中OnCreate()方法启动函数SetContentView(),载入资源(res)文件包中的主活动布局文件activity_main.xml。
编辑主活动布局文件,拖动一个按钮button到中间。
TextView和Button是ConstraintLayout子项,可以在Attributes中调节按钮水平和垂直方向上的约束。
使用硬式码字串(HardCoded Text)存在告警
硬编码的字符串按钮,应该使用@字符串资源
直接在布局文件中硬编码文本属性是不好的,原因有几个:
- 在创建配置变体(例如横向或纵向)时,必须重复实际文本(并在进行更改时保持最新状态)
- 不能仅通过为现有的字符串资源添加新的翻译来将应用程序翻译为其他语言。有一些快速修复程序可以自动将这个硬编码的字符串提取到资源查找中。
使用quick-Fixes进行修正。
写入按钮的文本,ROLL。
改变TextView文字的大小,选中 Hello Word,在attributes中搜索textsize,由14sp改为34sp,在Common Attributes清空文字,工具文字为“1”。
可以在activity_main.xml中看到TextView的如下变化。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="34sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="1" />
工具文字是为开发人员使用的,“1”不会显示到画面中。
3. 设计主活动程序,按ROLL,在其上部出现1~6随机数字。
在主活动程序MainActiivity.kt中增加代码,使用findViewByID找到Button的ID, 调用按钮的点击监听方法setOnClickListener(),采用Lambda表达式,设计骰子的蓝图类Dice() ,在TextView“1”的地方显示1~6的随机数。
修改后的MainActiivity.kt文件如下。
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import org.w3c.dom.Text
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//本案例中使用findViewById找到ui
/* Android 会自动将ID号码指派给应用程序的资源
资源ID的形式为R.<type>.<name>
对于View的ID <type>为id, 例如R.id.button
*
*/
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
//建立新的Dice物件执行个体
val dice = Dice(6)
val diceRoll = dice.roll()
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = diceRoll.toString()
}
}
}
/*
*骰子蓝图 Class Dice
* 具有滚动的功能 fun roll()
*/
class Dice(val numSides: Int) {
fun roll(): Int{
return (1..numSides).random()
}
}
运行后的效果:
调用Toast.makeText()方法即可建立内含文字“Dice Roller!"的Toast, 建立新的Dice物件执行函数diceroll()
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import org.w3c.dom.Text
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//本案例中使用findViewById找到ui
/* Android 会自动将ID号码指派给应用程序的资源
资源ID的形式为R.<type>.<name>
对于View的ID <type>为id, 例如R.id.button
*
*/
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
//调用Toast.makeText()即可建立内含文字“Dice Roller!"的Toast
Toast.makeText(this,"Dice Roller!",Toast.LENGTH_LONG).show()
rollDice() //执行滚动功能
}
}
private fun rollDice(){
//建立新的Dice物件执行函数
val dice = Dice(6)
val diceRoll = dice.roll()
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = diceRoll.toString()
}
}
/*
*骰子蓝图 Class Dice
* 具有滚动的功能 fun roll()
*/
class Dice(val numSides: Int) {
fun roll(): Int{
return (1..numSides).random()
}
}
运行后的效果: