ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Android Studio无数据库注册页实战:从布局到传参的完整指南

Android Studio无数据库注册页实战:从布局到传参的完整指南 简介这是一份面向Android开发初学者的入门级实战资源基于Android Studio与Java语言实现一个不含数据库的简单个人信息注册小应用。功能覆盖用户名与密码输入、单选性别、下拉选择地址、复选爱好点击提交后跳转结果页展示全部填写内容并对空输入给出提示结果页还可返回首页适合刚接触移动应用开发、想通过完整小实例理解界面控件与页面跳转的读者。压缩包共495个文件约10.27MB以xml布局、json配置、flat缓存、webp图片及dex、jar、class等编译产物为主另含少量java源码与gradle构建脚本完整保留了工程目录结构。目前已有846人学习下载可帮助读者快速理清Activity跳转、控件取值与Intent传参的写法并对照源码排查空值校验与页面回退等常见问题。1. 从零搭一个个人信息注册页为什么“无数据库版”反而是最好的起点很多人第一次打开 Android Studio想做的第一个能拿得出手的东西就是一个个人信息注册界面。输入姓名、手机号、性别、爱好点提交弹个提示数据留在内存里。这个需求听起来简单到不值一提但它恰好覆盖了 Android 开发里最核心的几块拼图布局怎么写、控件怎么拿、事件怎么绑、数据怎么在页面之间传。标题里说的“无数据库版”不是偷懒而是刻意把持久化这层剥掉让你先把 UI 和数据流这两条主线跑通。热搜里 android studio 简易 app 实例、android studio 开发 app 项目 这些词背后站着的就是这批人——想动手但不想一上来就被 Room、SQLite、网络请求劝退。这一章先把这件事讲清楚它解决的是“我能独立做出一个可交互页面”的问题适合刚装完 Android Studio、能跑起 Hello World、但对控件和事件还没手感的人。做完它你手里就有了一个能改、能扩、能当模板的最小工程。2. 工程骨架与布局把注册页的控件摆对位置2.1 新建工程时那几个必须改的默认项打开 Android Studio选 Empty Views Activity这一步别选成 Compose 那个。语言选 Java 或 Kotlin 都行我下面用 Java 写因为热搜里 android studio 简易 app 实例 这类需求多数人拿到的老教程都是 Java照着改不容易卡。Minimum SDK 选 API 24 就够覆盖足够广又不会让你在权限和兼容性上花冤枉时间。工程建好后第一件事是把 Gradle 同步跑完别急着写代码。国内网络环境下如果卡在下载依赖去settings.gradle里把仓库地址换成国内镜像这是热搜里 android studio 配置 sdk 镜像地址 的常见诉求但注意只改仓库别乱动插件版本。布局文件在res/layout/activity_main.xml。注册页要的控件不多姓名用 EditText手机号用 EditText 加 inputType 限制性别用 RadioGroup 包两个 RadioButton爱好用 CheckBox 三个提交用 Button结果显示用 TextView。这里有个新手最容易翻车的地方ConstraintLayout 默认拖控件会生成一堆约束手写反而更稳。我一般直接切到 Code 视图把根布局换成 LinearLayout 垂直排列外层套一个 ScrollView防止小屏手机键盘弹起后按钮被顶出屏幕。!-- res/layout/activity_main.xml 核心结构 -- ScrollView xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent LinearLayout android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationvertical android:padding20dp EditText android:idid/etName android:layout_widthmatch_parent android:layout_heightwrap_content android:hint请输入姓名 / EditText android:idid/etPhone android:layout_widthmatch_parent android:layout_heightwrap_content android:hint请输入手机号 android:inputTypephone android:maxLength11 / RadioGroup android:idid/rgGender android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationhorizontal RadioButton android:idid/rbMale android:layout_widthwrap_content android:layout_heightwrap_content android:text男 / RadioButton android:idid/rbFemale android:layout_widthwrap_content android:layout_heightwrap_content android:text女 / /RadioGroup CheckBox android:idid/cbRead android:layout_widthwrap_content android:layout_heightwrap_content android:text阅读 / CheckBox android:idid/cbSport android:layout_widthwrap_content android:layout_heightwrap_content android:text运动 / CheckBox android:idid/cbMusic android:layout_widthwrap_content android:layout_heightwrap_content android:text音乐 / Button android:idid/btnSubmit android:layout_widthmatch_parent android:layout_heightwrap_content android:text提交 / TextView android:idid/tvResult android:layout_widthmatch_parent android:layout_heightwrap_content android:paddingTop16dp android:textSize16sp / /LinearLayout /ScrollView这段布局的逻辑很直白ScrollView 保证内容可滚动LinearLayout 垂直排列让每个控件各占一行EditText 的inputTypephone会直接调起数字键盘maxLength11在输入层面就挡掉超长手机号。RadioGroup 的 id 必须加因为后面取选中值要靠它。CheckBox 三个各自独立不需要容器。Button 和 TextView 的 id 是后面 Java 代码里findViewById的锚点命名保持语义化别用 btn1、tv2 这种过两天你自己都不认识。2.2 在 Activity 里把控件接上并绑定事件布局写完回到MainActivity.java。核心动作只有三步声明控件变量、在onCreate里findViewById、给按钮设OnClickListener。这里有个血泪经验findViewById必须在setContentView之后调用否则拿到的全是 null一点提交就崩报 NullPointerException新手往往盯着按钮代码看半天其实问题出在顺序上。public class MainActivity extends AppCompatActivity { private EditText etName, etPhone; private RadioGroup rgGender; private CheckBox cbRead, cbSport, cbMusic; private TextView tvResult; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 绑定控件顺序必须在 setContentView 之后 etName findViewById(R.id.etName); etPhone findViewById(R.id.etPhone); rgGender findViewById(R.id.rgGender); cbRead findViewById(R.id.cbRead); cbSport findViewById(R.id.cbSport); cbMusic findViewById(R.id.cbMusic); tvResult findViewById(R.id.tvResult); Button btnSubmit findViewById(R.id.btnSubmit); btnSubmit.setOnClickListener(v - collectAndShow()); } private void collectAndShow() { String name etName.getText().toString().trim(); String phone etPhone.getText().toString().trim(); if (name.isEmpty()) { etName.setError(姓名不能为空); return; } if (phone.length() ! 11) { etPhone.setError(手机号必须 11 位); return; } // 取性别 int checkedId rgGender.getCheckedRadioButtonId(); String gender 未选择; if (checkedId R.id.rbMale) gender 男; else if (checkedId R.id.rbFemale) gender 女; // 取爱好 StringBuilder hobbies new StringBuilder(); if (cbRead.isChecked()) hobbies.append(阅读 ); if (cbSport.isChecked()) hobbies.append(运动 ); if (cbMusic.isChecked()) hobbies.append(音乐 ); if (hobbies.length() 0) hobbies.append(无); String result 姓名 name \n手机号 phone \n性别 gender \n爱好 hobbies.toString().trim(); tvResult.setText(result); } }collectAndShow这个方法把取值和校验揉在一起逻辑上够用但你要清楚每一步在干什么。getText().toString().trim()去掉首尾空格防止用户误触空格导致校验失败。setError会在输入框右侧弹一个红色感叹号比 Toast 更贴近输入位置体验更好。RadioGroup 取选中值必须用getCheckedRadioButtonId()再和 RadioButton 的 id 比对不能直接问某个 RadioButton 是否选中这是 RadioGroup 的设计决定的。CheckBox 用isChecked()逐个判断拼成字符串。最后把结果塞进 TextView整个流程不涉及任何存储页面一关数据就没了这正是“无数据库版”的含义。3. 校验、传参与状态保持让注册页经得起乱输3.1 输入校验的边界与正则的取舍上面那版校验只挡了空姓名和手机号长度实际用起来你会发现用户能输入“abcdefghijk”这种十一位字母inputTypephone在部分输入法下并不能完全拦住字母。要更稳得在提交时加正则。手机号用^1[3-9]\\d{9}$这个模式覆盖国内主流号段别用网上那种把 170、171 单独拎出来的老正则现在虚拟运营商号段早就并进来了写太细反而误伤。private boolean isValidPhone(String phone) { // 国内手机号1 开头第二位 3-9后面 9 位数字 return phone.matches(^1[3-9]\\d{9}$); }在collectAndShow里把phone.length() ! 11换成!isValidPhone(phone)提示语改成“手机号格式不正确”。正则校验放在提交时做不要放在TextWatcher里实时做否则用户刚输入一位就报红体验很糟。这是很多人踩过的坑实时校验适合做字数统计不适合做格式判断。3.2 用 Intent 把数据带到结果页单页面显示结果只是过渡真实场景里注册完往往要跳到一个确认页或主页。这时候数据怎么传无数据库版的标准做法是用 Intent 的 extra。新建一个ResultActivity在collectAndShow里把校验通过的数据塞进 Intent再startActivity。Intent intent new Intent(MainActivity.this, ResultActivity.class); intent.putExtra(name, name); intent.putExtra(phone, phone); intent.putExtra(gender, gender); intent.putExtra(hobbies, hobbies.toString().trim()); startActivity(intent);ResultActivity 里用getIntent().getStringExtra(name)取出来显示。这里的关键是 key 要统一我一般把 key 定义成public static final String常量放在 MainActivity 里两边引用同一个常量避免手打字符串打错导致取到 null。热搜里 android studio 开发 app 项目 这类需求页面跳转和数据传递是绕不开的一环无数据库版正好让你专注在这条链路上不用分心去建表。3.3 横竖屏切换时不让输入内容丢失这是无数据库版最容易被忽略的坑。你把手机横过来Activity 默认会重建所有 EditText 里的内容清空用户骂娘。解决办法有两个一是给 Activity 在AndroidManifest.xml里加android:configChangesorientation|screenSize让系统不重建二是重写onSaveInstanceState把数据存进 Bundle重建后恢复。第一种简单但粗暴第二种更规范。我一般用第二种因为无数据库版本来就没有持久化Bundle 是系统给的一次性后悔药。Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(name, etName.getText().toString()); outState.putString(phone, etPhone.getText().toString()); outState.putInt(genderId, rgGender.getCheckedRadioButtonId()); outState.putBoolean(read, cbRead.isChecked()); outState.putBoolean(sport, cbSport.isChecked()); outState.putBoolean(music, cbMusic.isChecked()); } Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); etName.setText(savedInstanceState.getString(name)); etPhone.setText(savedInstanceState.getString(phone)); int genderId savedInstanceState.getInt(genderId, -1); if (genderId ! -1) rgGender.check(genderId); cbRead.setChecked(savedInstanceState.getBoolean(read)); cbSport.setChecked(savedInstanceState.getBoolean(sport)); cbMusic.setChecked(savedInstanceState.getBoolean(music)); }onSaveInstanceState在 Activity 可能被销毁前调用onRestoreInstanceState在重建后调用。注意getInt的第二个参数是默认值传 -1 表示没选。rgGender.check(id)是 RadioGroup 恢复选中状态的正确方法别用setChecked去点单个 RadioButton那样不会互斥。这套代码加上去横竖屏切换、分屏、甚至系统回收后台 Activity输入内容都能回来。4. 避坑与排查无数据库注册页最常见的五个翻车点4.1 一点提交就闪退日志报 NullPointerException现象点击按钮应用直接退出Logcat 里一行红字指向findViewById或某个控件方法。原因九成是findViewById写在了setContentView前面或者控件 id 在布局里根本不存在比如你把etName写成了etnameJava 里R.id.etName编译能过但运行时找不到。解决先确认setContentView是第一行再逐个核对布局里的android:id和 Java 里的R.id.xxx拼写是否完全一致大小写敏感。4.2 手机号输入框弹不出数字键盘现象点手机号输入框弹出的还是全字母键盘。原因inputType没设或者设成了text。解决在布局里给手机号 EditText 加android:inputTypephone。如果想让姓名框也不弹数字可以给姓名加android:inputTypetextPersonName。注意inputType和maxLength可以共存不冲突。4.3 横屏后数据全没了现象输入一半横屏内容清空。原因Activity 重建控件重新初始化。解决按 3.3 节重写onSaveInstanceState和onRestoreInstanceState。如果你图省事在 Manifest 里加了configChanges要清楚这只挡了配置变化导致的重建系统内存不足回收后台 Activity 时照样丢数据所以规范做法还是 Bundle。4.4 正则校验把正常号码判成非法现象输入 199 开头的号码提示格式不正确。原因用了老正则只认 13 到 18 开头。解决换成^1[3-9]\\d{9}$第二位允许 3 到 9覆盖 199、198 等新号段。改完拿几个不同号段测一下别只测自己的号。4.5 结果页取到的全是 null现象跳转后 ResultActivity 显示 null。原因Intent 的 key 两边不一致或者putExtra根本没执行比如校验没通过就 return 了。解决把 key 抽成常量两边引用同一个在putExtra前加一行日志确认走到了这一步ResultActivity 里用getStringExtra时给个默认值比如getStringExtra(name) null ? : ...至少不会显示 null 字样。5. 进阶技巧把注册页改造成可复用的表单模板做到这里你已经有了一个能跑、能校验、能传参、能扛横竖屏的注册页。但它的价值不止于此真正省时间的是把它抽象成一个可复用的表单模板。我自己的习惯是抽一个FormValidator工具类把手机号、邮箱、非空这些校验规则做成静态方法下次做登录页、收货地址页直接调不用重写正则。另一个技巧是用TextInputLayout包住 EditText把 hint 变成浮动标签错误提示直接显示在输入框下方比setError的感叹号更现代Material 组件库默认就带不用额外引依赖。// 简单的校验工具类后续页面直接复用 public class FormValidator { public static boolean isPhone(String s) { return s ! null s.matches(^1[3-9]\\d{9}$); } public static boolean isNotEmpty(String s) { return s ! null !s.trim().isEmpty(); } }再进一步如果你后面要接数据库这个无数据库版的代码结构几乎不用大改只需要在collectAndShow校验通过后把数据交给一个 Repository 去写 RoomUI 层完全不动。这就是为什么我说无数据库版是最好的起点它逼你把 UI 和数据流理清楚而这部分在任何有数据库的版本里都是一样的。验证方法也很简单拿三台不同分辨率、不同 Android 版本的设备或模拟器各跑一遍横竖屏切换和乱输测试能过就说明骨架稳了。我自己的习惯是每做一个新页面先不碰存储把交互跑顺了再考虑持久化这样出问题时排查范围小得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表