Android入门实验报告:环境搭建、Activity跳转与UI布局实战

发布时间:2026/11/4 21:40:19

Android入门实验报告:环境搭建、Activity跳转与UI布局实战 简介面向软件学院《移动应用软件开发技术》课程的实验报告文档围绕 Android 平台开发的基础实践展开适合刚接触移动应用开发、需按实验流程完成环境配置与入门练习的本科生对照使用。内容按实验项目组织实验一梳理 Android 系统环境搭建涵盖 JDK 6.0 以上版本的安装与 JAVA_HOME 环境变量配置、Eclipse IDE for Java EE Developers 的解压与启动验证、Android SDK 在线更新与离线安装两种方式及 ADT 插件安装后续实验延伸到 Activity 的创建、启动、生命周期管理与 Intent 跳转并分两部分讲解 TextView、Button、ImageView 等基础控件与 LinearLayout、RelativeLayout、GridLayout 等布局管理器的用法。压缩包含 1 个 doc 文件约 1.63MB保留实验目的、内容原理、截图占位与结果记录要求便于对照实验思路与报告排版。已有 768 人学习。1. 从一份实验报告说起三个实验串起 Android 入门的完整链路移动应用软件开发技术这门课的实验报告常见的交法是四个实验各截几张图拼成一份文档装环境、点按钮跳页面、拖几个控件、弹一个对话框。交上去能过但答辩时被问一句“从 A 页面跳到 B 页面再返回生命周期走了哪几步”很多人就答不上来。问题不在截图数量而在于这份报告本来应该把 Android 入门的三条主线——环境链路、组件跳转、界面组织——按可验证的顺序串起来结果被拆成了互不相干的练习。下面按实验真实顺序展开把每一步的安装顺序、源码结构、布局拆解和验收点都落到能直接对照的细节上适合要交课程设计、实验报告或准备入门答辩的人拿去改。2. 开发环境搭建JDK、Eclipse、SDK、ADT 四件套的安装顺序与验证点环境搭建这一步看起来最没技术含量实际上是最容易卡住半天的地方。实验一要求装 JDK 6.0 以上、Eclipse、Android SDK 和 ADT 四样东西很多人拿到清单就开始装装到一半 Eclipse 双击没反应回头才发现 JDK 没配好。这一章把四个组件的依赖关系、每条命令的含义和每一步的验证点讲清楚照着走基本不会返工。2.1 为什么安装顺序不能乱这四个组件是一条单向依赖链JDK 提供 javac 和 java 两个命令Eclipse 本身是 Java 程序启动时先找 JRE找不到就直接退出Android SDK 里的 SDK Manager 是一个 Java 写的图形工具同样依赖 JDKADT 是 Eclipse 插件必须装在一个能正常启动的 Eclipse 上ADT 装完之后还要手动把 SDK 的根目录指给它整条链才算闭合。所以正确顺序是 JDK → 配置环境变量 → Eclipse → SDK → ADT → 绑定 SDK 路径。反过来先装 Eclipse 再装 JDK 的启动时经常弹一个 “Failed to load the JNI shared library”本质是 Eclipse 按自己找到的 JRE 版本去加载 64 位或 32 位的 jvm.dll位数对不上。实验环境里的 Windows 7 笔记本是 32 位系统配 32 位 JDK 和 32 位 Eclipse这条链才顺。我一般会在装之前先确认三件事系统位数、JDK 安装路径里有没有空格或中文、Eclipse 压缩包解压到哪个盘。路径带中文在 Windows 上不一定立刻出问题但 SDK Manager 下载组件时偶发写入失败排查起来就是黑匣子不如一开始就避开。2.2 环境变量配置与 test.java 冒烟测试JDK 装完只是把文件放到硬盘上命令行还不认识 java 命令必须配环境变量。右击“我的电脑”→“属性”→“高级”→“环境变量”在系统变量里新建JAVA_HOME值填 JDK 的安装根目录注意不是 bin 目录。然后在Path末尾追加%JAVA_HOME%\bin这样命令行在任何目录下都能找到 java 和 javac。老教材还会要求配CLASSPATH值是.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。JDK 6 之后其实不配也能跑但配了不影响重点是开头那个英文句点它代表当前目录漏掉的话运行自己编译出来的 class 会报 NoClassDefFoundError这个坑当年坑过不少人。配完要验证实验要求写一个 test.java 跑通。这段代码的作用不只是打印一句话更重要的是反查 JVM 到底用了哪个 JDKpublic class test { public static void main(String[] args) { System.out.println(JDK 环境就绪); // 打印 java.home确认当前 JVM 来自哪个 JDK 目录 System.out.println(java.home System.getProperty(java.home)); // 打印版本号确认不是系统自带的老 JRE System.out.println(java.version System.getProperty(java.version)); } }编译和运行命令如下。第一行把源码编译成 test.class第二行启动 JVM 执行javac test.java java test这里有个细节类名必须和文件名一致Windows 文件系统不区分大小写写成 Test.java 也能编译但拷到 Linux 环境就报错养成首字母大写的习惯更稳。另外执行时写java test而不是java test.classJVM 要的是类名不是文件名。输出里 java.home 指向的目录如果和 JAVA_HOME 一致说明环境变量生效了如果指向C:\Windows\System32下面某个 jre 目录说明 Path 里系统自带的 Java 排在前面需要把它往后调。2.3 SDK 的在线与离线两条路Android SDK 是整个环境里体积最大的一块实验给了在线和离线两种装法。在线方式是启动 SDK Manager在列表里勾选 SDK Platform、Tools、Google APIs、Samples、USB Driver 这几类勾上 Accept License 再点 Install工具会自己下载解压。这种方式省事但对网络稳定性有要求中途断了容易出现下载了一半的临时目录。离线方式是先下载android-sdk_r16-windows.zip这个安装工具包并解压然后手动建目录、手动把各版本的 zip 解压进对应位置。实验清单里从 android-1.5_r04 一直列到 android-2.2_r01还带了几个 google_apis 包这些包解压后的目录名不是版本号字符串而是android-API Level对应关系是 1.5 对应 android-3、1.6 对应 android-4、2.0 对应 android-5、2.0.1 对应 android-6、2.1 对应 android-7、2.2 对应 android-8。搞错这一层SDK Manager 就认不出来。清单里还夹着一个跟 Android 无关的中间件包解压了也不会被识别直接跳过。装完的目录结构大致是这样每个子目录的职责要分清楚android-sdk-windows/ ├── tools/ # SDK Manager、emulator 等管理工具 ├── platform-tools/ # adb、fastbootADT 会自动寻找 ├── platforms/ │ └── android-8/ # 由 android-2.2_r01-windows.zip 解压而来 │ ├── android.jar # 编译期引用的框架类库 │ ├── data/ │ └── templates/ ├── add-ons/ │ └── google_apis-8/ # 对应 google_apis-8_r01.zip ├── docs/ # 离线文档 ├── samples/ # 官方示例工程 ├── usb_driver/ # Windows 下的真机驱动 └── market_licensing/ # 应用市场授权相关库最容易翻车的一步是把 zip 直接解压到platforms目录下结果多出一层同名目录变成platforms/android-2.2_r01-windows/android-8SDK Manager 扫描时只认platforms下第一层的 android-* 目录于是列表里空空如也。正确做法是解压后把里面真正的 android-8 目录挪到 platforms 下。离线安装的好处是不依赖网络坏处是这一步的目录层级全靠手工保证装完要打开 SDK Manager 确认 Installed 列表里有对应的条目。2.4 ADT 插件安装与 SDK 路径绑定ADT 的装法是在 Eclipse 里走 Help → Install New Software点 Add 弹出仓库对话框Name 随便填个 ADTLocation 填官方更新站点地址确定后 Eclipse 会去搜索可安装项。搜到之后勾选 Developer Tools 这一组一路 Next、接受协议、Finish装完提示重启选 Restart Now 让插件生效。整个过程几分钟中间如果勾选项是灰的或者列表为空多半是 Eclipse 版本和 ADT 版本对不上这个放到后面的排查章细说。重启后还有最后一步Window → Preferences → Android在 SDK Location 里填 SDK 的根目录点 OK。这一步不做新建工程时会提示找不到目标平台。绑定成功的判断标准是新建 Android Project 时Build Target 列表里能列出刚才装的那些 API 版本。四个组件各自的作用和装错时的典型症状可以对照下表组件作用装错时的典型症状JDK提供 javac、java编译和运行 Java 代码命令行提示“不是内部或外部命令”Eclipse集成开发环境承载 ADT 插件双击闪退报 JNI shared library 错误Android SDK提供各版本 android.jar、adb、模拟器新建工程时 Build Target 列表为空ADT把 SDK 能力接进 Eclipse菜单里没有 Android 相关选项3. Activity 与 Intent从页面跳转到跨页面传值的两套写法实验二的重点不是“点一下按钮能跳页”而是搞清楚 Activity 在系统里怎么被注册、跳转时生命周期怎么走、数据通过什么载体传过去。这三件事在实验报告里往往只留了源码截图实际上它们才是答辩时最容易被追问的部分。下面按两个小实验分别拆开代码保持能直接编译的状态同时在关键行写明为什么这么写。3.1 两个 Activity 的注册与生命周期回调Activity 不是写完类就能用的必须在 AndroidManifest.xml 里登记否则 startActivity 时直接抛 ActivityNotFoundException。实验里有两个 Activity一个有启动图标一个只能被代码拉起配置差别就在 intent-filterapplication android:icondrawable/ic_launcher android:labelTestActivity01 !-- 带 MAIN/LAUNCHER 的 Activity 会出现在桌面启动器里 -- activity android:name.MainActivity android:label主界面 intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity !-- 第二个 Activity 只需要登记类名不需要启动图标 -- activity android:name.OtherActivity android:label第二界面 / /applicationandroid:name前面的点表示相对当前包名写成完整包名也等价。漏写这个节点是最常见的崩溃来源而且编译器不会报错只有运行时才暴露。生命周期的顺序在报告里往往一句话带过实际跳转时的回调链条是这样的A 的 onPause 先执行然后 B 依次走 onCreate、onStart、onResume等 B 完全可见之后 A 才走 onStop。返回时反过来B 的 onPause、A 的 onRestart、A 的 onStart、A 的 onResume最后 B 走 onStop 和 onDestroy。把这个顺序记住答辩时问“为什么在 onPause 里保存数据”就能答上来。回调方法触发时机通常在这里做什么onCreateActivity 第一次创建setContentView 绑定布局、findViewById 拿控件onStart界面即将可见注册广播、刷新列表数据onResume界面可交互恢复动画、重新申请定位等onPause失去焦点但还可见保存临时输入、暂停耗时操作onStop完全不可见释放大对象、注销监听onDestroy实例被销毁收尾清理避免内存泄漏3.2 TestActivity01按钮触发的显式跳转第一个小实验要求主界面只有一个按钮点击后打开第二个界面第二个界面只有一个 TextView。主界面的写法如下重点是 findViewById 的调用时机和 Intent 的构造方式package com.example.test1; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private Button jumpBtn; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 绑定布局必须先执行这一句后面才能按 id 找控件 setContentView(R.layout.activity_main); jumpBtn (Button) findViewById(R.id.button1); jumpBtn.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { // 显式 Intent直接指定目标 Activity 的 Class 对象 Intent intent new Intent(MainActivity.this, OtherActivity.class); startActivity(intent); } }); } }参数说明几个关键点R.layout.activity_main是编译器为res/layout/activity_main.xml生成的常量R.id.button1对应布局里android:idid/button1的声明id里的加号表示新建 id在其他文件里引用时不加加号MainActivity.this而不是this因为写在匿名内部类里直接写 this 指的是 OnClickListener类型对不上编译期就会报错。第二个界面更简单只负责把布局挂上去并给 TextView 赋值package com.example.test1; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class OtherActivity extends Activity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.two); TextView tip (TextView) findViewById(R.id.ray); tip.setText(my first activity); } }两个布局文件都很短用 RelativeLayout 定位即可!-- res/layout/activity_main.xml -- RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent Button android:idid/button1 android:layout_widthwrap_content android:layout_heightwrap_content android:layout_alignParentLefttrue android:layout_alignParentToptrue android:layout_marginLeft106dp android:layout_marginTop165dp android:textmy_activity / /RelativeLayout!-- res/layout/two.xml -- RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent TextView android:idid/ray android:layout_widthwrap_content android:layout_heightwrap_content android:layout_alignParentToptrue android:textmy first activity / /RelativeLayout这里刻意没有保留工程模板生成的android:paddingLeftdimen/activity_horizontal_margin这类属性因为它们依赖res/values/dimens.xml里预先定义好的尺寸模板工程换成空工程时这些引用会直接导致编译失败。报告里贴源码截图时如果报错行指向 dimen基本就是这个原因。3.3 TestActivity02用 Bundle 把字符串带到下一个界面第二个小实验在跳转的基础上加了一件事把主界面里的“中国”两个字传到第二个界面显示。实现上有两种写法实验用的是 Bundle 加 Intent// 主界面按钮点击事件内 Intent testIntent new Intent(); Bundle testBundle new Bundle(); // key 为 name值为字符串“中国” testBundle.putString(name, 中国); testIntent.putExtras(testBundle); // 指定目标 Activity testIntent.setClass(TextMainActivity.this, SecondActivity.class); startActivity(testIntent);接收端从 Intent 里把 Bundle 取出来再按同一个 key 拿值// 第二个界面的 onCreate 内 Bundle extra getIntent().getExtras(); // getExtras() 可能返回 null必须先判空再取值 if (extra ! null) { String name extra.getString(name); TextView show (TextView) findViewById(R.id.ruirui); show.setText(name); }setClass和new Intent(this, Class)效果一样前者适合 Intent 对象需要复用的场景比如动态决定跳到哪个页面时先用空 Intent 再逐个 set。getExtras()的判空不能省如果目标界面是由桌面图标直接启动的没经过主界面Intent 里根本没有 Bundle直接getExtras().getString()会空指针崩溃。这是实验报告里最容易被扣分的一个细节因为老师通常会手点两次来测。3.4 传值方式的取舍实验只演示了字符串这一种类型实际工程里传的东西更多。基本类型和 String 可以直接intent.putExtra(key, value)一行写完不必绕 Bundle多个字段一起传时 Bundle 更整齐key 集中在一处不容易拼错传自定义对象则要求对象实现 Serializable 或 Parcelable前者写起来简单但效率低后者要手写一堆样板代码但跨进程也能用。方式适用场景注意点putExtra 直传单个基本类型或 Stringkey 两端必须完全一致Bundle 打包多个字段一起传读取端要判空Serializable传对象量小效率一般慎传大对象Parcelable传对象追求效率需要实现一堆方法startActivityForResult需要从下一页拿回结果新版框架里已被更规范的写法替代4. UI 设计实验布局嵌套、控件组合与对话框交互实验三分两部分前半部分考布局嵌套后半部分考对话框。布局这块的核心不是记住哪个属性叫什么而是拿到一张效果图之后能判断该用几层容器、每层用什么布局、权重怎么分配。这部分在报告里如果只贴 XML 不写拆解思路看起来就是一堆属性堆砌答辩时说不清为什么这么写。4.1 三段式界面的拆解思路实验给的效果图是一个纵向排布、分成三大块的界面最上面是四列等宽的色块中间是三行三列的表格最下面是四行内容。拆解顺序是从外到内最外层所有内容都是从上往下排用纵向 LinearLayout三段内部结构互不相同各自单独用一层容器横向 LinearLayout、TableLayout、纵向 LinearLayout 各管一段。最外层的骨架长这样三个子容器各占三分之一高度靠 layout_weight 分配?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthfill_parent android:layout_heightfill_parent android:orientationvertical !-- 第一段横向 LinearLayout四列等宽 -- LinearLayout android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:orientationhorizontal TextView android:layout_width0dp android:layout_heightfill_parent android:layout_weight1 android:background#CE0000 android:gravitycenter android:textred / TextView android:layout_width0dp android:layout_heightfill_parent android:layout_weight1 android:background#00A600 android:gravitycenter android:textgreen / TextView android:layout_width0dp android:layout_heightfill_parent android:layout_weight1 android:background#0062CE android:gravitycenter android:textblue / TextView android:layout_width0dp android:layout_heightfill_parent android:layout_weight1 android:background#666666 android:gravitycenter android:textgray / /LinearLayout !-- 第二段TableLayout三行三列 -- TableLayout android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:stretchColumns* TableRow TextView android:gravitycenter android:textr1c1 / TextView android:gravitycenter android:textr1c2 / TextView android:gravitycenter android:textr1c3 / /TableRow TableRow TextView android:gravitycenter android:textr2c1 / TextView android:gravitycenter android:textr2c2 / TextView android:gravitycenter android:textr2c3 / /TableRow TableRow TextView android:gravitycenter android:textr3c1 / TextView android:gravitycenter android:textr3c2 / TextView android:gravitycenter android:textr3c3 / /TableRow /TableLayout !-- 第三段纵向 LinearLayout四行 -- LinearLayout android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:orientationvertical TextView android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:textrow 1 / TextView android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:textrow 2 / TextView android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:textrow 3 / TextView android:layout_widthfill_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:textrow 4 / /LinearLayout /LinearLayout这段代码值得注意的地方不在控件数量而在于每个需要等分的子 View 都把主方向的尺寸设成0dp再靠 weight 拿空间。写成wrap_content的话TextView 会先占掉文字本身需要的宽高剩下的空间才按 weight 分结果就是四个色块宽度不一致这是布局实验里最典型的翻车现场。4.2 layout_weight 的计算规则layout_weight 的分配逻辑是父容器先把固定尺寸的子 View 排完剩下的空间按各子 View 的 weight 比例分配。所以 weight 生效的前提是主方向上还有剩余空间可分配。如果子 View 的宽或高写的是match_parent它自己就把空间占满了weight 比例完全不起作用。举个具体的例子横向 LinearLayout 宽 320dp里面两个 TextView第一个宽 0dp、weight 为 1第二个宽 0dp、weight 为 2那第一个占 320×1/3第二个占 320×2/3。如果第一个改成wrap_content且文字占 40dp则剩余 280dp 按 1:2 分第一个实际拿 4093第二个拿 187。数字对不上预期时先检查是不是有子 View 用了 wrap_content。属性写在谁身上含义android:orientation父容器决定子 View 纵向还是横向排列android:layout_weight子 View参与父容器剩余空间的分配比例android:layout_width / height子 View等分时常设 0dp避免内容撑开android:gravity控件自身控制内部文字的对齐方式android:layout_gravity子 View控制自己在父容器里的对齐方式gravity 和 layout_gravity 这两个名字只差一个前缀作用完全不同报告里如果写混了界面效果就是文字居中变成控件居中答辩被指出来很尴尬。4.3 TableLayout 的几个开关TableLayout 的列宽默认由内容决定要达到等宽效果需要开 stretchColumns。android:stretchColumns*表示所有列都拉伸填满剩余宽度也可以写成具体列号比如0,2只拉伸第一列和第三列。对应的还有 shrinkColumns 负责在空间不够时收缩指定列collapseColumns 负责把指定列隐藏这三个属性经常配合使用做表单类界面时比一层层嵌套 LinearLayout 清爽得多。行用 TableRow 包裹TableRow 里的子 View 默认宽度是 wrap_content由 TableLayout 统一管理。如果把 TableRow 换成普通 LinearLayout整张表就退化成纵向堆叠列对齐立刻失效这也是一个常见笔误。4.4 多输入框对话框与三种输出通道实验三的第二部分是做一个带两个输入框的对话框点确定后要把输入内容输出。界面用一个单独的布局文件描述两个 TextView 做标签两个 EditText 收输入!-- res/layout/dialog_input.xml -- LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthfill_parent android:layout_heightwrap_content android:orientationvertical android:padding16dp TextView android:layout_widthwrap_content android:layout_heightwrap_content android:text姓名 / EditText android:idid/et_name android:layout_widthfill_parent android:layout_heightwrap_content android:inputTypetext / TextView android:layout_widthwrap_content android:layout_heightwrap_content android:text年龄 / EditText android:idid/et_age android:layout_widthfill_parent android:layout_heightwrap_content android:inputTypenumber / /LinearLayoutJava 侧把布局 inflate 成 View塞进 AlertDialog再在确定按钮里取值。这段代码有两个容易写错的地方一是 findViewById 的宿主二是内部类里引用外部 Activity// 把 dialog_input.xml 渲染成 View 对象 LayoutInflater inflater LayoutInflater.from(this); View dialogView inflater.inflate(R.layout.dialog_input, null); final EditText nameEt (EditText) dialogView.findViewById(R.id.et_name); final EditText ageEt (EditText) dialogView.findViewById(R.id.et_age); new AlertDialog.Builder(this) .setTitle(请输入信息) .setView(dialogView) .setPositiveButton(确定, new DialogInterface.OnClickListener() { Override public void onClick(DialogInterface dialog, int which) { String name nameEt.getText().toString().trim(); String age ageEt.getText().toString().trim(); // 输出通道一Toast 短暂提示 Toast.makeText(MainActivity.this, name / age, Toast.LENGTH_SHORT).show(); // 输出通道二Logcat按 tag DIALOG 过滤 Log.i(DIALOG, name name , age age); } }) .setNegativeButton(取消, null) .show();关键点是dialogView.findViewById(...)如果用 Activity 的 findViewById 去查对话框里的控件返回的一定是 null因为那些控件不在 Activity 的布局树里。这是自定义对话框最常见的空指针来源现象是点确定就崩日志里指向 getText() 那一行。三个输出通道各有用途Toast 适合给用户看Logcat 适合自己调试写回 Activity 里的 TextView 适合做持久展示。实验要求三种任选报告里写两种以上会更完整因为老师通常会问“如果用户手快连点两次会怎样”这时候 Logcat 里能看到两条记录Toast 会排队显示。5. 实验报告踩坑排查环境、跳转、布局三类问题的定位方法实验过程中遇到的问题八成集中在三个阶段装环境时的命令找不到、跳转时的崩溃、布局写完之后效果和预期不符。这三类问题的排查路径完全不同混在一起找会浪费时间。下面按现象、原因、解决三步整理五条高频问题都是这份报告对应的实验里真实会遇到的。5.1 SDK Manager 双击没反应或者一闪就退现象是解压完 SDK 之后进 tools 目录双击 SDK Manager窗口闪一下或者干脆不出现。原因通常是 JAVA_HOME 指向了 JRE 而不是 JDK或者 JDK 路径里带空格、带中文工具启动时解析路径失败。解决方式是先把 JAVA_HOME 改成 JDK 根目录再确认路径里没有中文和空格如果还是不行在命令行里 cd 到 tools 目录直接执行java -jar lib\archquery.jar之类的小工具看报什么错把错误信息抄下来再搜比盲试快得多。另外还有一个隐性原因系统里同时装了 32 位和 64 位的 JavaPath 里排在前面的那个和 SDK 工具位数不一致。命令行执行where java能列出所有 java.exe 的位置按顺序确认哪个优先被调用。5.2 Eclipse 里死活找不到 Android 选项现象是 ADT 装完、Eclipse 也重启了但 Window → Preferences 里没有 Android 这一项新建工程也没有 Android Project。原因多半是 ADT 版本和 Eclipse 版本不匹配。实验环境用的是 Indigo 版本搭配的 ADT 是那个年代的稳定版换成高版本 Eclipse 去装老的 ADT插件加载会失败但不会明确报错。解决办法是先看 Help → About Eclipse 确认版本号再去看安装时勾选的 Developer Tools 是否真的装上了Help → Installation Details 里能看到已装插件列表。列表里有 ADT 但界面没变化说明插件没加载起来换匹配的版本重装。这里有个经验插件装完一定要选 Restart Now 而不是 Later选 Later 之后插件状态不确定重启也未必生效。5.3 点按钮直接崩日志里是 ActivityNotFoundException现象是主界面正常显示一点按钮应用就退出Logcat 里清清楚楚写着android.content.ActivityNotFoundException: Unable to find explicit activity class。原因只有一个目标 Activity 没有在 AndroidManifest.xml 里登记。Android 的组件必须在清单里声明不声明就等于不存在编译器不会检查这一点。解决是把activity android:name.OtherActivity /补进 application 节点。补的时候注意包名层级如果两个 Activity 在同一个包下前面加点写相对名就行跨包时必须写完整包名否则系统会拼错路径。改完清单要重新安装应用热部署不一定能把清单变更推上去。5.4 传过去的值取出来是 null现象是第二个界面的 TextView 空白或者打印出来是 null。原因有三种两端的 key 拼写不一致比如发送端写name、接收端写Name接收端用错了取值方式比如发送端用 Bundle 打包接收端却直接getIntent().getStringExtra(name)目标界面被桌面图标独立启动过Intent 里压根没有 Bundle。排查办法是在发送端和接收端各打一行日志把完整 key 和值打出来对齐// 发送端 Log.i(PASS, send keyname, value testBundle.getString(name)); // 接收端 Bundle extra getIntent().getExtras(); Log.i(PASS, recv bundle (extra null ? null : extra.toString()));两行日志一对比问题立刻定位。我一般的习惯是把 key 抽成常量比如public static final String KEY_NAME name;两端引用同一个常量拼写错误从源头消失这算是血泪经验比事后排查省事得多。5.5 布局写完和效果图对不上现象有三种等分的色块宽度不一致、表格的列没对齐、界面被顶出屏幕出现滚动条。对应的原因分别是子 View 的主方向尺寸写了 wrap_content、TableRow 被换成普通 LinearLayout、某一层容器的高度写了固定值导致总高超出屏幕。解决办法第一条是把参与等分的子 View 主方向尺寸统一改成 0dp让 weight 说了算第二条是检查 TableLayout 的直接子节点是不是 TableRow不是的话列对齐逻辑不会生效第三条是把外层容器的高度改成 fill_parent中间段用 0dp 加 weight整体比例就稳了。改完在模拟器里横竖屏各转一次能转出不少隐藏问题。6. 验收与答辩怎么把四个实验截图变成一份能过关的报告实验报告的交付物不只是代码还包括截图、源码清单和一段能讲清楚的说明。很多人代码跑通了报告还是被扣分问题出在截图和源码对不上、答辩时说不清某一行代码的作用。这一章把验收环节需要准备的东西列成可核对的清单。6.1 截图与源码的对应关系四个实验要求提交的图不是随手截的每一张都要能和源码文件对应上。可以按下面这张表逐项核对缺哪一项补哪一项实验必交截图对应源码或配置文件验收要点实验一JDK 安装目录、环境变量窗口、test.java 运行结果test.java运行结果里能看到 java.home 路径实验一Eclipse 启动界面、SDK 目录、ADT 安装后界面AndroidManifest 无需Preferences 里 SDK Location 已填实验二主界面、跳转后的第二界面MainActivity.java、OtherActivity.java、两个布局清单里两个 activity 都已登记实验二第二界面显示“中国”TextMainActivity.java、SecondActivity.java两端 key 一致接收端有判空实验三三段式布局效果图MyLayout.xml三段等分色块宽度一致实验三多输入框对话框及点击后的输出dialog_input.xml、MainActivity.java取值用的是 dialogView.findViewById截图时把模拟器的时间栏和工程名一起截进去比只截内容区更有说服力。源码贴进报告要保留缩进和注释一行行挤在一起的代码老师基本不看。6.2 答辩时最常被追问的几个点Activity 从 A 跳到 B生命周期怎么走返回时又怎么走。Intent 显式和隐式的区别实验里用的是哪一种。为什么用 Bundle 而不是直接 putExtra。layout_weight 的分配规则为什么宽要写 0dp。对话框里的控件为什么不能用 Activity 的 findViewById 去找。这几个问题在报告正文里都能找到答案提前对着源码念一遍回答时就不会卡壳。还有一类问题是关于细节的id里的加号是什么意思、fill_parent和match_parent有什么区别、onCreate里super.onCreate不写会怎样。这些不属于难点但答不上来会显得代码是抄的。6.3 交之前走一遍自查我的习惯是代码跑通之后不急着截图先把工程关掉重新打开从零跑一遍因为缓存和热部署会掩盖一些配置问题然后按实验顺序把每一张要交的图列在纸上截一张划掉一张最后把源码从工程目录里复制出来单独编译一次确认没有依赖 IDE 自动生成的东西。有一次赶时间跳过了重开这一步交上去之后老师在自己的机器上一跑就崩原因是清单文件里少了一个 activity 节点本机因为已经装过旧版本没暴露出来。从那以后我每次交这类实验报告都会先把应用卸载再重装一遍再按清单逐项核对截图。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/11/4 21:40:19

智能一体化巡检平台在化工园区的应用与实践

1. 项目背景与核心价值 化工园区作为现代工业的重要载体,其安全管理一直是行业痛点。传统人工巡检存在效率低、盲区多、响应慢等问题,特别是在高温高压、有毒有害等危险环境下,人工巡检的风险系数更高。我们团队开发的这套智能一体化巡检平台…

2026/11/4 21:35:18

电商推荐系统AI技术应用与工程实践

1. 电商推荐系统的现状与挑战 去年双十一期间,某头部电商平台的推荐系统崩溃事件引发了行业广泛讨论。当时系统在流量峰值时出现响应延迟,导致个性化推荐失效,直接影响了数亿用户的购物体验。这个案例暴露出传统推荐系统在面对海量用户时的局…

2026/11/4 21:35:18

认知雷达中的贝叶斯非参数学习与主动探测策略

1. 项目背景与核心概念解析 认知雷达贝叶斯非参数学习是一个融合了信号处理、机器学习与决策理论的交叉领域研究方向。这个标题中提到的"狄利克雷过程驱动的感知-行动循环深化"听起来很学术,但拆解开来其实描述的是一个动态调整的智能感知系统。就像人类在…

2026/11/4 22:25:37

探索Hermes Agent的强化学习策略优化:超参数搜索方法

探索Hermes Agent的强化学习策略优化:超参数搜索方法 Hermes Agent是一款功能强大的AI代理框架,其强化学习模块提供了全面的策略优化能力。本文将深入探讨如何通过超参数搜索方法提升Hermes Agent的强化学习性能,帮助开发者快速掌握高效的参…

2026/11/4 22:25:37

Hermes Agent与元宇宙虚拟经济集成:加密货币与NFT管理的终极指南

Hermes Agent与元宇宙虚拟经济集成:加密货币与NFT管理的终极指南 Hermes Agent是一款功能强大的AI代理工具,能够与元宇宙虚拟经济系统无缝集成,为用户提供全面的加密货币与NFT管理解决方案。通过其灵活的插件架构和智能自动化功能&#xff0…

2026/11/4 22:25:37

优化Hermes Agent的线程安全数据结构:并发集合与锁机制详解

优化Hermes Agent的线程安全数据结构:并发集合与锁机制详解 为什么线程安全对Hermes Agent至关重要? 在现代AI代理系统中,多任务并发处理已成为提升效率的核心手段。Hermes Agent作为一款高性能智能代理框架,其内部包含大量并发…

2026/11/4 22:25:37

构建智能供应链透明度系统:Hermes Agent产品溯源与认证全指南

构建智能供应链透明度系统:Hermes Agent产品溯源与认证全指南 在全球化贸易日益复杂的今天,供应链透明度已成为企业赢得信任和市场竞争力的关键。Hermes Agent作为一款强大的开源智能代理框架,为构建端到端的产品溯源与认证系统提供了灵活而…

2026/11/4 22:25:37

构建智能环境控制系统:Hermes Agent智能家居场景自动化

构建智能环境控制系统:Hermes Agent智能家居场景自动化 什么是Hermes Agent智能家居自动化 Hermes Agent是一款功能强大的开源智能环境控制工具,它能够帮助用户轻松构建个性化的智能家居场景自动化系统。通过Hermes Agent,您可以实现灯光、开…

2026/11/4 22:15:35

shadPS4 PS4 模拟器 Linux 编译教程:从零到启动第一局

shadPS4 PS4 模拟器 Linux 编译教程:从零到启动第一局 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 《血源诅咒》《如龙 0》《荒野大镖…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑