Android基础教程 应用初识

本文详细介绍如何使用Android Studio创建Android项目,包括布局设计、组件属性、字符串资源管理及基本交互逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在开始之前,从本篇开始我们用具体的小项目例子来进行我们的Android学习之旅。

希望通过这一篇文章对于没有接触过Android开发的朋友有所帮助,有过知识储备的请跳过,因为这是对你们没有什么作用的。

从本篇文章开始到后面几篇都是基于一个程序员常见面试题的答题程序为例来进行学习。

开发工具我们使用Android Studio,下载地址:https://developer.android.google.cn/studio

目前最新版本为3.5.2,大家可以根据具体的需要进行安装。

创建Android项目

在这里插入图片描述
接着选择我们项目模板,一般都会选择‘Empty Activity’:
在这里插入图片描述
上面还有选项能够选择设备类型,这里选择手机和平板设备,其他设备我们不做了解。

在这里插入图片描述

首先来看下我们的Android 项目创建完成后是什么样子

在这里插入图片描述
我们今天要实现的很简单,就是实现一个能够显示题目和选择答案的页面。

在Android中,布局和页面的实现逻辑是分开的,为什么这么做,这里没必要深究。

大家可以从创建好的项目中可以看到,Android Studio已经默认为我们创建好了一个名为MainActivity.java和activity_main.xml的文件。

activity_main.xml就是以后我们经常会提到的布局文件,MainActivity.java是布局文件具体逻辑的实现。

在Android Studio中我们有两种选择进行用户界面设计:

  1. 通过修改布局文件,也就是上面的activity_main.xml这样的文件。
  2. 通过图形化设计工具

打开activity_main.xml文件,大家会看到design和text两个选项
在这里插入图片描述
Text模式就是我们通过编辑xml文件来构建用户界面。
Design模式就是通过图形化的设计工具来进行设计,打开看看:
在这里插入图片描述
我们可以通过拖拽的方式将控件摆放在合适的位置进行页面设计。

具体选用哪种方式看自己喜欢了,这里我们选择Text模式。

接下来实现我们今天的页面布局,修改activity_main.xml文件为如下内容:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/tv_question"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/question_content"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.2" />

    <TextView
        android:id="@+id/tv_answerA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="@string/question_answerA"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/tv_question"
        app:layout_constraintTop_toBottomOf="@id/tv_question" />

    <TextView
        android:id="@+id/tv_answerB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="@string/question_answerB"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/tv_question"
        app:layout_constraintTop_toBottomOf="@id/tv_answerA" />

    <TextView
        android:id="@+id/tv_answerC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="@string/question_answerC"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/tv_question"
        app:layout_constraintTop_toBottomOf="@id/tv_answerB" />

    <TextView
        android:id="@+id/tv_answerD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="@string/question_answerD"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/tv_question"
        app:layout_constraintTop_toBottomOf="@id/tv_answerC" />

    <TextView
        android:id="@+id/tv_confirm_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:text="@string/question_confirm_title"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/tv_question"
        app:layout_constraintTop_toBottomOf="@id/tv_answerD" />

    <EditText
        android:id="@+id/et_confirm_answer"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text=""
        android:textSize="18sp"
        android:maxLength="1"
        app:layout_constraintTop_toTopOf="@id/tv_confirm_title"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/tv_confirm_title" />

    <Button
        android:id="@+id/bt_confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:minWidth="200dp"
        android:text="@string/question_ok"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/et_confirm_answer" />


</androidx.constraintlayout.widget.ConstraintLayout>

最终实现的效果如下:

在这里插入图片描述
这里我们总结一下要注意的知识点:

组件属性

在上面的代码中,类似下面这种格式的其实都是组件属性的设置方式,每个组件都有许多属性,这里没办法全部列出。

app:layout_constraintEnd_toEndOf="parent"

最常见的控件属性:

android:layout_width
android:layout_height

可选值如下:
match_parent: 视图和父视图大小相同
wrap_parent: 视图根据其内容大小自动调整

TextView

用来显示静态文字的控件,这里就说两个属性:

android:text="@string/question_confirm_title"
android:textSize="18sp"
android:maxLength="1"

text:用来设置显示的文字内容
textSize: 用来设置字体的大小。sp作为字体大小单位,会随着系统的字体大小改变。
maxLength: 限制可输入字符数

上面的代码大家也看到了,在设置文字的时候,我们使用了:

android:text="@string/question_confirm_title"

@string/question_confirm_title到底是什么东西呢?在Android中专业术语我们将之称之为字符串资源(string resources).

字符串资源(string resources)

在Android中,字符串文件默认被命名为strings.xml,该文件位于res/values目录下,当然了,文件的名字我们可以按照个人喜好命名。
在这里插入图片描述
一个项目可以有多个字符串文件,只要这些文件处在正确的目录下,即res/values目录,只要字符串文件含有一个resources根元素以及多个string子元素,那么字符串定义就能被我们找到,使用方式如上。
在这里插入图片描述
在Android Studio中,我们可以通过下面的方式生成字符串资源:
在这里插入图片描述
将鼠标定位到我们要添加的文字上,使用Alt+Enter组合键,此时会出现如下的菜单:
在这里插入图片描述
选择:Extract string resources后,在下面的界面中输入名称确定即可。

在这里插入图片描述

布局文件到这里我们就简单完成了,此时的页面并不具备和用户进行交互的能力。

要完成和用户交互逻辑,我们就得看看Android Studio为我们默认生成的MainActivity.java文件。默认生成好的文件如下:
在这里插入图片描述
代码很简洁,MainActivity类中只有一个重写的onCreate方法。onCreate方法是做什么的,我们可以简单的认为这个方法就是创建我们刚才写好的布局的,当然了还有其他的事情可以做。

在onCreate方法中,有这么一句代码:

setContentView(R.layout.activity_main);

它会将指定id的布局的视图生成并且将其显示在屏幕上。 R.layout.activity_main就是我们上面编写的activity_main.xml的id,我们可以理解为id就是该资源的一个别名,通过这个名词,程序可以找到对应的资源。

资源和资源id

什么是资源呢?我们可以将一切非代码形式的内容,比如图片,视频以及xml文件等等统统称之为资源。

所以我们上面编写的activity_main.xml也是一种资源。项目的资源文件全部存放在res目录下。

那么不同名字的目录代表什么,可参考官方网站的图表:

这里是引用

在这里插入图片描述
在这里插入图片描述

我们这里要了解的是R.layout.activity_main,很显然,我们的布局文件能够在一个名为R.java的文件下面找到对应的定义,所以程序才能够找到。

R.java文件是Android项目在编译的过程中自动生成的。Android会为所有的布局文件以及各个字符串生成资源id。

为控件指定id的方法在上面的布局文件中也有体现:

android:id="@+id/控件id"

在以后的代码学习过程中,我们可能还会遇到这中写法:

@id/控件id

那么这两种方式有什么区别呢?

@+id/some_value: 如果R.java中没有some_value, 则在R.java中生成一个some_value值;如果有则直接使用已经存在的值.
@id/some_value: 如果R.java中存在some_value, 则使用此值。否则会造成编译错误.

R.java文件可以在下面的目录下找到:
在这里插入图片描述
看看关于我们控件的内容:
在这里插入图片描述

获取视图控件

前面提到了,布局文件是一种资源,那么其中的控件自然也可以通过id获取到,然后进行相关的操作,修改MainActivity代码如下:

package com.qiushangge.androidstudy;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et_confirm_answer;
    private Button bt_confirm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_confirm_answer = findViewById(R.id.et_confirm_answer);
        bt_confirm = findViewById(R.id.bt_confirm);
    }
}

在Android Studio中会自动为我们导入相关的类包,这里就不在做介绍。

findViewById

在上面的代码中我们使用了findViewById方法,它用来引用已经生成的组件。该方法接受组件的资源id作为参数,返回一个视图对象。

或许大家也会看到类似这样的写法:

bt_confirm = (Button)findViewById(R.id.bt_confirm);

在获取到视图对象后,需要进行强制类型转化为对应的组件,在新一点的版本中,该方法不需要进行类型转化。

获取到组件之后,我们给Button按钮绑定点击事件,当用户点击的时候,我们给出回答正确还是错误的提示。

bt_confirm.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                
            }
        });

关于监听器推荐使用内部匿名类的方式实现,也就是上面的格式。具体的概念如果不太清楚,那应该去查阅下java文档。

接下来我们先修改下string.xml,存入我们问题的答案以及回答结果,同时修改下字符串资源的名称。
在这里插入图片描述

接下来我们实现答题的逻辑:

bt_confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String answer = et_confirm_answer.getText().toString().trim();
                if (answer.toUpperCase().equals(getString(R.string.Q1_S))) {
                    Toast.makeText(MainActivity.this, R.string.question_correct, Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, R.string.question_incorrect, Toast.LENGTH_SHORT).show();
                }
            }
        });

首先我们通过EditView的getText方法获取到用户输入,然后和存储在字符串资源文件中的值进行比较,如果相同,告知用户答对了,反之亦然。

注意点:在android和java中,使用==比较字符串其实比较的是字符串的内存地址,如果要想比较两个值是否相等,那么请使用equals方法,小坑一个请留意。

Toast

我们通常使用Toast来显示一些提示信息,格式如下:

Toast.makeText( context , text , duration).show();

context: 传入Activity本身,即类名.class的形式,这里就是MainActivity.this

text: 要显示的提示信息文字

duration: 显示时间的长短,可选值:
Toast.LENGTH_SHORT(短时间提示)
Toast.LENGTH_LONG (长时间提示)。

show()方法最终显示提示组件。

最后一步就是使用我们的模拟器运行应用了。

如果你没有安装模拟器,那么可以按照下面的步骤创建一个模拟器:

  1. 打开avd管理器
    在这里插入图片描述
  2. 因为我已经创建了一个模拟器,所以打开后界面或没有创建的不同,找到下图的按钮点击开始创建。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建完成后运行我们的模拟器:
在这里插入图片描述

在Android Studio中运行程序:
在这里插入图片描述

运行结果:
在这里插入图片描述

输入答案:
在这里插入图片描述

好了,今天就到这里,我们通过一个最简单的应用程序,把开发过程中遇到的问题点做了简单的介绍,如果需要更多地了解相关知识,参考官方文档。

内容简介   《Android基础教程(第3版·修订版)》是一部关于Android开发的基础教程,采用Pragmatic系列图书一贯由浅入深、循序渐进的方式讲解了Android程序设计的核心概念技术。书中不仅结合数独游戏开发案例形象生动地讲解了Android生命周期、用户界面、2D图形、多媒体,以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、3D图形、多点触控、小部件、兼容性测试,以及如何向AndroidMarket发布应用程序等内容。前13章章尾均有“快速阅读指南”,你无需按照顺序阅读该章,即可迅速找到所需信息,并高效地完成工作。   《Android基础教程(第3版·修订版)》适合所有移动开发人员学习参考。 目录 第一部分 Android简介 第1章 快速入门 1.1 安装工具 1.1.1 Java 5.0+ 1.1.2 Eclipse 3 1.1.3 AndroidSDK启动程序软件包 1.1.4 AndroidSDK组件 1.1.5 Eclipse插件 1.2 创建第一个程序 1.3 在模拟器上运行程序 1.3.1 创建一个AVD 1.3.2 再试一次 1.4 在手机上运行程序 1.5 快速阅读指南 第2章 基本概念 2.1 Android的系统架构 2.1.1 Linux内核 2.1.2 本机库 2.1.3 Android运行时 2.1.4 应用程序框架 2.1.5 应用程序小部件 2.2 它还活着 2.2.1 进程不等于应用程序 2.2.2 应用程序生命周期 2.3 构建块 2.3.1 活动 2.3.2 意图 2.3.3 服务 2.3.4 内容提供者 2.4 使用资源 2.5 安全性 2.6 快速阅读指南 第二部分 Android基础知识 第3章 设计用户界面 3.1 数独游戏简介 3.2 声明性设计 3.3 创建启动界面 3.4 使用替代资源 3.5 实现About对话框 3.6 应用主题 3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 3.10.1 利用日志消息调试程序 3.10.2 利用调试器调试程序 3.11 退出游戏 3.12 快速阅读指南 第4章 绘制2D图形 4.1 Android图形基础 4.1.1 Color类 4.1.2 Paint类 4.1.3 Canvas类 4.1.4 Path类 4.1.5 Drawable类 4.2 在数独程序中添加图形 4.2.1 开始游戏 4.2.2 定义Game类 4.2.3 定义PuzzleView类 4.2.4 绘制游戏盘面 4.2.5 绘制数字 4.3 处理输入 4.3.1 定义更新选定区域 4.3.2 输入数字 4.3.3 增加提示 4.3.4 抖动屏幕 4.4 其他问题 4.4.1 创建软键盘 4.4.2 实现游戏逻辑 4.4.3 其他功能 4.5 更多改进 4.6 快速阅读指南 第5章 多媒体 5.1 播放音频 5.2 播放视频 5.3 为数独游戏配上音乐 5.4 快速阅读指南 第6章 存储本地数据 6.1 为数独游戏添加选项 6.2 继续玩前一个游戏 6.3 记住当前位置 6.4 访问内部文件系统 6.5 访问SD卡 6.6 快速阅读指南 第三部分 高级主题 第7章 互联的世界 7.1 通过意图实现浏览 7.2 利用视图打开网页 7.3 JavaScript与Java通信 7.4 使用Web服务 7.5 快速阅读指南 第8章 定位与环境感知 8.1 位置,位置,位置 8.1.1 我在哪里 8.1.2 更新位置 8.1.3 模拟说明 8.2 充分利用传感器 8.2.1 了解传感器 8.2.2 解析传感器的读数 8.2.3 模拟说明 8.3 地图功能 8.3.1 嵌入MapView 8.3.2 准备就绪 8.3.3 模拟说明 8.4 快速阅读指南 第9章 SQL实战 9.1 SQLite简介 9.2 SQL基础 9.2.1 DDL语句 9.2.2 修改语句 9.2.3 查询语句 9.3 你好,数据库 9.3.1 使用SQLiteOpenHelper 9.3.2 定义主程序 9.3.3 添加一行 9.3.4 运行一个查询 9.3.5 显示查询结果 9.4 数据绑定 9.5 使用ContentProvider 9.5.1 更改主程序 9.5.2 添加一行 9.5.3 运行一个查询 9.6 实现ContentProvider 9.7 快速阅读指南 第10 章 利用OpenGL实现3D图形 10.1 理解3D图形 10.2 OpenGL简介 10.3 构建一个OpenGL程序 10.4 渲染场景 10.5 构建一个模型 10.6 光线、相机 10.7 动作 10.8 应用纹理 10.9 透明效果 10.1 测量平滑度 10.11 快速阅读指南 第四部分 下一代产品 第11章 多点触控 11.1 多点触控概述 11.2 创建触控示例 11.3 了解触控事件 11.4 设置图像变换 11.5 实现拖动动作 11.6 实现捏压缩放动作 11.6.1 两个点之间的距离 11.6.2 两个点的中点 11.7 快速阅读指南 第12章 主界面 12.1 Hello,Widget 12.1.1 创建第一个小部件程序 12.1.2 调用所有小部件 12.1.3 拉伸以适合屏幕尺寸 12.1.4 使用扩展 12.1.5 运行小部件 12.1.6 最新进展 12.1.7 快乐之旅 12.2 动态壁纸 12.2.1 创建壁纸项目 12.2.2 服务简介 12.2.3 创建一个绘图引擎 12.2.4 重用OpenGL代码 12.2.5 创建销毁引擎 12.2.6 管理Surface 12.2.7 可视化壁纸 12.2.8 响应用户的输入 12.3 快速阅读指南 第13章 一次编写,到处测试 13.1 启动模拟器 13.2 创建适用于多个版本的程序 13.3 AndroidAPI的发展 13.4 大量错误 13.5 各种屏幕尺寸 13.6 在SD卡上安装程序 13.7 快速阅读指南 第14章 发布到AndroidMarket 14.1 准备工作 14.2 签名 14.3 发布 14.4 更新 14.5 结语 第五部分 附录 附录A Java与Android:语言及其API 附录B 参考书目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值