升级 GeoQuiz 应用,展示更多的地理知识测试题目。
New → Kotlin Class/File (Data Class),kt数据类很方便,比起 java,省去了很多代码。
data class Question(@StringRes val textResId: Int, val answer: Boolean)
❝
MVC图解❞
❝
MVC数据控制流与用户交互❞
注意,模型对象与视图对象不直接交互。控制器作为它们之间的联系纽带,接收对象发送的消息,然后向其他对象发送操作指令。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/question_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="24dp"
tools:text="@string/question_australia" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/true_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/true_button" />
<Button
android:id="@+id/false_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/false_button" />
</LinearLayout>
<Button
android:id="@+id/next_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next_button" />
</LinearLayout>
string.xml
<resources>
<string name="app_name">GeoQuiz</string>
<string name="question_australia">Canberra is the capital of Australia.</string>
<string name="true_button">True</string>
<string name="false_button">False</string>
<string name="next_button">Next</string>
<string name="correct_toast">Correct!</string>
<string name="incorrect_toast">Incorrect!</string>
<string name="question_oceans">The Pacific Ocean is larger than the Atlantic Ocean.</string>
<string name="question_mideast">The Suez Canal connects the Red Sea and the Indian Ocean.</string>
<string name="question_africa">The source of the Nile River is in Egypt.</string>
<string name="question_americas">The Amazon River is the longest river in the Americas.</string>
<string name="question_asia">Lake Baikal is the world\'s oldest and deepest freshwater lake.</string>
</resources>
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var trueButton: Button
private lateinit var falseButton: Button
private lateinit var nextButton: Button
private lateinit var questionTextView: TextView
private val questionBank = listOf(
Question(R.string.question_australia, true),
Question(R.string.question_oceans, true),
Question(R.string.question_mideast, false),
Question(R.string.question_africa, false),
Question(R.string.question_americas, true),
Question(R.string.question_asia, true)
)
private var currentIndex = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
trueButton = findViewById(R.id.true_button)
falseButton = findViewById(R.id.false_button)
nextButton = findViewById(R.id.next_button)
questionTextView = findViewById(R.id.question_text_view)
trueButton.setOnClickListener { checkAnswer(true) }
falseButton.setOnClickListener { checkAnswer(false) }
nextButton.setOnClickListener {
currentIndex = (currentIndex + 1) % questionBank.size
updateQuestion()
}
updateQuestion()
}
/**
* 更新问题
*/
private fun updateQuestion() {
val questionTextResId = questionBank[currentIndex].textResId
questionTextView.setText(questionTextResId)
}
private fun checkAnswer(userAnswer: Boolean) {
val correctAnswer = questionBank[currentIndex].answer
val messageResId = if (userAnswer == correctAnswer) {
R.string.correct_toast
} else {
R.string.incorrect_toast
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
}
}
把图片资源放入 drawable 目录或者 mipmap 目录中,注意,文件名必须是小写字母且不能由任何空格符号。
将应用图标放在 mipmap 目录中!
要在密度不同的屏幕上保留界面的可见尺寸,您必须使用密度无关像素 (dp) 作为度量单位来设计界面。dp 是一个虚拟像素单位,1 dp 约等于中密度屏幕(160dpi;“基准”密度)上的 1 像素。对于其他每个密度,Android 会将此值转换为相应的实际像素数。
在定义文本大小时,您应改用可缩放像素 (sp) 作为单位(但切勿将 sp 用于布局尺寸)。默认情况下,sp 单位与 dp 大小相同,但它会根据用户的首选文本大小来调整大小。
Android 仅仅支持将 SVG 文件转换为 Android 的矢量图格式。
用真机测试安装应用,需要连接上真机噢。如果在Mac系统上开发,系统应该会立即识别出所有设备。如果是Windows系统,则可能要安装adb(Android Debug Bridger)驱动。
真机要打开USB调试模式:
当然,也可以用AS创建一个模拟器,去运行应用程序。
(单击应用的TextView文字区域,也可以跳转到下一道题)
questionTextView.setOnClickListener {
currentIndex = (currentIndex + 1) % questionBank.size
updateQuestion()
}
在 XML 中加个Button,用 LinearLayout 将 NEXT 和 PRE 按钮包裹起来,Acitvity 中拿到 PRE 按钮,再加个点击事件。
preButton.setOnClickListener {
currentIndex = (currentIndex + questionBank.size - 1) % questionBank.size
updateQuestion()
}
❝
1❞
将普通的 Button 替换成 ImageButton 即可,图片资源引用的话,用 src 。这里可为 ImageButton 添加android:contentDescription 属性,这样子,在用户点击图形按钮时,设备便会读出属性值的内容。
❝
2❞
❝
2❞
Demo 源码地址:https://github.com/visiongem/AndroidGuideApp