制作一个“生日快乐”App,来自程序员的生日礼物~

2023-11-19

点击上方码农的后花园”,选择星标” 公众号

精选文章,第一时间送达

之前给大家制作了一个来自程序员的表白神器,本期带大家做一个“生日快乐”App”,来自程序员的生日礼物,不要再说程序员不懂浪漫咯~

往期精彩:

Android App 开发的三种姿势 ~

模型部署,移动端安卓App开发环境搭建和配置教程 ~

运你的第一个“Hello World” 安卓App(附赠:安卓开发入门手册)

创建了一个空白的App项目后(不会创建的,可以看我前面几期关于安卓的文章哦67ead3b4ae7aadee909b9d20d2721956.pnga7c48c26332d1c27a4ad035429c53f08.png),会发现App项目文件结构主要包括:manifests、java、res三个子文件夹,分别对应于App项目配置文件、App页面逻辑控制代码、App页面布局。

8c10529b3065bf45ebb625e5166d8cf6.png

所以新建一个空白的App项目后,制作“生日快乐”App的第一步:在app项目的res文件下的layout文件中的activity_main.xml文件中编写App的页面,分别绘制一个文本框控件,一个图片展示控件和一个播放/暂停按钮,最终的页面布局设置如下。

9578e53ff87ebf8033c87093795c8f6b.png

activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <!--文本框-->
    <TextView
        android:layout_margin="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="祝你生日快乐!"
        android:textColor="@android:color/holo_red_light"
        android:textSize="25dp" />


    <!--图片展示控件-->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/img" />


    <!--按钮控件-->
    <Button
        android:id="@+id/btn"
        android:layout_margin="10dp"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放/停止" />


</RelativeLayout>

在此之前,我们需要将我们要在App上展示的多啦A梦的图片img.jpg和生日快乐歌music.mp4分别放置在app文件夹下的drawble和raw文件夹下。

d5e57b5a263a437cfb94c676c8f00504.png

然后在App项目结构的java文件中的MainActivity.java文件编写播放/暂停生日快乐歌按钮的逻辑控制代码,简单的逻辑是首先获取播放music.mp4的媒体流对象,然后为按钮设置一个点击事件:点击播放按钮,播放生日快乐歌,按钮显示暂停状态,再次点击,暂停播放,再次点击,再次播放。

da4e548f31dafd7df1600f739f738905.png

很简单的一个逻辑控制,MainActivity.java文件内容如下:

package com.example.happybirthday;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;


//java代码控制"界面布局"的逻辑控制
public class MainActivity extends AppCompatActivity {


    @Override
    //主程序main
    protected void onCreate(Bundle savedInstanceState) {
        //初始化继承Oncreate类
        super.onCreate(savedInstanceState);
        //显示布局
        setContentView(R.layout.activity_main);
        //初始化布局:自定义initUI方法
        initUI();
    }


    private void initUI() {
        //首先获取媒体播放对象
        MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.viedo);


        //然后根据控件id找到相应的按钮、并注册一个按钮点击事件:setOnClickListener监听点击对象->onClick
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            //当我们点击btn这个id对应的按钮后,会回调onClick方法
            public void onClick(View view) {
                //判断媒体播放对象是否正在播放
                if(mediaPlayer.isPlaying()){
                    mediaPlayer.pause(); //如果正在播放,就停止播放
                }else{
                    mediaPlayer.start(); //如果没有播放,就开始播放
                }
            }
        });
    }
}

最后检查一下app项目配置文件: manifests文件下的AndroidMainfest.xml文件,这里一般不需要进行任何的修改。

c4d6782e8c0899108089286fcd8d8a67.png

点击菜单栏里的,绿色箭头按钮,就可以在我们已经下载好了的虚拟手机设备上运行调试“生日快乐”App了。也可以打开我们自己的手机的开发者模式,直接在我们自己的真机上对设计的App进行运行调试。创建电脑端的虚拟手机和在真机上调试运行App,具体操作,可见往期文章: 运行你的第一个“Hello World” 安卓App(附赠:安卓开发入门手册)

b93c86a91e890a64eb694953e8445930.png

这样,我们“生日快乐”APP就已经做好了,只不过这个App现在是安装在我们的虚拟的手机模拟器上。我们点击菜单栏里灰色的下三角按钮,将当前项目结构Android切换成Project结构展示,就可以看到调试运行生成debug版本的App的安装包文件app-debug.apk

4d3e3913f203b5cca231d3f89cd5ccd9.png

a501749bf48d38ad0b64018811bdc55b.png

但是此时你将这个App的安装包文件app-debug.apk发给别人或者自己的手机上进行下载安装,是无法成功的。

65647836f368ec9c611811fbb3bff5e7.png

这是因为此时生成App的安装包文件app-debug.apk, 是调试运行生成安装包.apk文件是debug版本的,它是调试运行时生成的,不是打包生成的,所以无法运行在真机上。只有release版本App的安装包.apk文件,也就是打包发布生成的App的安装包。

经过打包操作之后,生成发布版的的App的安装包app-release.apk文件,可以在项目Project项目下的app文件夹下的release文件中找到,如下所示。

84fa5a5e10c449d9d60afbc8e0ce2853.png

简单来点说就是,运行调试生成的app用的是你电脑本端的系统环境运行的,此时你发给别人,别人没有你电脑端的系统环境是无法运行的。而打包生成的app,是将你电脑端所用的一切环境集成打包,这样别人没有你电脑端的环境,也可以下载安装你设计的App了。

e708a82c7a3b09e7352c33914da8f06d.png

下一期教大家如何将自己在Android Studio 上调试运行好生成的App打包生成可运行在真机上的安装包,后台回复,关键字“生日快乐”,获得已经打包的生日快乐App文件安装包。

——The  End——

0b12fe967bbf5bcae734be8349e4b6c8.gif

3fd5c3bed299581204d9fe5d068fe64c.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作一个“生日快乐”App,来自程序员的生日礼物~ 的相关文章

  • 删除对象时删除嵌套字段中的索引

    我仍在使用 Firebase 这次我有一个与删除对象相关的问题 我有如下结构 users UsErId1 name Jack email email protected cdn cgi l email protection UsErId2
  • Android 设备选择器在目标列中显示红色 X

    我最近构建了一个 Android 应用程序 minSdkVersion 为 7 targetSdkVersion 为 10 我现在正在使应用程序兼容平板电脑并添加操作栏 因此 我将 targetSdkVersion 更新为 15 并在项目属
  • TabHost 中的 Webview = 以黑屏启动

    我正在尝试在有 4 个选项卡的 tabhost 中使用 webview 所有选项卡都链接到同一个 webview 这很好 除了一个问题 启动时 网络视图是黑色的 单击选项卡 2 3 或 4 使其 活跃起来 我的快速解决方法是使用 setCu
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 当 Android 上的脸部靠近屏幕时,以编程方式关闭屏幕

    我的应用程序是一个拨号器 当用户将手机靠近头部时 我需要关闭屏幕并防止单击控件 就像本机 Android 拨号器行为一样 我需要什么 API 级别以及如何以正确的方式做到这一点 我通过反汇编一个非常著名的 VoIP 应用程序找到了解决方案
  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • 长按 HOME 按钮菜单隐藏 Android 应用程序

    我想从 且仅从 完成后长时间按住 HOME 按钮时出现的菜单中隐藏我的 Android 应用程序 有没有办法做到这一点 以编程方式调用 finish 并不能解决问题 有很多关于从启动器和任务管理器隐藏应用程序的线程 但这不是我想要的 我只是
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • SQLiteConstraintException:错误代码19:约束失败——Android错误

    我已经看到了一些与此相关的其他问题 但没有一个答案似乎真正适用于我的代码 当我尝试插入数据库时 出现 SQLiteConstraintException 错误代码 19 约束失败 错误 这是插入操作的代码 db insert 现在返回 1
  • 从侦听器中修改 JFrame [重复]

    这个问题在这里已经有答案了 可能的重复 如何在框架可见后调用 setUndecorated https stackoverflow com questions 875132 how to call setundecorated after
  • webView.loadUrl 显示空白屏幕

    我必须加载这些通过使用下面的代码 但最终显示空白屏幕作为输出 您可以检查url代码之间的链接位于last line WebPagerLoader java public class WebPageLoader extends Activit
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • Android 4.2以下如何设置layoutDirection为RTL

    尝试将布局元素设置为 RTL 顺序 4 2 及以上行 layoutDirection rtl 并在清单中 android supportsRtl true 工作得很好 但对于 4 2 以下则不然 解决方案有人吗 只需使用视图兼容使用 and
  • 为什么 CompletableFuture 的 thenAccept() 不在主线程上运行

    我在 CompletableFuture 的 SupplyAsync 中处理长时间运行的操作 并将结果放入 thenAccept 中 有时 thenAccept 在主线程上执行 但有时它在工作线程上运行 但我只想在主线程上运行 thenAc
  • 使用 Retrofit 获取原始 HTTP 响应

    我想从我的 API REST 获取原始 http 响应 我尝试过这个界面 POST login FormUrlEncoded Call
  • 如何获取在代码中 attrs.xml 中创建的枚举

    我创建了一个自定义视图 找到它here https bitbucket org informatic0re awesome font iconview 具有枚举类型的可声明样式属性 在 xml 中 我现在可以为我的自定义属性选择枚举条目之一
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 如何在 tomcat 上部署 Java Web 应用程序 (.war)?

    我有一个 warJava Web 应用程序的文件 现在我想将它上传到我的 ftp 服务器 以便我可以执行它 我应该执行哪些步骤来运行它 webapp的上下文路径是 mywebapp Edit 实际上 我的 ftp 服务器名称是ftp bil

随机推荐

  • 飞机大战(C语言版)

    大一下要交课程设计 于是就用C语言写了一个飞机大战小游戏 没有用到第三方库 飞机和子弹的移动使用的光标移动函数 所以没有卡顿 其中w s a d分别表示上下左右 包括大写 空格发射子弹 游戏结束后可选择是否储存游戏数据 该程序复制后可直接使
  • git push错误: failed to push some refs to

    原因 当你在git上对它进行了在线修改 但是没有对本地库进行同步 这个时候你再次commit 想把本地库提交到远程git库中 就会出现push失败问题 简单来说 就是远程与本地存在不一致的commit情形 解决方法 确保远程代码没问题的情况
  • 【Java SE】抽象类和接口

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 一 抽象类 1 抽象类的概述 2 抽象类特点 3 抽象关键字abstract和哪些不可以共存 4 抽象类的细节 5 抽象类的作用 二 接口 1 什
  • 统计学习方法论概念

    1 统计学习包含监督学习 非监督学习 半监督学习和强化学习 2 监督学习 监督学习的任务是学习一个模型 使模型能够根据任意给定的输入 对模型的输出做出一个好的预测 监督学习分为学习和预测两个过程 由学习系统和预测系统组成 3 损失函数和风险
  • 【C++】迭代器 && vector中迭代器失效

    文章目录 1 什么是迭代器 2 迭代器与指针 3 迭代器的分类 3 1具体分类 3 2为什么要对迭代器分类 3 3迭代器的使用建议 4 vector迭代器失效 4 1迭代器失效及其危害 4 2哪些操作会导致迭代器失效 如何解决 1 什么是迭
  • 视觉SLAM十四讲笔记-6-3

    视觉SLAM十四讲笔记 6 3 文章目录 视觉SLAM十四讲笔记 6 3 6 3 实践 曲线拟合问题 6 3 1 手写高斯牛顿法 6 3 2 使用Ceres进行曲线拟合 Ceres 简介 安装Ceres 使用Ceres拟合曲线 6 3 3
  • JAVA往map添加元素_java list map在初始化的时候添加元素

    List list new ArrayList add First Object add Second Object add Third Object Map map new HashMap put First Key First Valu
  • 初始OAuth2.0

    1 什么是OAuth2 0 OAuth2 0 是目前使用非常广泛的授权机制 用于授权第三方应用获取用户的数据 举例说明 用户可以通过选择其他登录方式来使用gitee 这里就使用到了第三方认证 OAuth 引入了一个授权层 用来分离两种不同的
  • vue 修改标题名字

    1 直接修改 在main js中添加 document title 大屏控制 2 根据路由动态改变 https www cnblogs com CinderellaStory p 10858035 html
  • iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机?

    iPhone苹果手机15机型区域版本识别代码 CH代码为国行 LL代码为美版 ZP代码为港版 iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机 1 打开苹果iPhone15手机桌面上的 设置 2 在iPhone苹
  • OWASP ZAP安装遇到Error.A JNI error has occurred ,please check your installation and try again

    问题描述 我当时下载的是兼容版本 下载完成后双击zap bat发现运行一下就闪退 然后运行jar文件就报错 过程 最开始以为是java环境的问题 后面用java version去运行了一下 发现java环境是正常的 但又一直提示java的问
  • 4大技术亮点支撑应用优势 全新一代旗舰型行业无人机千巡翼X4发布

    随着无人机与数字成像技术的发展 无人机航测成为了重要的地理信息采集手段 也越来越受重视 据相关研报数据统计 预计2025年我国实景三维在自然资源领域的 以数据采集 处理为主的直接市场规模预计将达40亿元 推测2025年关联市场规模将达400
  • MFC设置控件文本字体、大小、颜色、背景

    1 修改字体 大小 声明一个CFont类型的类成员变量 CFont m editFont 然后在类的初始化函数OnInitDialog 中添加以下两行代码 设置静态文本字体大小 m editFont CreatePointFont 180
  • MFC编程实验(三):组件(列表框元素的增删)

    一 实验要求 创建一个对话框应用程序 实现如下布局 完成如下功能 1 初始状态 列表中有4个元素 2 可以在编辑框中输入新朋友的名字 点击 添加 按钮添加到列表框 同时清空编辑框中的名字 3 选中列表框中的一个名字 点击 删除 按钮可以删除
  • GDB 简略手册

    杂项 命令 用法 说明 h elp help 显示可用帮助文档 h CMD 显示关于指定命令的帮助 apr opos apr REGEXP 使用正则表达式搜索命令 i nfo info 显示可展示的信息 ENTER 无命令回车 重复执行上一
  • 接口测试总结

    第一部分 主要从问题出发 引入接口测试的相关内容并与前端测试进行简单对比 总结两者之前的区别与联系 但该部分只交代了怎么做和如何做 并没有解释为什么要做 第二部分 主要介绍为什么要做接口测试 并简单总结接口持续集成和接口质量评估相关内容 第
  • 手写系列之--call/apply/bind/防抖/节流

    call call 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数 语法 function call thisArg arg1 arg2 JavaScript中由于函数的this指向它的直接调用者 我们变更调用者即
  • 1668 最大重复子字符串

    题目描述 给你一个字符串 sequence 如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串 那么单词 word 的 重复值为 k 单词 word 的 最大重复值 是单词 word 在 sequence
  • 第48讲 第49讲--动态定位单元格区域1-End属性、动态定位单元格区域2、3-Currentregion UsedRange

    1 单元格区域 EntireRow返回该区域所在的整行对象单元格区域 EntireColumn返回该区域所在的整列 返回单元格所在的整行与整列 返回单元格对象 EntireRow 与EntireColumn Sub 整行与整列 Range
  • 制作一个“生日快乐”App,来自程序员的生日礼物~

    点击上方 码农的后花园 选择 星标 公众号 精选文章 第一时间送达 之前给大家制作了一个来自程序员的表白神器 本期带大家做一个 生日快乐 App 来自程序员的生日礼物 不要再说程序员不懂浪漫咯 往期精彩 Android App 开发的三种姿