Android编程入门实例:从按钮点击到界面跳转,完整代码+避坑指南
你好呀,欢迎来到Android开发的世界。第一次动手写代码的时候,是不是总觉得哪里会出错?别慌,今天我们就从一个最简单的场景开始——点击一个按钮,跳到另一个界面。这个过程听起来简单,但里面藏着不少新手容易踩的坑。
第一个界面:让按钮”活”过来
想象你在做一个应用,首页有一个按钮,点击后跳转到设置页面。首先,你需要一个布局文件。在 res/layout 目录下创建 activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:background="#F5F5F5">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎学习Android开发"
android:textSize="24sp"
android:textColor="#333333"
android:layout_marginBottom="40dp"/>
<Button
android:id="@+id/btnJump"
android:layout_width="200dp"
android:layout_height="56dp"
android:text="点击跳转"
android:textSize="16sp"
android:background="#4CAF50"
android:textColor="#FFFFFF"
android:drawablePadding="8dp"/>
</LinearLayout>
这个布局里,最关键的是 android:id="@+id/btnJump"。这行代码给你的按钮起了一个名字,后面在代码里才能找到它。很多人第一次写代码时,就是忘了这个 id,结果程序一运行就崩溃——因为代码里找不到这个按钮。
MainActivity:让按钮点击产生反应
布局准备好了,现在轮到代码了。在 java/com.example.myapp 目录下创建 MainActivity.kt:
package com.example.myapp
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
// 在类成员变量里声明按钮,整个类都能用
private lateinit var btnJump: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 这一步千万别漏,告诉Activity要用哪个布局文件
setContentView(R.layout.activity_main)
// 通过id找到按钮
btnJump = findViewById(R.id.btnJump)
// 给按钮设置点击监听器
btnJump.setOnClickListener {
// 创建一个Intent,告诉系统"我要跳到第二个界面"
val intent = Intent(this, SecondActivity::class.java)
// 顺便传点数据过去(可选)
intent.putExtra("username", "小明")
intent.putExtra("age", 18)
// 启动跳转
startActivity(intent)
}
}
}
这里的逻辑其实很简单:找到按钮 → 监听点击 → 创建Intent → 启动界面。但每一步都有讲究。
第二个界面:准备好”接住”数据
点击跳转后,需要有一个界面来接收。创建 SecondActivity.kt:
package com.example.myapp
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val tvResult = findViewById<TextView>(R.id.tvResult)
// 从Intent里取数据,有默认值保护,不会崩
val username = intent.getStringExtra("username") ?: "未知用户"
val age = intent.getIntExtra("age", 0)
tvResult.text = "你好,$username!你今年 $age 岁了。"
}
}
对应的布局 activity_second.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:background="#E8F5E9">
<TextView
android:id="@+id/tvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#333333"/>
</LinearLayout>
AndroidManifest.xml:别忘了给Activity”上户口”
这一步是新手最容易忽略的。每一个Activity都必须在这个文件里注册,否则系统根本不知道这个界面的存在。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<!-- 第一个Activity,作为启动页面 -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 第二个Activity,必须注册! -->
<activity android:name=".SecondActivity" />
</application>
</manifest>
注意看 SecondActivity 那行,少一个 / 都不行。这是XML的写法,每个标签都要闭合。很多新手就是在这里漏掉了注册,然后程序一启动就报错。
常见问题:这些地方最容易踩坑
1. “找不到符号”——按钮id写错了
如果你在主代码里写了 R.id.btnJump,但布局文件里写的是 btn_jump,编译时会直接报错。Android的id是通过下划线分隔单词的,这是自动转换的规则。按钮 btnJump → id 是 btn_jump。这是一个容易混淆的点。
2. “Application has stopped”——Activity没注册
程序一运行就崩溃,日志里会出现类似这样的错误:
android.content.ActivityNotFoundException: Unable to find explicit activity class
99%的原因就是忘记在Manifest里注册SecondActivity。检查一下,是不是少了那行 <activity android:name=".SecondActivity" />。
3. 数据传递后取不到值
如果你在主界面写了 intent.putExtra("username", "小明"),但在第二个界面用 intent.getStringExtra("key") 去取,就会得到null。原因就是key名字对不上。字符串必须完全一致,包括大小写。建议把key定义成常量:
companion object {
const val KEY_USERNAME = "username"
const val KEY_AGE = "age"
}
两个Activity共用这些常量,就不会出错了。
4. NullPointerException——lateinit没有初始化
代码里用了 private lateinit var btnJump: Button,但如果 setContentView() 放在了 findViewById() 之后,就会崩。记住这个顺序:先设布局,再找控件。
5. 页面跳转后按返回键,数据没了
这是因为每次重新进入Main界面,都会创建新的Activity实例。如果想在跳转之间保持数据,可以考虑用 ViewModel 或者把数据存在 SharedPreferences 里。这对新手来说稍微进阶了一点,但了解一下也好。
进阶一点:用Kotlin的扩展函数让代码更简洁
等你对基础熟悉之后,可以尝试这种写法,代码会更清爽:
// 创建一个通用的跳转工具函数
fun Activity.jumpToSecondActivity(username: String, age: Int) {
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("username", username)
putExtra("age", age)
}
startActivity(intent)
}
// 在MainActivity里这样调用
btnJump.setOnClickListener {
jumpToSecondActivity("小明", 18)
}
这样重复的跳转逻辑就不会散落在各个Activity里了。
一个小建议:学会看Logcat
当你遇到崩溃时,不要慌。Android Studio底部的Logcat窗口会告诉你错误在哪里。最常见的几个关键词要记住:
- ActivityNotFoundException——Activity没注册
- NullPointerException——变量为空,通常是findViewById没找到控件
- IllegalStateException——组件状态不对,比如重复添加了同一个布局
把这些关键词保存下来,遇到报错时搜索一下,大部分问题都能找到答案。
从按钮点击到界面跳转,看起来是一个小小的功能,但它涵盖了Android开发中最核心的几个概念:布局、控件、Intent、Activity管理、数据传递。把这些搞清楚了,后面的导航、网络请求、数据库操作都会顺畅很多。
别怕犯错,每个开发者都是从”为什么又崩了”开始的。多写、多试、多看日志,慢慢就熟练了。祝你写代码愉快 🚀
