gtf35 的小窝 - 入门教程
type: channel
link: https://blog.gtf35.top/tag/入门教程
items: （第二十二讲）含蓄的启动应用
items: （第二十一讲）在活动之间跳跳跳
items: （第二十讲）手动创建活动
items: （第十九讲）对话框
items: （第十八讲）其他常见的控件
items: （第十六讲）线性布局和相对布局
items: （第十五讲）异常捕获---让程序更加健壮
items: （第十四讲）详解 EditText 输入框
items: （第十三讲）动手做一个套壳App
items: （第十二讲）Button 及点击事件

（第二十二讲）含蓄的启动应用
type: item
date: 2018-05-24T16:00:00+00:00
description: 讲作业先把昨天卖的关子给说了，怎么才能按返回键实现网页后退。我们需要做一个返回键拦截，然后手动控制网页后退。请看代码：public boolean onKeyDown(int keyCode, KeyEvent event) { //支持网页后退 if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } return super.onKeyDown(keyCode, event); }我们首先重写了 onKeyDown 方法，在这个方法体里做一下判断，如果按的是返回键同时网页可以后退就调用 webview 的 goBack 方法。不会的同学就直接复制我的这个吧，我当时就是。随着技术的增长积累，就明白了。隐式 Intent有的时候我们并不是明确的要启动某一个活动，比如我要打开系统浏览器，我也不可能把每一个浏览器的活动都写一遍。这时就需要用到隐式 Intent 了。隐式 Intent 是和系统描述我们要做什么，然后系统就会打开对应可以处理的程序。比如说我告诉系统我要打开一个网页，系统就会自动调用浏览器来执行。使用 action 限定隐式 Intent：一个活动要想能被别的活动调用，首先被调用的Activity在AndroidManifest.xml文件中要有一个带有<intent-filter>并且包含<action>的Activity，并且设定它能处理的Intent。将category设为"android.intent.category.DEFAULT"。action的name是一个字符串，可以自定义，例如我在这里设成"webview"：<activity android:name=".webview_activity"> <intent-filter> <action android:name="webview"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>然后，在MainActivity，才可以通过这个action name找到上面的Activity。下面两种方式分别通过setAction和构造方法方法设置Action，两种方式效果相同：1、setAction方法Intent intent = new Intent(); intent.setAction("webview"); startActivity(intent);2、构造方法直接设置ActionIntent intent = new Intent("webview"); startActivity(intent);通过设置Action字符串，表明自己的意图，即我想干嘛，需要由系统解析，找到能够处理这个 Intent 的 Activity 并启动。比如我想打电话，则可以设置Action为"android.intent.action.DIAL"字符串，表示打电话的意图，系统会找到能处理这个意图的Activity，例如调出拨号面板。 不过需要注意的是：这个Activity其他应用程序也可以调用，只要使用这个Action字符串。这样应用程序之间交互就很容易了，例如手机QQ可以调用QQ空间，可以调用腾讯微博等。 因为如此，为了防止应用程序之间互相影响，一般命名方式是包名+Action名，例如这里命名"webview"就很不合理了，就应该改成"com.intent.test.webview"。 再回过头去看看 AndroidManifest.xml 你会发现不光有 action 还有个 category 。这么说吧，要 Action 和 category 同时匹配上才行。因为「android.intent.category.DEFAULT」是一个默认的 category 所以就不用写了。总结为啥这一节这么匆忙，因为，，，，这东西了解就好，到用的时候再回来看一下就好了。一共二十二讲，我觉得你应该也算是入门了吧，你已经具备了自己探索的能力了。第一季是时候说再见了，我会利用一段的时间闭关去提升自己的能力，以更好的姿态面对大家。不过不用伤心，大家敬请期待第二期：『烽哥带你彪程序』2020/5/24 注：这是我 2018 年高中毕业的假期写的，当时并没有自己搭建博客，近期我给这一系列的文章都放到我自己的博客上。当时写这个系列文章的想法就是扎实下基础，然后能帮到更多的人就更好了，但是大学开学之后就开始了新生活，没有大块的时间去编撰，系列文章也没有再更新过。但是我其实并不想放弃这个系列，那就，有缘再见吧，拜拜ヾ(•ω•`)o

（第二十一讲）在活动之间跳跳跳
type: item
date: 2018-05-23T16:00:00+00:00
description: 讲作业话说这次的作业是设计一个布局：这大概也是之前学过的了，直接贴一下代码吧：<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/icon" android:layout_centerHorizontal="true" android:background="@drawable/ic_magnify" android:gravity="center" android:paddingTop="500dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/icon" android:orientation="horizontal"> <EditText android:id="@+id/edittext" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:hint="请输入关键词或网址" /> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/ic_send" /> </LinearLayout>TIPS: EditText 可以通过「android:hint="提示词"」来设置提示词，在用户输入内容时提示词会自动消失；在清空输入框时，提示词又会重写出现最外层的布局是一个相对布局，LOGO 的图片固定大小为 100dp*100dp ，距离顶端 500dp，对齐方式为居中。然后紧接着一个水平的线性布局宽填充父布局，高为适应大小。然后在线性布局里放置一个 EditText，一个 ImageView 。其中 EditText 高度和 ImageView 的高度相同都是 50dp ，因为那个小飞机是正方形，所以 ImageView 的宽也设置为 50dp 这也都不难。重点是，他需要背后的逻辑，我们需要让他输入关键词之后，该搜索的搜索，该跳转的跳转。Intent 活动之间的桥梁随着应用的开发，一个活动肯定解决的不了问题，那么就需要建立多个活动。不过打开程序时都是启动的主活动，如果要启动别的活动就需要使用 Intent 了。显式 Intent我们昨天已经讲过了怎么创建活动。我们依旧还是在 com.intent.test 包上右键~new~Activity~Empty Activity，弹出新建活动的窗口，我们呢这次就把新建的活动叫做 「webview_activity」，记得这次勾选 Generate Layout File 让 AS 为我们自动创建布局文件，然后在「Layout File」中给布局布局文件起一个名字，就叫「activity_webview」吧。点击 Finish 结束：随后就可以看到创建好的布局和 Java 文件：然后我们配置下 MainActivity.java ，为那个小飞机加一个点击事件来跳转到 webview_activity：ImageView search = (ImageView)findViewById(R.id.search); search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, webview_activity.class); startActivity(intent); } }); Intent 翻译成中文就是意图的意思。Intent 的构造函数需要传入两个参数，第一个是当前活动的上下文，通常传入当前「类名.this」就行。第二个参数需要传入要启动的目标活动，通常传入「目标活动类名.class」即可。这样我们就构造出了我们要启动一个名字叫「webview_activity」的活动，意图很明显。这样的方式就叫做显示 Intent …

（第二十讲）手动创建活动
type: item
date: 2018-05-22T16:00:00+00:00
description: 前言话说上次没作业，这次就直接讲课。我们之前好像一直在用 AS 自动为我们创建的活动，这样糊里糊涂的可不行，今天我们就来探究下 AS 究竟默默的为我们做了什么？创建一个新项目我们在创建新项目时直接就可以运行是因为 AS 帮我们创建好了活动，为了理解原理我们这次关闭自动创建活动，来手动创建一个活动。打开 AS 创建一个新项目，Application name(应用名字) 填 IntentText，Company domain(公司网站)空着，Project location(项目文件存放地址) 选一个能找到的地方，Package name(包名) 填 com.intent.test，然后下一步1526980287343这里仍然默认，直接 Next 下一步：这里注意了，要选「Add No Activity」，不自动添加 Activity。1526981963764然后点击「Finish」结束配置。将项目结构转换成「Project」，app/src/main/java/com.intent.test 应该是空的了：而且 appsrcmainres 下应该也没有 layout 布局文件夹：手动创建布局项目创建好了，我们就先来创建布局吧，在 res 上右键，new~XML~Layout XML File1526991322612打开新建布局界面。第一行时输入布局文件的名字，默认是 layout；第二行是根布局，默认是 LinearLyout。这里就保持默认不变吧，直接点击 finish。然后就会发现这个文件，在里面随便加一个控件，比如 Button：手动创建 Java 文件布局准备好了，我们现在开始准备 Java 文件：在 com.intent.text 上右键 new~Activity~Empty Activity，来创建一个 Java 文件：弹出新建 Android Activity 的对话框，Generate Layout File 的意思是自动为活动创建布局，因为我们刚才已经手动创建了，所以不勾选。Launcher Activity 是把当前活动表示为主活动，由于我们是要探究，所以也不勾选。最后的 Backwards Compatibility 是用 AppCompat 来将项目向后兼容。直接点击 Finish，完成设置然后就能看到创建好的 MianAvtivity：1526993735564默认是这样的：在 Android 中，活动必须继承(extends) 自 Activity 或 AppCompatActivity，并且重写 onCreate() 方法，才能具有活动的特性，也才是一个活动。TIPS：重写的意思是一个类继承自父类后，就具有了父类的所有方法和特性。如果子类继承自父类以后，想要修改父类的方法，只需要新建一个完全一样的方法（访问控制符，方法名，形参列表都相同），就可以把父类的方法覆盖掉。为了防止手抖打错了，需要在重写的方法前加「@Override」，如果没有重写成功（像返回值类型错了之类的），编译器会报错，来警告开发者这里 AS 已经帮我们完成了这一步，现在我们要修改现有的代码来引入布局。在 onCreate 方法中加入一行代码：setContentView(R.layout.layout);其中 R 代表引用资源，第一个layout 代表 layout 文件夹，最后一个 layout 代表布局的 XML 文件的文件名。这样就完成了布局的。TIPS：用 AIDE 的小伙伴注意了，AIDE 不支持直接创建活动，你只能手动完成。而且你在新建 Java 文件时会发现他说空白的！没有自动完成任何东西。你只能从已经创建好的项目里复制一份过来。配置 AndroidManifest.xml还记得之前讲的，任何活动都需要在 AndroidManifest.xml 中注册吗？现在就打开 AndroidManifest.xml 来看看：<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.intent.test"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"></activ…

（第十九讲）对话框
type: item
date: 2018-05-20T16:00:00+00:00
description: 讲作业先来回顾下上节课的题目「为什么 ImageView 会有背景和前景？有什么应用？ 」答案让我们在实践中去体会吧。先在「drawable」里放好我们的素材：然后设计布局<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageview" android:padding="60dp" android:background="@drawable/ic_backgroind"/>其中 padding 属性控制的是控件内容与空间边缘的距离效果如下：还没猜到要干什么？没事，接着看，我们添加 Java 代码：public class MainActivity extends Activity { int MODE = 0; int UNLOVE = 0; int LOVE = 1; ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView)findViewById(R.id.imageview); imageView.setImageResource(R.drawable.ic_heart_outline); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (MODE == UNLOVE){ MODE = LOVE; imageView.setImageResource(R.drawable.ic_heart); } else { MODE = UNLOVE; imageView.setImageResource(R.drawable.ic_heart_outline); } } }); } }我先是定义了三个整型的变量，其中 MODE 描述的是当前的状态，LOVE 代表实心，UNLOVE 代表空心。然后定义了一个 ImageVIew 用于保存按钮的实例。随后在 「setContentView」之后直接通过「findViewById」取得按钮的实例，然后通过设置前景来让空心显示出来。然后为这个 ImageView 绑定了一个点击监听器，在点击之后先通过 MODE 判断当前的状态，然后根据状态来切换前景图案。效果图如下：不用我说，大家已经知道前景和背景的用处了。对话框 AlertDialog「AlertDialog」就是一个小框框，在窗口最顶层，能屏蔽掉其他控件的交互的 Window 。一般都是用来提示或询问重要内容的。下面的代码演示了一个最简单的对话框：new AlertDialog.Builder(MainActivity.this) //构造一个 Builder .setTitle("我是标题") //设置标题 .setMessage("我是正文") //设置正文 .create() //创建对话框 .show(); //显示对话框也可以这么写，至于你怎么写就看你的喜好了：AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); dialog.setTitle("我是标题"); dialog.setMessage("我是正文"); dialog.create().show();先通过「AlertDialog.Builder」来创建出一个 AlertDialog 实例，这个过程需要传入当前类的实例，通常就是「类名.this」。然后调用他的各种方法来进行配置，最后调用「dialog.create().show();」来将对话框创建显示到屏幕上。效果图如下：加入按钮但是，，，貌似别人家的对话框有按钮呀，观察并运行如下代码：AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); dialog.setTitle("我是标题"); dialog.setMessage("我是正文"); dialog.setPositiveButton("肯定按钮", new DialogInterface.OnClickListener() { @Override public v…

（第十八讲）其他常见的控件
type: item
date: 2018-05-17T16:00:00+00:00
description: 先来回顾一下上节课的题目「做一个简单的遥控器的界面」，如图：整体的思路就是先弄中间的十字，再弄下面的按钮。中间的十字可以先把「OK」固定的中间，然后四周的根据他来定位：源文件丢失了，请移步这个链接查看，抱歉点击这里跳转

（第十六讲）线性布局和相对布局
type: item
date: 2018-05-15T16:00:00+00:00
description: 0x0 前言一个炫丽的界面往往都是由很多的小控件组成的。队伍整齐划一，往往是因为他们按队列站。一个程序的界面想做好，就要依赖布局。布局描述了控件在屏幕中的位置和定位方式。布局有很多种，我们今天先来介绍相对简单的线性布局。1x0 线性布局（LinearLayout）顾名思义，「线性布局」可以把其中包含的视图按线性排列。换句话说，「线性布局」可以将其他视图在单个列中水平排列，也可以垂直排列在单个行中。 之前我们都是把控件放在他里面，因为这种布局通常情况下控件之间不会重叠。现在来看一下他的继承结构：可以看到他是一种 ViewGroup（混眼熟），以下代码展示了如何在布局XML文件中使用线性布局：<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> </LinearLayout>1x1 orientation这里有一个新属性「orientation」，可以通过他指定是否在行或列中显示子视图 ：属性值解释orientationhorizontal水平排列 vertical竖直排列我们回顾一下细节，我们以前的项目结构就是「vertical」，也就是竖直排列。新建一个项目，放三个「Button」，代码如下：<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> </LinearLayout>这里通过「android:orientation="vertical"」指定了根布局竖直方向排列，里面有三个「Button」，长和宽都是「wrap_content」，效果图如下：现在我们试试改成水平方向：「android:orientation="horizontal "」：果真和我们预想的一样，但是要注意几点：如果不指定「orientation」的值，默认就是水平如果「LinearLayout」的排列方式是水平的话，内部的控件的宽就绝对不能是「match_parent」，因为这样那个控件在充满屏幕的同时就会把别的控件挤出屏幕，别的控件就没有可放置的位置了。如果「LinearLayout」的排列方式是竖直的话，内部的控件的高就绝对不能是「match_parent」，道理同上。1x2 布局中的对齐方式我们再来看一个新属性「android:layout_gravity」，看起来有没有一点眼熟？没错。我们之前学过「android:gravity」这个属性，也应用过许多次了，他可以指定文字在控件中的对齐方式。我们来打量打量这个新属性「layout_gravity」比之前的多了一个「layout」。「layout」是布局的意思，联想起来就是控件在布局中的对齐方式。说白了，「gravity」是控件内部的元素(像文字啥的)相对于控件的对齐方式； 而「layout_gravity」是「LinearLayout」内部的控件相对于「LinearLayout」的对齐方式。「layout_gravity」和「gravity」的可选值几乎一样，而且水平和竖直都能用。需要注意的是当「LinearLayout」的排列方式。需要注意的是当「LinearLayout」的排列方式是「horizontal」时只有垂直方向的对齐方式才会生效，因为此时水平方向上的长度是不固定的，每添加一个控件，水平方向的长度都会改变，因而无法指定水平方向上的对齐方式。同理，当「LinearLayout」的排列方式是「vertical」时只有水平方向的对齐方式才会生效。继续修改上面的代码：<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> </LinearLayout>这里「LinearLayout」的排列方向是「horizontal」，也就是说只能指定在垂直方向上的排列方式：将「Button」的「layout_gravity」分别指定为「top」，「center_vertical」，「bottom」，效果图如下：1x3 按比例调整大小有的时候我们主要几个控件按比例填充屏幕，比如，聊天app的输入框。下面我来介绍一个新属性：「layout_weig…

（第十五讲）异常捕获---让程序更加健壮
type: item
date: 2018-05-13T16:00:00+00:00
description: 0 公告已开设交流群，回复「群」获取加群方式逐步减少 AIDE 的演示，因为 AS 和 AIDE 的代码一样，只是操作方式不一样。AIDE 的基本操作都已经演示过了。Android Studio 以后均简称为 AS ，且不再重复1 注意为了暂时保持 AS 和 AIDE 代码的统一性，在 AS 新建项目时请不要勾选 「Backwards Compatibility (AppCompat)」。15259406165292 讲作业昨天的作业是做一个简易的加法计算器，先来考虑需求，应该是允许输入两个数点击一个按钮，出现结果。新建一个项目：「计算器」包名就是「edittext.test.jishuan」，这样我们在设计布局的时候就加入两个 EditText 来让用户输入，然后安放一个 Button 来确定，最后在一个 TextView 来显示结果。在细节上来说，EditText 应该只允许输入数字：<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext_first" android:text="第一个加数" android:gravity="center" android:inputType="number"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="+" android:gravity="center"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext_second" android:gravity="center" android:text="第二个加数" android:inputType="number"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textview_result" android:gravity="center" android:text="结果"/> </LinearLayout>虽然有点长但是都是我们熟悉的属性，效果如下：布局代码操作演示：现在来想一想逻辑，应该是用户点击按钮之后先判断一下两个输入框是否为空，然后获取两个输入框里的数值，再相加，最后显示到 TextView 上：public class MainActivity extends Activity implements View.OnClickListener{ //接口方式实现 onClick() Button btn; //计算按钮 EditText et1, et2; //两个输入框 TextView tv; //显示结果的 TextView @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //初始化控件 et1.setOnClickListener(this); //绑定第一个输入框的点击监听器 et2.setOnClickListener(this); //绑定第二个输入框的点击监听器 btn.setOnClickListener(this); //绑定按钮的点击监听器 } @Override public void onClick(View view) { switch (view.getId()){ case R.id.edittext_first: //点击第一个输入框时清空原有的数据 et1.setText(""); break; case R.id.edittext_second: //点击第二个输入框时清空原有的数据 et2.setText(""); break; case R.id.button_ru…

（第十四讲）详解 EditText 输入框
type: item
date: 2018-05-10T16:00:00+00:00
description: 0 讲作业我昨天漏讲了加网络权限（视频里的没问题），唉，人真是老了。你想呀，一个「小淘宝」肯定是要网络权限的呀，现在我们就把昨天图文教程缺的补上，给「小淘宝」添加网络权限。打开 「AndroidManifest.xml 」，加入「uses-permission」节点：<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.github.uitest"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>动图演示：至于把「小淘宝」改成「QQ空间」，就是把网址改成 QQ 空间的网址「https://i.qq.com」即可。TIPS：WebView 只可以打开以「http://」或「https://」开头的网址，比如「www.baidu.com」必须写成「https://www.baidu.com」。动图演示：1 EditText 输入框1x1 XML 属性Edit 是编辑的意思，Text 是文本的意思。这玩意看起来很眼熟有没有，呃....好像并没有。EditText 是 TextView 的子类，用于输入和修改文本的一个控件。定义 EditText 时，必须指定TextView_inputType属性。例如，对于纯文本输入将inputType设置为“text”，以下是典型布局代码：<EditText android:id="@+id/plain_text_input" android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="text"/>inputType 输入类型这里有个新面孔，就是上面提到的「inputType」属性。「input」是输入的意思，「Type」是类型的意思，合起来字面意思就是输入类型。来看个例子：输入密码时输入框是看不到文字的，只有一堆点点；再譬如某些情况下只能输入数字，这都是「inputType」的功劳。「inputType」可配置显示的键盘类型，可接受的字符类型以及编辑文本的外观。例如，如果您想请求用户输入密码，则可以将inputType设置为「textPassword」，这样输入的字符就显示为小点点。说白了，你没啥特殊要求 「inputType」的值就写「text」，要是输入普通的密码就写「textPassword」，要是输入只有数字的密码就写「numericPassword」。Google 的 API 上要求是必须定义「inputType」，但是实际开发时不定义也不会有问题，就相当于「text」。但还是建议按照 API 文档上说的定义一下比较好。imeOptions 输入法编辑器选项还有一个值得关注的属性：在浏览器地址栏输入文本时，输入法右下角是搜索：在发微信时，输入法右下角是回车：输入法右下角的样式就是「imeOptions」属性控制的。「ime」英文全称「Input Method Editors」，「Input Method」是输入法的意思，「Editors」是编辑器的意思，「Options」是选项的意思，「imeOptions」合起来就是「输入法编辑器选项」的意思。这个属性的值的键盘右下角的字的对应关系是：值输入法Java代码actionDone完成EditorInfo.IME_ACTION_DONEactionGo前进EditorInfo.IME_ACTI…

（第十三讲）动手做一个套壳App
type: item
date: 2018-05-09T16:00:00+00:00
description: 0x0 讲作业话说昨天的视频太苦了，页面里的小视频就是不清晰，还得外链。这一期干脆上传 B 站得了，高清还没广告。你可以在公众号回复 “13” 来获取可以点击的超链接，或者是在图文内长按网址复制粘贴到浏览器观看（微信限制，必须手动复制）。在 main_activity.xml 加入一个新按钮，都是旧知识，哪里不懂的就再看一遍昨天的。没事。忘记了太正常了。源文件丢失了，请移步这个链接查看，抱歉点击这里跳转

（第十二讲）Button 及点击事件
type: item
date: 2018-05-08T16:00:00+00:00
description: 0x0 前言昨天我们介绍了 TextView 的一些属性，今天会介绍 Button 的一些属性和如何绑定监听器。今天一些过于基本的内容将不会提供动图，代替的是在文末有一个全操作的视频，供大家系统性的学习。1x0 Button 按钮我们打开上一节的 UIText 项目中的 activity_main.xml (AIDE 为 main.xml)，删掉里面的 TextView ，加入一个 Button 。最后效果如下：<?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="horizontal"> </LinearLayout>这些属性都是昨天我们介绍过的，属性值说明layout_widthmatch_parent将控件的宽指定为填充父布局layout_heightwrap_content将控件的高指定为适应控件大小idbutton将控件的 ID 指定为 buttontext按钮将控件的文字指定为“按钮”运行效果图如下，操作过程见尾部视频第一节1x1 点击事件但是我们这个按钮中看不中用，点击了什么反应都没有，那是因为还没有给他添加逻辑。如果需要要让按钮在点击时作出反应，我们就需要为 Button 注册一个 onClick（点击）事件监听器。打开 MainActivity.java 加入代码，如下所示：public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button mButton = (Button)findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //在此处添加被点击时的逻辑 } }); } }在第 8 行，我们先是定义了一个 Button 类型的变量 mButton 。然后为了他赋一个初始值：我们的 Button，然后 mButton 就代表了我们这个代码了。但是怎么获取我们的 Button 呢？我们先通过 findViewById(R.id.xxx) 来获取我们的 Button 实例，其中xxx就是在布局里定义的 ID 。findViewById 返回的是个 View 对象，我们需要通过 (Button) 向下转型成一个 Button 对象。这个过程连起来就是第 8 行。这时我们的 mButton 就可以代表我们的按钮实例了。然后通过调用 mButton 的 .setonClickListener() 来为Button 注册一个点击监听器。在 .setonClickListener() 内需要传入一个 View.OnClickListener(){} 对象。然后在 View.OnClickListener(){} 里重写 onClick() 方法，在 onClick() 方法里编辑自己的逻辑。是不是听懵了？？？没事，我当初也懵了很久，一直不明白为什么要这样。那时我查遍教程，由于我特别差的 Java 基础，根本看不透，看不懂，和你们现在一样。我的做法就是硬记下来，在需要用这段时就照猫画虎写下来。等我经验多了，基础知识多了，我不但背下来了，我还理解了。我知道这么多你背不下来，我也背不下来。我建议你去看看文末的视频，里面演示了如何使用代码补全功能，只要大体记住结构和关键词，就可与补全代码。但是我要求你没补全一次就默默背一次，这样才能早日修成正果。1x2 使用 Toast接下来我们先小试牛刀，添加一个逻辑，就是弹出一个 Toast 。所谓的 Toast 就是在屏幕下方的一个小气泡，如下图所示Toast 的用法比较简单，通过静态方法 makeText() 创建出一个 Toast 对象，然后调用 show() 方法来把 Toast 显示出来。其中 makeText() 需要传入 3 个参数：参数说明ContextToast 的上下文，由于活动本身就是一个 Cont…