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

精选文章,第一时间送达

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

往期精彩:

Android App 开发的三种姿势 ~

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

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

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

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

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"><!--文本框--><TextViewandroid: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" /><!--图片展示控件--><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/img" /><!--按钮控件--><Buttonandroid: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文件夹下。

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

很简单的一个逻辑控制,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//主程序mainprotected 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监听点击对象->onClickfindViewById(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文件,这里一般不需要进行任何的修改。

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

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

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

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

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

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

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

——The  End——

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

  1. 面试了一个32岁的程序员,一个细节就看出来是培训班的····

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  2. 面试了一个34岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  3. 面试了一个32岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验....

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  4. python好学吗 老程序员-今天面试了一个34岁大龄程序员,有感而发

    原标题:今天面试了一个34岁大龄程序员,有感而发 " 昨天,我面试了一个34岁的大龄程序员--我给人事的建议是P4,结果人事说:那直接让他走吧. " 我一直以为他们在开玩笑! 结果 ...

  5. 30分钟,让你成为一个更好的程序员

    我相信激励是非常重要的.这也是为什么我常常把时间管理(这些书激励我不管改进我的时间管理方法)的书和软件开发拿出来看看.我最近刚看完一本 书,"Apprenticeship Patterns: ...

  6. ​如何成为一个成功的自由程序员?

    全文共2764字,预计学习时长8分钟 来源:Pexels 自由职业是一根魔杖,它能帮助你实现一些原本不可能实现的事情. 首先,让我们一起看看成为一名自由程序员有哪些好处. 作为一名自由程序员,你可以在 ...

  7. 某HR自述:和高管PK了半小时,终于给一个47岁的程序员发了offer~

    总有HR因为年龄卡候选人,但也有HR愿意给大龄候选人一个机会. 一位HR自述:我和高管PK了半个小时,终于给一个47岁的程序员发了offer. 我始终坚信:与其看年龄,不如看心态! 网友问,什么行业和 ...

  8. 2019 年终总结和一个三十岁程序员的感悟

    前言 年中的时候,在博客上写过一篇半年总结,地址在这里: 我的 2019 年中总结 ,因为前几天一直在忙家里的事情,所以也没有抽空出来在 2019 年前把总结写完,算是一点小小的遗憾吧,就在这里把总结 ...

  9. 一个会做饭的程序员如何每天给女朋友带不同的便当?

    作为一个会做饭的程序员,每天给女朋友和自己带饭是必须的,可是每天要吃什么却是一个世纪难题! 以前就想过要开发一个APP,来随机决定明天吃什么菜,然而世界上最痛苦的事情是: 我是一个 Android 开 ...

最新文章

  1. MFC框架类、文档类、视图类相互访问(及窗口句柄获取)的方法
  2. XHR(XMLHttpRequest)与Linux下的CGI交互
  3. react 线程_React式服务中的线程本地状态可用性
  4. HDU-3729 二分匹配 匈牙利算法
  5. 山东鲁能轨道智能巡检机器人_温湿度传感器在轨道巡检机器人中的应用
  6. 真狠!10000mAh超大电池手机发布,真的神机...
  7. 为什么 Netflix 这么强?网飞 CEO 哈斯廷斯跟陆奇摊牌了
  8. Form,你到底是客户端还是服务端
  9. nfs文件共享服务器搭建详解
  10. 域用户开机自动加入本地管理员组VBS脚本+限制多点登录
  11. CRC码计算及校验原理计算
  12. 计算机扩容硬盘,扩容盘是什么 如何恢复真实容量【方法详解】
  13. VS2013好用的插件
  14. 计算机表格出现value,excel中出现#value!的解决办法
  15. Sending build context to Docker daemon 解决办法
  16. docker服务器搬迁后遇到的问题:宿主ip不通
  17. 《八股文》20道Redis面试题
  18. 小程序和H5有什么区别?
  19. win10进行系统还原 (可以还原注册表文件 还可以清除近期卸载不了的软件)
  20. unity打包安卓显示手机顶部状态栏

热门文章

  1. 双目视觉(六)U-V视差
  2. 计算机病毒爆发的新闻,从两次勒索病毒爆发聊聊计算机安全重要性
  3. 百度文库推广引流技巧
  4. 向微信公众号文章添加通知文件
  5. 2021年中国在线教育行业投融资现状及未来发展趋势分析[图]
  6. 安卓APP跟iOSAPP之间的对比
  7. VIP之Clipper
  8. MP4学习(五)ts-mp4源码阅读(3)ftyp box的解析
  9. CES2019新品季: 明基4K广色域机种解析
  10. 遗传基因科普(4):为何人类不能制造DNA分子?