Android编程实例教程手把手教你实现按钮点击界面跳转功能及常见报错解决方法

嘿,朋友!今天咱们来聊聊Android开发里最基础也最重要的技能——按钮点击跳转页面。相信我,这篇文章我会用最接地气的方式写出来,保证你看完就能上手,遇到报错也不怕。


一、为什么从按钮跳转开始学?

刚开始学Android的时候,很多人一头雾水:界面在哪里?代码在哪里?怎么点一下按钮就能跳到另一个页面?别急,这就是我今天要帮你的地方。

按钮跳转其实是Android开发的”Hello World”进阶版——学会了这个,后面的列表、网络请求、数据库操作都会变得容易很多。咱们一步步来,我会用大白话给你讲清楚。


二、准备工作:你需要知道什么?

在动手之前,先了解一下我们即将用到的几个核心概念:

概念 大白话解释
Activity 一个屏幕/页面,比如首页、登录页、设置页
Intent 一个”传话员”,负责告诉系统你要跳转到哪个页面,顺便还能带上点东西
Button 就是屏幕上那个可以点击的按钮
XML 用来画界面的”图纸”,决定按钮长什么样、放哪里
Java/Kotlin 用来写逻辑的代码语言

💡 小提示:现在Android官方推荐用 Kotlin,但很多教程还在用 Java。这篇文章两种语言都会覆盖,你选自己熟悉的就行。


三、从头搭建:新建一个Android项目

第一步:打开Android Studio

如果你还没安装,去官网 developer.android.com 下载,安装过程比较简单,一路”Next”就行。安装完后打开,你会看到这样一个界面:

点击 “New Project”(新建项目)。

第二步:选择项目模板

在模板选择界面,选 “Empty Activity”(空Activity),这个最干净,适合新手。然后点 “Next”

接下来会看到几个设置项:

  • Name:起个名字,比如 ButtonJumpDemo
  • Package name:包名,比如 com.example.buttonjumpdemo
  • Save location:项目保存位置,选你想放的地方
  • Language选 Kotlin(推荐)或 Java
  • Minimum SDK:选 API 24 就够了,覆盖95%以上的安卓设备

最后点 “Finish”,等待Android Studio加载完成(第一次可能有点慢,喝杯咖啡☕)。


四、画界面:用XML写按钮

项目创建好后,打开 res/layout/activity_main.xml

Android Studio有两种视图模式:

  • Design:拖拽式可视化设计
  • Code:直接写XML代码

建议新手先用 Code 模式,这样看得更清楚。把里面的内容替换成:

Kotlin版本 — 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:padding="24dp"
    android:background="#F5F5F5">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="欢迎来到首页"
        android:textSize="24sp"
        android:textStyle="bold"
        android:textColor="#333333"
        android:layout_marginBottom="40dp"/>

    <Button
        android:id="@+id/btnJump"
        android:layout_width="200dp"
        android:layout_height="56dp"
        android:text="点我跳转"
        android:textSize="18sp"
        android:backgroundTint="#4CAF50"
        android:textColor="#FFFFFF"
        android:cornerRadius="8dp"/>

</LinearLayout>

Java版本 — activity_main.xml(完全一样)

XML文件跟语言无关,Kotlin和Java用的是同一套界面代码。

代码解读

让我一句一句解释给你听:

  • LinearLayout:一种布局方式,orientation="vertical" 表示里面的东西从上往下排。
  • android:gravity="center":内容在父布局中间对齐,按钮就会居中显示。
  • android:layout_width="match_parent":宽度填满屏幕。
  • android:layout_height="wrap_content":高度跟着内容走,内容多就多,内容少就少。
  • android:id="@+id/btnJump":给按钮起个”身份证”,后面Java/Kotlin代码里要用这个名字来找到它。@+id/ 表示”新建一个ID叫btnJump”。
  • android:backgroundTint="#4CAF50":按钮背景色,绿色。

五、创建第二个页面(目标Activity)

跳转到新页面之前,得先有新页面呀!

方法:右键点击 java/com.example.buttonjumpdemo 包 → New → Activity → Empty Activity

命名为 SecondActivity,语言保持跟主Activity一致。

创建好后,打开 res/layout/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:padding="24dp"
    android:background="#E3F2FD">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="成功跳转到第二页!🎉"
        android:textSize="22sp"
        android:textStyle="bold"
        android:textColor="#1565C0"
        android:layout_marginBottom="30dp"/>

    <Button
        android:id="@+id/btnBack"
        android:layout_width="200dp"
        android:layout_height="56dp"
        android:text="返回上一页"
        android:textSize="18sp"
        android:backgroundTint="#1976D2"
        android:textColor="#FFFFFF"/>

</LinearLayout>

现在你有两个页面了:

  • MainActivity → 首页,有按钮
  • SecondActivity → 第二页,有返回按钮

六、写核心逻辑:让按钮点击跳转

Kotlin版本 — MainActivity.kt

package com.example.buttonjumpdemo

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 通过ID找到按钮
        val btnJump = findViewById<Button>(R.id.btnJump)

        // 给按钮设置点击监听器
        btnJump.setOnClickListener {
            // 创建Intent,告诉系统:我要跳到SecondActivity
            val intent = Intent(this, SecondActivity::class.java)
            // 执行跳转
            startActivity(intent)
        }
    }
}

Java版本 — MainActivity.java

package com.example.buttonjumpdemo;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 通过ID找到按钮
        Button btnJump = findViewById(R.id.btnJump);

        // 给按钮设置点击监听器
        btnJump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建Intent,告诉系统:我要跳到SecondActivity
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                // 执行跳转
                startActivity(intent);
            }
        });
    }
}

代码逐行拆解

让我用大白话再讲一遍上面的代码:

setContentView(R.layout.activity_main);

这行意思是:把咱们刚才画的界面展示给用户看。没有这行,屏幕上什么都不会有。

val btnJump = findViewById<Button>(R.id.btnJump)

这行意思是:找到界面上那个ID叫”btnJump”的按钮,存到一个变量里,方便后面操作。

btnJump.setOnClickListener { ... }

这行意思是:告诉系统,当有人点击这个按钮时,执行大括号里的代码。这是整个跳转的核心。

val intent = Intent(this, SecondActivity::class.java)

这行是最关键的一行Intent 就像送信员,它说:”嘿系统,请帮我把用户带到 SecondActivity 去!”

  • this 表示当前的Activity(主页面)
  • SecondActivity::class.java 表示目标页面
startActivity(intent)

这行意思是:让系统执行刚才的”送信”请求,跳转到目标页面。


七、传递数据:跳转时顺便带点东西

有时候你跳转的时候,想顺便把一些数据带给第二个页面。比如用户输入了名字,跳过去后显示”你好,XXX”。

Kotlin版本 — 发送数据

btnJump.setOnClickListener {
    val intent = Intent(this, SecondActivity::class.java)
    
    // 用 putExtra() 带上数据,键值对形式
    intent.putExtra("username", "小明")
    intent.putExtra("age", 18)
    
    startActivity(intent)
}

Kotlin版本 — 接收数据(SecondActivity.kt)

package com.example.buttonjumpdemo

import android.os.Bundle
import android.widget.Button
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)

        // 接收从MainActivity传来的数据
        val username = intent.getStringExtra("username") ?: "未知用户"
        val age = intent.getIntExtra("age", 0)

        // 把数据展示出来
        val tvMessage = findViewById<TextView>(R.id.tvMessage)
        tvMessage.text = "你好,$username!你今年 $age 岁"

        // 返回按钮
        val btnBack = findViewById<Button>(R.id.btnBack)
        btnBack.setOnClickListener {
            finish() // 关闭当前页面,回到上一页
        }
    }
}

⚠️ 注意:第二页的XML里需要加一个TextView,ID设为 tvMessage,用来显示接收到的数据。


八、返回上一页的方法

在第二页,返回上一页有两种常见做法:

方法一:用 finish()

btnBack.setOnClickListener {
    finish() // 直接关闭当前页面
}

方法二:用 Intent 跳转回去

btnBack.setOnClickListener {
    val intent = Intent(this, MainActivity::class.java)
    startActivity(intent)
}

区别在哪?

  • finish() 会把这个页面从任务栈里”删掉”,按手机返回键也回不来了。
  • 用Intent跳回去,页面还留在栈里,按返回键还能回到第二页。

一般做返回按钮用 finish() 就够了,简单粗暴。


九、常见报错及解决方法

这部分超级重要!新手99%都会遇到这些问题,我一一给你列出来。

❌ 报错1:ActivityNotFoundException — “找不到目标Activity”

错误信息:

ActivityNotFoundException: Unable to find explicit activity class

原因: 你没有在 AndroidManifest.xml 里注册 SecondActivity。

解决方法: 打开 app/manifests/AndroidManifest.xml,检查里面有没有这一行:

<activity android:name=".SecondActivity" />

如果没有,手动加上:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.buttonjumpdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.ButtonJumpDemo">

        <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 android:name=".SecondActivity" />

    </application>

</manifest>

🔑 记住:每一个Activity都必须在Manifest里注册,否则系统不认识它。


❌ 报错2:findViewById returned null — 找不到视图

错误信息:

NullPointerException: view.findViewById(...) returned null

原因: 你用了错误的布局文件,或者ID写错了。

排查步骤:

  1. 检查 setContentView 用的是哪个布局
setContentView(R.layout.activity_main) // 确认这里没错
  1. 检查ID是否拼写一致
  • XML里写的是 btnJump
  • 代码里也是 R.id.btnJump
  • 两者必须完全一致,大小写都要对
  1. 检查你找视图的Activity和布局是否对应
  • 如果你在 SecondActivity 里找 R.id.btnJump,当然找不到,因为那个按钮在 MainActivity 的布局里

❌ 报错3:android:exported 警告(API 31+)

错误信息:

Attribute android:exported is required for activities

原因: Android 12(API 31)及以上要求所有Activity都声明 android:exported 属性。

解决方法:AndroidManifest.xml<activity> 标签里加上 android:exported

<activity android:name=".MainActivity" android:exported="true">
    ...
</activity>

<activity android:name=".SecondActivity" android:exported="false" />
  • exported="true":表示这个Activity可以被其他应用打开(通常是启动页)
  • exported="false":表示只能被本应用内部使用(第二页一般用这个)

❌ 报错4:跳转了但页面空白/崩溃

可能原因A:第二个Activity没有调用 setContentView()

// 正确写法
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second) // 这行必须有!
        ...
    }
}

可能原因B:XML布局文件放错位置了

确保 activity_second.xmlres/layout/ 目录下,路径是:

app/src/main/res/layout/activity_second.xml

❌ 报错5:startActivityForResult 已弃用警告

原因: 老版本的教程还在用 startActivityForResult,但Android现在推荐用新的回调方式。

Kotlin 新写法(推荐):

// 注册回调
val getActivityResult = registerActivityResult<ActivityResultContracts.StartActivityForResult>()

// 发起跳转
getActivityResult.launch(Intent(this, SecondActivity::class.java))

// 处理返回结果
getActivityResult.register { result ->
    if (result.resultCode == RESULT_OK) {
        val data = result.data
        // 处理数据...
    }
}

❌ 报错6:编译报错 Unresolved reference: R

原因: R文件没有自动生成。

解决方法:

  1. 点击菜单 Build → Clean Project
  2. 然后点击 Build → Rebuild Project
  3. 如果还不行,检查你的 XML 文件里有没有拼写错误(比如标签没闭合)

十、进阶:带返回结果的跳转

有时候第二个页面不只要展示数据,还要把结果带回来。比如选颜色、选日期之类的。

Kotlin完整示例

// ===== MainActivity.kt =====
package com.example.buttonjumpdemo

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    // 定义一个请求码,用于识别是哪个请求的返回结果
    private val REQUEST_CODE = 1001

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnJump = findViewById<Button>(R.id.btnJump)
        val tvResult = findViewById<TextView>(R.id.tvResult)

        btnJump.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("question", "你最喜欢的颜色是?")
            // 使用带回调的跳转方式
            startActivityForResult(intent, REQUEST_CODE)
        }
    }

    // 重写 onActivityResult 接收返回结果
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            // 拿到从第二页传回来的数据
            val color = data?.getStringExtra("selectedColor") ?: "未选择"
            val tvResult = findViewById<TextView>(R.id.tvResult)
            tvResult.text = "你选择了:$color"
        }
    }
}
// ===== SecondActivity.kt =====
package com.example.buttonjumpdemo

import android.content.Intent
import android.os.Bundle
import android.widget.Button
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 question = intent.getStringExtra("question")
        val tvQuestion = findViewById<TextView>(R.id.tvQuestion)
        tvQuestion.text = question ?: "请选择颜色"

        val btnRed = findViewById<Button>(R.id.btnRed)
        val btnBlue = findViewById<Button>(R.id.btnBlue)

        btnRed.setOnClickListener {
            sendResult("红色")
        }
        btnBlue.setOnClickListener {
            sendResult("蓝色")
        }
    }

    private fun sendResult(color: String) {
        val intent = Intent()
        intent.putExtra("selectedColor", color)
        setResult(RESULT_OK, intent)
        finish() // 关闭页面,返回结果给上一页
    }
}

十一、常见坑总结(避坑指南)

我把新手最容易踩的坑汇总一下,建议收藏:

原因 解决办法
跳转后崩溃 Activity未注册到Manifest 检查AndroidManifest.xml
findViewById返回null ID不匹配或布局不对 检查拼写和setContentView
页面空白 没调用setContentView 加上setContentView()
编译报R找不到 XML有错误导致R文件未生成 检查XML语法错误
exported警告 API 31+要求声明exported 加上android:exported属性
点击按钮没反应 没设置监听器或ID写错 检查setOnClickListener和ID
返回键无法回退 用了finish() 改用Intent跳转或不调用finish

十二、完整项目结构参考

app/src/main/
├── java/com/example/buttonjumpdemo/
│   ├── MainActivity.kt      ← 主页面逻辑
│   └── SecondActivity.kt    ← 第二页逻辑
├── res/
│   ├── layout/
│   │   ├── activity_main.xml     ← 主页面界面
│   │   └── activity_second.xml   ← 第二页界面
│   └── values/
│       ├── colors.xml
│       ├── strings.xml
│       └── themes.xml
└── AndroidManifest.xml          ← 必须注册所有Activity!

写在最后

按钮跳转看起来简单,但它其实是Android开发的基石。你现在掌握了:

  1. ✅ 如何创建多页面项目
  2. ✅ 如何用XML画界面
  3. ✅ 如何用Intent实现页面跳转
  4. ✅ 如何在页面之间传递数据
  5. ✅ 如何处理返回结果
  6. ✅ 最常见的6种报错及其解法

下一步建议:

  • 把这个demo跑起来,亲手改改代码,看看效果
  • 试试加第三个页面,练手
  • 学习一下Fragment,它和Activity的关系很类似,但更灵活

开发这件事,看得懂代码 ≠ 会写代码。一定要自己动手敲,遇到报错别慌,把错误信息复制到搜索引擎,99%的问题别人都遇到过。

加油!有问题随时来问我 😊