事先申明:所有android 类型的学习记录全部基于《第一行代码 Android》第三版,在此感谢郭霖老师的书籍帮助。

1.注册activity

在第一组中,我创建了一个activity,并且编辑布局后加载显示了一个按钮,但实际上每一个activity都要先注册才生效,第一组中的activity实际上已经自动注册过了,打开app/sec/main/AndroidManifest.xml,其中注册的代码如下

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

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTest"
tools:targetApi="31">
<activity
android:name=".FirstActivity"
android:exported="false"
android:label="@string/title_activity_first"
android:theme="@style/Theme.ActivityTest.NoActionBar" >
</activity>
</application>

</manifest>

其中activity的注册声明要放在application中,使用activity进行注册,android:name制定了注册的acticity,android:exported默认为false,但假如想让此activity作为主activity则需要将其设置为true,这一项的意义为是否能被其他应用程序组件调用或跟它交互,android:label指定activity中标题栏的内容,注意如果不将下一项android:theme删除,是不显示标题栏的自然也就不显示android:label设定的内容了,android:theme是选择主题,我认为如此,之后应该会有所涉及。

因为不设置android的主activity,程序就不能运行,因为程序不知道将哪个activity作为要显示的东西,即使只有一个activiy,所以我们开始设置android的主要activity,第一步,需要在<activity>这个标签中加入<intent-filter>标签,第二步在<intent-filter>标签中加入以下代码、

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>

这两句代码在我的理解中诠释了将此activity作为主activity启动的目的,第一句中action标签的意味着结果和方向,android.intent.action.MAIN则是意味著将这个activity作为主要activity使用的结果,第二个则是达成结果的方式,如何向这个方向前进,即category中的 android.intent.category.LAUNCHER  ,使用app的launcher启动器来启动.

除此之外还需要修改activity标签本身的内容,实际完成的代码如下,

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

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTest"
tools:targetApi="31">
<activity
android:name=".FirstActivity"
android:exported="true"
android:label="the first activity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

之前也讲了android:exported应该为true,允许将此activity作为主要的activity,其次给android:label设定想设置的标题内容,此处与原书有点出入,可能是版本原因,所以我以实际版本为主,还有android:theme我认为作为主题设置,导致标题栏不显示,我选择删除后恢复为书中所提。

2.TOAST的使用

紧接1后,我学习toast这个提醒方式,它能够实现类似于弹出消息框的功能,这种弹出框是2s左右自己渐变消失的那种,不用手动操作,我觉得这个功能很好用,弹出错误信息或者提醒好用看起来又舒服。

在第一组中完成的按钮只是一个空壳,按那个按钮什么都不会发生,正好作为出发toast的触发点,我们以按一下跳出一个提醒的方式开始编译,首先定义toast的触发点,即设置按钮为触发点,我们需要在firstactivity中的oncreate()中添加几行代码,如下

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
val button1:Button = findViewById(R.id.button1)
button1.setOnClickListener{
Toast.makeText(this,"you press button1",Toast.LENGTH_SHORT).show()
}

紫色为添加的代码,我来解释他的意义,首先第一句代码是使用了findViewById获取布局中的元素,此处便是以res中id标识符为button1的元素,这里的标识符正好对应我们在设置按钮布局时填写的android:id中的@+id/ button1 ,但这个方法获取的元素是继承view的泛型对象,kotlin即使有自动推导的功能也无法推导它到底是什么,所以我们需要将其声明为Button类型,这就使用了val button1:Button,将button1变量声明成了Button类型。其次是第二,和三句代码,注册了setOnclickListener作为一个监听器,点击按钮就会执行监听器中的onclick()方法,而onclick中我们设置一个提醒,使用makeText创建一个Toast对象,传入三个参数,,第一个是Toast需要的content,即上下文(这里我觉得原文有些模糊,思考过后认为这里的上下文应该指的是在哪个activity弹出消息),而这个activity本身就是content对象,这里第一个参数就填入this,第二个参数的弹出显示的内容,根据你想弹出的文字自己填入,第三个参数就是弹出后提醒滞留的时间,有两个常量选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG,根据尾部的short和long自行选择,最后在maketext()后加.show()让其显示出来。

到此,按照现在版本的androidstudio来说,代码现在就是比较高效的了,在书中,androidstudio支持kotlin-android-extensions插件,是本来就支持的,根据此插件  val button1:Button = findViewById(R.id.button1)  这句代码可以去除,因为这个插件会根据布局文件定义的控件id即按钮的id button1创建一个同名字的变量,也就不需要findviewbyid这个方法了,但是,但是,但是,现在版本的androidstudio已经不自带kotlin-android-extensions插件了,据查询可以手动添加,我这里试验过发现没能成功就不演示了,如果之后成功会新发文章叙述。

3.在activity中使用Menu

menu自然译为菜单,在一个app中有时需要菜单,但空间的原因,菜单直接出现会占据大量空间,android提供了解决方式,让菜单在需要的时候出现,不需要则占据极小空间,也就是熟悉的三个竖点。

首先在res目录下建立menu文件夹,右键--》新增--》directory,打入menu,完成。接着在menu文件夹下右键--》新增--》Menu resource file,输入main作为文件名,点击ok。

这样就获得了一个在res/menu文件夹下的名为main的文件.

其次,在main文件中加入代码,完成的实际代码如下,

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>

其中用两个<item>标签来创建具体的某一个菜单项,分别使用android:id给两个菜单项设置唯一的标识符,再使用android:title来给菜单项指定名称。

接着返回FirstActivity文件,再其中来通过ctrl+o快捷键选择onCreateOptionsMenu来重写onCreateOptionsMenu()方法,添加如下代码

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}

在解释这个代码前,我们要了解一个事,这个涉及到kotlin的代码糖。

首先,java中有一个javaBean的概念,它是一个非常简单的JAVA类(本人实际只是略微了解java,对于这个例子理解不是很深,希望有人指点),会根据类中的字段自动生成相应的getter 和setter方法。如下所示:

public class book{

private int pages;

public int getPages(){

return pages;

}

public void setPages(int pages){

this.pages = pages;

}

}

而在kotlin中我们可以以一种近似于js的方式编写这两个语法结构

val book =Book()

book.pages = 500

val bookPages = book.pages

在这里看似没有使用setPages和getPages方法,但kotlin实际读取这段代码后会转换为调用setPages和getPages方法来实现book类的pages字段的设置和读取。

现在回到项目代码中,代码在下,

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}

这里同样也使用了kotlin语法糖,这里的menuInflater调用了父类的getMenuInflater()方法,来得到一个menuInflater对象,得到对象后使用inflate方法来创建菜单。

inflate方法创建菜单需要两个参数,第一个是我们要依据那个资源文件创建菜单,这里自然就是res/menu/main文件夹,输入,R.menu.main,第二个是我们把这个创建的菜单给哪个menu对象安装上,这里便选择onCreateOptionsMenu    传入的menu,这里的menu传入可为空,输入,menu。

之后还需要打return true,来表示允许将创建的菜单显示出来。

到此,创建菜单的第一阶段完成,我们成功的创建了一个有选项的菜单,但是只能展示,不能使用,因为我们没有定义菜单响应事件。

我们在FirstActivity中重写onOptionItemSelected()方法,如下所示:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.add_item -> Toast.makeText(this,"you click add",Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this,"you click remove",Toast.LENGTH_SHORT).show()
}
return true
}

仔细看你会发现我们使用之前说的语法糖,我指的是item.itemId这一句,我们调用这个item.itemId获取点击的是哪个菜单项,这里item.itemId本质上还是在背后调用了getItemid()方法,接下来when根据获得的item.itemId结果,来对应代码中的 R.id.add_item和 R.id.remove_item,并执行相应的逻辑,逻辑就是后面的toast提醒。

到此菜单的创建就完成了,菜单可以收起和放开,也可以点击有反应,如图;

//

Android Studio 学习-第三章 Activity 第二组的更多相关文章

  1. Android Studio 学习笔记(三):简单控件及实例

    控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...

  2. Android Studio 学习(三) 广播

    动态注册监听网络变化 创建intentFilter 并addAction 代表了监听哪个广播 然后使用registerReceiver()方法 将intentFilter 与 自己创建的监听器 传进去 ...

  3. Android Studio 学习 - 基本控件的使用;Intent初学

    Android Studio学习第三天. 今天主要学习 1. RadioButton.CheckBox.RatingBar.SeekBar等基础控件的使用. 结合Delphi中相类似的控件,在这些基本 ...

  4. 三、Android学习第三天——Activity的布局初步介绍(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...

  5. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  6. Android Studio系列教程三--快捷键

    Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...

  7. Android Sip学习(三)Android Voip实现

    Android Sip学习(三)Android Voip实现   Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...

  8. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

  9. Android studio学习笔记1

    Android studio学习笔记1 20201303张奕博 2023.1.13 studio布局 1.线性布局 Android的线性布局不会换行,当组件一个挨着一个地排列到头之后,剩下的组件将不会 ...

  10. Android studio学习笔记3

    Android studio学习笔记3 RelativeLayout常见属性 相对于父元素给控件布局 android:layout_centerHrizontal 若为ture水平居中 android ...

随机推荐

  1. Tarjan基础用法

    \(\operatorname{Tarjan}\) 基础用法 目录 \(\operatorname{Tarjan}\) 基础用法 \(\operatorname{Tarjan}\) 求最近公共祖先 前 ...

  2. C# object类型与dynamic类型的使用

    获取动态变化的类型属性 例: var类型的参数a中包含属性Name或Age 获取这个不固定的数据 首先验证a中存在的是什么属性 /// <summary> /// 验证object类型是否 ...

  3. 文盘Rust——起手式,CLI程序

    技术的学习从不会到会的过程是最有意思的,也是体会最多的.一旦熟练了,知识变成了常识,可能就失去了记录学习过程的最佳时机. 在我看来学习一门计算机语言和学习人类语言有很多共通之处.我们学习人类语言是从单 ...

  4. Go代码包与引入:如何有效组织您的项目

    本文深入探讨了Go语言中的代码包和包引入机制,从基础概念到高级应用一一剖析.文章详细讲解了如何创建.组织和管理代码包,以及包引入的多种使用场景和最佳实践.通过阅读本文,开发者将获得全面而深入的理解,进 ...

  5. ISO/OSI七层模型的分层与作用

    ISO/OSI的七层模型 第七层:应用层 为用户提供服务,给用户一个操作界面,如window的图形界面,Linux的命令行: 第六层:表示层 数据提供表示:把01二进制转换为图像数字等用户可以看懂的内 ...

  6. Spring注解之@ExceptionHandler 统一异常处理和获取方法名

    摘要:在 Spring Boot 中,使用Spring注解@ControllerAdvice 和 @ExceptionHandler 统一处理异常,并捕获方法名,从而快速定位错误原因. 背景分析    ...

  7. 实战指南,SpringBoot + Mybatis 如何对接多数据源

    本文分享自华为云社区 <实战指南,SpringBoot + Mybatis 如何对接多数据源>,作者:战斧. 在我们开发一些具有综合功能的项目时,往往会碰到一种情况,需要同时连接多个数据库 ...

  8. go语言 包依赖管理-构建完整的依赖项目:目录结构及包的调用

    目录结构: <home>/ |-- greetings/ |-- hello/1.分别进入对应目录创建以上目录结构 //bash切换到用户主目录 cd $HOMEPAHT$ //bash新 ...

  9. Jmeter连接数据库sql语句操作,查询后取值做变量

    第一步 :导入jar包 第二步 :创建JDBC Reques 第三步 :创建JDBC Connection Configuration  第四步:在request中输入数据进行操作 Query Typ ...

  10. RK3588平台产测之ArmSoM产品低温环境测试

    1. 简介 专栏总目录 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行严苛的多次全方位的功能测试以及性能压力测试才能 ...