安卓开发--新建工程,新建虚拟手机,按键事件响应

安卓开发--新建工程,新建虚拟手机,按键事件响应

  • 1.前言
  • 2.运行一个工程
    • 2.1布局一个Button
    • 2.2 button一般点击事件
    • 2.2 button属性点击事件
    • 2.2 button推荐点击事件

本篇博客介绍安卓开发的入门工程,通过使用按钮Buton来了解一个工程的运作机制。前面已经介绍了环境搭建,这里就默认大家环境都已经搭建好了。环境搭建看这里安卓开发–环境配置

1.前言

这里必须说明,我们平时开发APP的时候,实际上都是再虚拟设备上先进行调试,然后在下载到手机上进行安装的。当然,你也可以一直手机直接下载调试。我试过,下载卸载千百遍,有点废C口。
所以这里介绍如何新建虚拟设备。其实在APP开发中,是需要对所有不同屏幕大小的手机进行布局开发的,所以一开始就要选择一个目标屏幕大小,我属于个人开发者,就新建一个自己手机屏幕大小进行开发。新建一个设备如图:

上图,点击Add Device Definition之后,在如下界面选择这些配置,该配置和我手机保持一致。
代码配置手机信息

点击 Finish之后,会出现自定义的手机型号,点击next

选择手机镜像为 安卓13 然后会提示接受,然后下载
选择安卓13下载安卓13 (1.4G)

下载完成后,点击next,点击Finish。
可以看到顶部启动栏有一个新建的设备,我们可以直接启动看看效果,体验一个虚拟手机。
后续的开发都会在这个虚拟手机中完成。

2.运行一个工程

新建一个空白工程,参考这里:安卓开发–环境配置
新建好一个工程以后,需要修改布局代码res/layout/activity_main.xml将其替换为以下全部内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">


</LinearLayout>

上面是一个空白布局,后续开发的布局都从这里开始。

修改运行代码java/com/example/myfirstapp/MainActivity.java,将其全部替换为以下内容:

package com.example.myfirstapp;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

}

上面是一个空白逻辑,后续开发的代码流程都从这里开始。

记住了,一个空白工程就是本小节的流程,所有的开发都从一个空白工程开始。

2.1布局一个Button

先在res/layout/activity_main.xml文件中布局一个 Button,注意其id号为 btn1

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按键1"
        android:textSize="50dp"
        />

</LinearLayout>

此时的预览布局出现布局效果,如图中1、2分别为其代码以及对应的布局 :

好了,现在布局完成,我们探索如何使用按键。

2.2 button一般点击事件

在文件java/com/example/myfirstapp/MainActivity.java,写入以下代码,完成按键函数的一般调用:

package com.example.myfirstapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button mBt1;//申明组件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBt1=findViewById(R.id.btn1); // 读ID,与布局id号对应

        //监听函数
        mBt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //你要处理的内容
                Log.d("btn1", "点击按钮了");
            }
        });
    }
}

我们将其下载到虚拟手机中,打开Logcat输出端口,可以看到点击被响应。效果如图:

这里1表示代码,2是虚拟手机界面,3是Logcat窗口,4是点击后的log信息。

2.2 button属性点击事件

按钮是自带被点击的属性的,可以利用其属性完成点击事件的检测。
布局文件res/layout/activity_main.xml代码,为其增加了android:onClick="showToast"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按键1"
        android:textSize="50dp"
        android:onClick="showToast"
        />

</LinearLayout>

逻辑文件java/com/example/myfirstapp/MainActivity.java代码:

package com.example.myfirstapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity  extends AppCompatActivity {

    private Button mbt01;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbt01=findViewById(R.id.btn1);
    }
    public  void showToast(View view){
        Log.d("btn1", "点击按钮了");
    }
}

效果如图:

这里1表示代码,2是虚拟手机界面,3是Logcat窗口,4是点击后的log信息。

2.2 button推荐点击事件

这个方法特别推荐在项目中使用,项目里面使用这中方式最合理,因为这个方法可以同时检测多个按键而不会逻辑冲突。
布局文件res/layout/activity_main.xml代码,为其新加了一个按键:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按键1"
        android:textSize="50dp"
        />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按键2"
        android:textSize="50dp"
        />

</LinearLayout>

逻辑文件java/com/example/myfirstapp/MainActivity.java代码:

package com.example.myfirstapp;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity  extends AppCompatActivity {

    private Button mbt01;
    private Button mbt02;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbt01=findViewById(R.id.btn1);
        mbt02=findViewById(R.id.btn2);
        setListeners();//调用方法
    }

    //写一个方法
    private void setListeners(){
        OnClick onclick=new OnClick();//实例化onclick
        mbt01.setOnClickListener(onclick);
        mbt02.setOnClickListener(onclick);
    }

    private class OnClick implements  View.OnClickListener{
        @Override
        public void onClick(View v) {

            switch (v.getId()){
                case R.id.btn1://跳到按钮界面
                    Log.d("btn1", "按钮1被点击了");
                    break;

                case R.id.btn2://跳到文本框界面
                    Log.d("btn2", "按钮2被点击了");
                    break;
            }

        }
    }
}

这里有个会遇到一个问题,Android中使用switch-case遇到case R.id.xxx报错

运行效果如图:

这里1表示代码,2是虚拟手机界面,3是Logcat窗口,4是点击后的log信息,可以看到按键1 2点击均有相应的反应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文合集1】- 存内计算加速机器学习

本章节论文合集&#xff0c;存内计算已经成为继冯.诺伊曼传统架构后&#xff0c;对机器学习推理加速的有效解决方案&#xff0c;四篇论文从存内计算用于机器学习&#xff0c;模拟存内计算&#xff0c;对CNN/Transformer架构加速角度阐述存内计算。 【1】WWW: What, When, Where…

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例&#xff1a;创建一个webScoket实例对象1.1、WebSocket.Server(options[&#xff0c;callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

2024第九届数维杯数学建模论文模板(内附LaTeX+Word)

一年一度的2024年第九届数维杯国赛报名进行中&#xff01;相信很多同学们已经摩拳擦掌蓄势待发了&#xff01; 经历三天比赛&#xff0c;最后提交的论文就是最终答卷&#xff0c;那么一篇数模论文&#xff0c;包括哪些内容呢&#xff1f; 一篇完整的数模论文&#xff0c;包括…

【初阶数据结构】单链表经典OJ题

目录标题 原题展现题目解析代码展现1.创建新节点2.拷贝random指针3.将新节点尾插 原题展现 该题是力扣上的第138题&#xff0c;题目链接如下&#xff1a;随机链表的复制。 题目解析 我们发现这个链表和一般的链表存在着一点点区别&#xff0c;那就是每个节点多了一个random指…

遥控挖掘机之ESP8266调试心得(1)

ESP8266调试心得 1. 前言2.遇到的问题2.1 ESP8266模块建立TCP连接时候报错2.2 指令异常问题 3. 更新ESP8266固件3. ESP8266的部分AT指令3. 连接步骤3.1 模块与电脑连接3.2.1 电脑上的设置3.2.2 ESP8266模块作为客户机&#xff08;TCP Cilent&#xff09;的设置步骤 3.2 模块与模…

Python深度学习基于Tensorflow(3)Tensorflow 构建模型

文章目录 数据导入和数据可视化数据集制作以及预处理模型结构低阶 API 构建模型中阶 API 构建模型高阶 API 构建模型保存和导入模型 这里以实际项目CIFAR-10为例&#xff0c;分别使用低阶&#xff0c;中阶&#xff0c;高阶 API 搭建模型。 这里以CIFAR-10为数据集&#xff0c;C…

SparkStructuredStreaming状态编程

spark官网关于spark有状态编程介绍比较少&#xff0c;本文是一篇个人理解关于spark状态编程。 官网关于状态编程代码例子: spark/examples/src/main/scala/org/apache/spark/examples/sql/streaming/StructuredComplexSessionization.scala at v3.5.0 apache/spark (github…

智能评估时代:SurveyKing开源问卷系统YYDS

最近有同事在设计问卷系统&#xff0c;我碰巧在 GitHub 上发现了一个开源的问卷/考试系统&#xff0c;觉得它非常不错&#xff0c;给他推荐了下。今天我打算和家人们分享一下这个发现。 项目介绍 官方网站&#xff1a;https://surveyking.cn/ github地址&#xff1a;https://…

springboot整合websocket,超简单入门

springBoot整合webSocket&#xff0c;超简单入门 webSocket简洁 WebSocket 是一种基于 TCP 协议的全双工通信协议&#xff0c;它允许客户端和服务器之间建立持久的、双向的通信连接。相比传统的 HTTP 请求 - 响应模式&#xff0c;WebSocket 提供了实时、低延迟的数据传输能力。…

数据库(MySQL)基础:约束

一、概述 1.概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 2.目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 3.分类 约束描述关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该字段的所有数据都是唯一…

QX---mini51单片机学习---(6)独立键盘

目录 1键盘简绍 2按键的工作原理 3键盘类型 4独立键盘与矩阵键盘的特点 5本节相关原理图 6按键特性 7实践 1键盘简绍 2按键的工作原理 内部使用轻触按键&#xff0c;常态按下按键触点才闭合 3键盘类型 编码键盘与非编码键盘 4独立键盘与矩阵键盘的特点 5本节相关原理…

硬性清空缓存的方法

前端发布代码后&#xff0c;我们是需要刷新页面再验证的。有时候仅仅f5 或者ctrlshiftdelete快捷键仍然有历史缓存&#xff0c;这时可以通过下面的方法硬性清空缓存。 以谷歌浏览器为例&#xff0c;打开f12&#xff0c;右键点击刷新按钮&#xff0c;选择【清空缓存并硬性加载】…

计算机网络5——运输层2TCP原理

文章目录 一、传输控制协议 TCP 概述1、TCP最主要的特点2、TCP的连接 二、可靠传输的工作原理1、停止等待协议1&#xff09;无差错情况2&#xff09;出现差错3&#xff09;确认丢失和确认迟到4&#xff09;信道利用率 2、连续 ARQ协议 三、TCP 报文段的首部格式 一、传输控制协…

代码审计-PHP模型开发篇动态调试反序列化变量覆盖TP框架原生POP链

知识点 1、PHP审计-动态调试-变量覆盖 2、PHP审计-动态调试-原生反序列化 3、PHP审计-动态调试-框架反序列化PHP常见漏洞关键字 SQL注入&#xff1a; select insert update delete mysql_query mysqli等 文件上传&#xff1a; $_FILES&#xff0c;type"file"&…

Kafka 执行命令超时异常: Timed out waiting for a node assignment

Kafka 执行命令超时异常&#xff1a; Timed out waiting for a node assignment 问题描述&#xff1a; 搭建了一个kafka集群环境&#xff0c;在使用命令行查看已有topic时&#xff0c;报错如下&#xff1a; [rootlocalhost bin]# kafka-topics.sh --list --bootstrap-server…

Vue自定义封装音频播放组件(带拖拽进度条)

Vue自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

51单片机软件环境安装

keli5的安装 把CID放到破解程序中 破解程序会给一串数字然后填到那个框中 驱动程序的安装 安装完了以后 设备管理器会出现这个 同时c盘会出现这个文件夹

巨量千川的投放技巧,一站式全自动千川投流工具(抖音玩家必备)

随着抖音平台的快速发展&#xff0c;越来越多的品牌和广告商意识到抖音的潜力&#xff0c;并希望能够通过投放广告来获取更多的曝光和用户参与。在这个过程中&#xff0c;巨量千川成为了抖音玩家必备的一站式全自动千川投流工具&#xff0c;为广告商提供了投放技巧&#xff0c;…

word-快速入门

1、熟悉word界面 2、word排版习惯 3、排版文本基本格式 1、word界面 选项卡 功能组 点击功能组右下角小三角可以开启完整功能组&#xff0c;获得启动器 软件右上角有功能显示折叠按钮 2、排版好习惯 &#xff08;1&#xff09;随时保存 &#xff08;2&#xff09;规范文件命…

408算法题专项-2015

题目&#xff1a; 分析&#xff1a;时间复杂度尽可能高效&#xff0c;提示可能存在一种空间换时间的算法 思路一&#xff1a;空间换时间 思考&#xff1a;开数组储存结点数据域&#xff0c;对于只出现一次或多次出现第一次的&#xff0c;保留&#xff0c;对于多次出现的&…
最新文章