Day3
请结合代码项目学习,代码都在此系列第一篇开头,代码中有很多注释。
一.笔记
Day3的代码来看,就是在layout写布局,然后在src的MainActivity.java里决定使用哪个布局文件。
【项目结构】
src文件夹:存放代码的文件夹,中间有包结构。
gen文件夹:存放的是项目自动生成的配置java文件。开发者不能改动。
bin文件夹:存放一些编译生成的文件,是存放编译生成的apk安装包的位置。
res文件夹:主流资源文件夹
drawable-??dpi文件夹:存放不同分辨率的贴图
layout文件夹:存放布局文件,指定控件显示效果和位置的文件。
AndroidManifest.xml 清单文件:存放项目配置的参数
【布局 Layout】
布局是摆放控件的规则。
Tip:
打开Windows显示文件扩展名的功能。
步骤
控制面板 --- 查看类别:大图标 --- 文件资源管理器选项 --- 查看 --- 取消勾选“隐藏已知文件的扩展名” --- 确定
【保持项目统一(重要)】
每次新建项目后,需要执行如下操作,让新创建的项目结构一致且精简。
1. 进入res---layout,删除activity_main.xml文件
2. 进入src---MainActivity.java代码,进入onCreate方法,
更改setContentView(R.layout.activity_main);方法为
setContentView(R.layout.fragment_main);
3.仔细删除MainActivity.java文件中除了onCreate以外的方法。
4.继续删除onCreate中的多余代码直到:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
}
5.保存(Ctrl+S)所有更改的文件后,再次运行程序。
Tip:
在写代码的过程中,要善于使用自动补全的快捷键 Alt + /
【通用属性】
android:layout_width="match_parent" 宽度
android:layout_height="match_parent" 高度
可选值:(1) match_parent
匹配父控件,上级多宽/长就多宽/长。
(2) wrap_content
包裹元素,内部的控件多宽/长就多宽/长。
(3) fill_parent
功能完全等同match_parent,通常使用match_parent
(4) 手动输入一个固定宽度,单位dp
背景颜色,采用RGB记色法,红绿蓝(0-255),采用十六进制。
在线颜色选择器(可根据选择的颜色得到形如 #fa7c09 的颜色代号):http://tools.jb51.net/static/colorpicker/
android:background="#fa7c09"
外边距
android:layout_margin="10dp"
还有单独设置某个方向的属性
内边距
android:padding="100dp"
还有单独这是某个方向的属性
设置某个布局或控件中子元素的重力方向
android:gravity="bottom|right"
【布局 Layout】
布局是摆放控件的规则,可以认为布局是一个透明的容器。
透明容器内部按照规则去摆放控件。
只关注android:开头的即可
LinearLayout 线性布局
线性布局表示内部的控件横着或者竖着排成一排。
android:orientation="vertical" 方向
可选值:horizontal(水平),vertical(垂直)
RelativeLayout 相对布局
在某个参照物的某个方向或位置,相对布局的第一步就是给参照物起一个名字(id).
相对布局中,如果不指定子控件的相对位置,默认都在左上角堆放。
例子:创建一个新的布局文件
1)选中res---layout文件夹,右键---New---Android XML File
2)在弹出的窗口中的File栏,输入要创建的布局文件的名称(全英文小写,单词间使用_分割)
3)在下方的Root Element栏目中选择要使用的布局后点击Finish按键完成创建
给某个布局或控件起一个id
android:id="@+id/text1"
在某个参照物的右边
android:layout_toRightOf="@id/text1"
在某个参照物的左边
ndroid:layout_toLeftOf="@id/text1"
在某个参照物的下面
android:layout_below="@id/text1"
在某个参照物的上面
android:layout_above="@id/text1"
在父控件的中间
android:layout_centerInParent="true"
在父控件的水平中心
android:layout_centerHorizontal="true"
在父控件的垂直中心
android:layout_centerVertical="true"
对齐父控件的左边
android:layout_alignParentLeft="true"
对齐父控件的右边
android:layout_alignParentRight="true"
对齐父控件的顶端
android:layout_alignParentTop="true"
对齐父控件的底部
android:layout_alignParentBottom="true"
对齐某个控件的左边/右边
android:layout_alignLeft="@id/btn1"
android:layout_alignRight="@id/btn1"
对齐某个控件的顶端/底部
android:layout_alignTop="@id/btn1"
android:layout_alignBottom="@id/btn1"
【设置要使用的布局文件】
1.进入src---MainActivity
2.在onCreate方法里,有一个setContextView方法
Tips:
1.如果程序确定没有错误,项目还是有红叉,需要点击Project --- Clean 清理项目后再运行。
2.android:text="你好2" 直接在双引号中写显示的文字即可,黄线不需要关注。
3.无论操作什么软件,都养成点击Ctrl + S的习惯
【如何按照比例布局?】
线性布局支持比例划分的。
//共同作用分宽度
android:layout_width="0dp"
android:layout_weight="2"
【布局嵌套】
布局之间可以嵌套,对于外层的布局而言,内层的布局也相当于一个控件。
理论上布局可以嵌套任意层次,但是为了性能起见,应该尽可能的少用嵌套。
【TextView 文本显示控件】
设置显示文字
android:text="我今晚想吃卷饼"
如果给TextView设置比较大的宽度和高度时,文字默认在左上。
可以通过设置重力方向来控制文字的位置。
android:gravity="center"
设置文字大小(单位使用sp)
android:textSize="10sp"
设置为浏览器的超链接
android:autoLink="web"
【Button 按钮】
Button是TextView的子类,拥有TextView的绝大多数属性。
另外身为一个子类,Button也对其父类TextView做出了一些改动。
例如:文字默认居中,增加了按钮的点击效果。
【ImageView 图片显示控件】
功能用于显示图片
设置显示的图片
android:src="@drawable/sdust"
图片命名规则:
1.不允许数字开头
2.不允许大写英文
3.不允许中文和特殊的符号
Day4
一.笔记
【监听器 Listener】
类似于提前先设定好某个“约定”(某个达成的条件A→执行某段代码B·)。
如果在程序运行的过程中达成了这个条件A,则自动触发B。
如果在程序运行的过程中没有达成条件A,则永远不会触发B。
“万物皆对象”
xml中布置控件(控件必须有id) → .java中找到对象
【输出Log日志】
在程序的关键节点输出一些调试信息,这些信息无法被用户感知,但是可以被开发者在后台截取。
例子:点击一下按钮,在后台输出一句调试信息。
捕获日志的两种方式:
1.IDE(集成开发环境):Eclipse ?????????怎么没有
(1)确认当前的环境是否已经连接到对应的模拟器上,点击Open Perspective...(右上角)
(2)选择新窗口中的DDMS窗口,点击Open按钮
(3)在DDMS窗口的Devices标签中,确认设备已经连接
(4)确认连接无误后回到编辑窗口的logcat窗口中
(5)在Logcat窗口的左上角,点击绿色的加号
(6)在新弹出的窗口中,前两个空输入标签名称(如MainActivity),点击OK按钮。
2.adb(安卓调试桥)---不做要求
需要先配置环境变量
进入到开发环境的目录下,有一个sdk文件夹,里面有一个platform-tools文件夹。
复制platform-tools的路径到环境变量中。
点击Win+R,输入cmd,回车。
在命令行黑窗口中,输入adb,回车,进行验证。
adb命令:
验证已经连接的设备
adb devices
筛选Log
adb logcat -s 标签名称,例如:
adb logcat -s MainActivity
【语法:多态】
在Java中,父类引用可以指向子类对象。
多态:一种表达,多种状态。
多态触发的条件:
1.要有继承
2.子类要覆盖父类的方法
3.父类引用指向子类对象
【内部类】
1.成员内部类
成员内部类作为一个成员依附于另一个中,可以访问外部类所有的成员变量和方法。
成员内部类是跟外部类关系最紧密的一种内部类。
package com.test;
//外部类
public class Outer {
private String str = "这是外部类的私有成员变量";
private void method() {
System.out.println("这是外部类的私有成员函数");
}
//成员内部类
public class Inner{
public void test() {
//成员内部类可以调用外部类的变量和方法
System.out.println(str);
method();
}
}
}
package com.test;
import com.test.Outer.Inner;
public class Test {
public static void main(String[] args) {
// 实例化内部类
// 方式1:直接使用外部类对象去调用内部类
Outer outer = new Outer();
Outer.Inner inn = outer.new Inner();
//方式2:一步完成
Outer.Inner inn2 = new Outer().new Inner();
//也可以通过导包来省略外部类类型,直接使用内部类类型
Inner inn3 = outer.new Inner();
//在实际的使用中,成员内部类更多的是在外部类中使用
//即Inner直接在Outer中使用。
//测试内部类对外部类的访问
inn.test();
}
}
2.匿名内部类
匿名内部类是一个没有名字的类隐式地实现(继承)了一个接口(抽象类),
并且返回一个这个没有名字的类的对象。
性质:
1.没有构造方法
2.没有关键字class、extends、implements
匿名内部类的常见使用场合:
1.只用到这个没有名字的类一次
2.类定义后马上使用
3.类比较小
4.给类命名不会导致代码更容易被理解
5.通常用于传参
【自定义页面 Activity】
1.在src中创建自定义页面类
2.补充自定义页面类的继承和onCreate方法
3.自己写一个布局文件
4.给自定义的页面类设置自己写的布局文件
5.在清单文件中注册自定义页面(见下面的问题一)
清单配置文件如下:
二.心得
1.问题一
在src和layout下如果有两组或多组文件,那么哪一组才是主页面呢,因为.Java只有一个可以作为主页面。
例如现现在我的结构如下,MainActivity.java用的是activity_main.xml,而自己新建的MyActivity.java用的是activity_myxml
要看清单文件AndroidManifest.xml是如何配置的,里面有注释!
<?xml version="1.0" encoding="utf-8"?>
<!-- 下面的package="com.example.day4_shanke_activity" 是默认包,在默认包下的文件注册时可以加.略写 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.day4_shanke_activity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 有一个主页面就得注册一个,形如下面的activity
下面的.MainActivity之所以可以略写,是因为在上面默认的包下面
-->
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.sdust.MyActivity"
android:label="自定义页面" >
<intent-filter> <!-- 谁有过滤器谁是主页面,所以现在自己新建的这个就充当主页面 -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2.问题2
cmd下输出日志,显示adb不是内部命令。因为没配置环境变量,把adb.exe的路径放到环境变量中就好了!
test是数据库标识
mBtn.setOnClickListener(new OnClickListener() { //点击按钮后台就会输出日志内容
@Override
public void onClick(View v) {
//输出一句后台日志(记得导包)
//参数一:日志的标签
//参数二:输出的内容
Log.d("test","Hello hbb");//cmd下输adb logcat -s test,数据库中就会有输出Hello hbb
}
});