学习视频来源:https://www.bilibili.com/video/BV1jW411375J?from=search&seid=16068849106535436916
文章目录
- 小知识
- 参考资料
- 一、关于安卓应用
-
- P2 Module
- P3 项目结构
- P4 模拟器
- P8 新建module
- 二、用户界面设计基础
-
- p10 View类
- ==内边距==
- p11 ViewGroup类
- ==外边距==
- p12 控制UI界面
- P20 布局管理器简介
- ==P相对布局管理器==
- ==P23线性布局管理器==
- ==P25帧布局管理器==
- ==p27表格布局管理器==
- ==p29网格布局管理器==
- p31布局管理器嵌套
- 三、基本UI组件
-
- p34文本框组件
- p36编辑框组件
- p38普通按钮组件
- p40图片按钮
- p42单选按钮
- p44复选框
- p46日期选择器
- p47时间选择器
- p48计时器
- 四、高级UI组件
-
- p50进度条语法
- p52拖动条语法
- p54星级评分条语法
- p56图像视图
- p58图像切换器
- ==适配器==
- p60网格视图
- p62下拉列表框
- p64列表视图
- p66滚动视图
- p68选项卡
小知识
-
-
提示:Alt 回车
-
注释或取消注释当前或选定的代码块,以双斜杠的形式称为//:Ctrl 斜杠
-
以/……方式注释:Ctrl shift 斜杠
-
复制行:ctrl D
-
重命名:shift F6 相关内容可以更改
-
setings(设置) :ctrl Alt S
查找类:ctrl N
自动代码:Ctrl J
运行:Alt Shift X
自己在setings新建快捷键设置在中间F10
提取局部变量:Ctrl Alt V
提取全局变量:Ctrl Alt F
提取方法:Shit Alt M
矩形选区 Alt 左键
-
Alt+Insert构造器/Getter/Setter
快速将字符串变成常量windows快捷键是Ctrl Alt C
成为全球变量windows/linux下面的快捷键是Ctrl Alt F
-
-
- 修改版本号:在build.gradle中修改
- 修改应用图标和名称:Manifest中修改
红色是修改图标,黄色是修改应用程序名称
-
设置屏幕方向:在Manifest中添加 android:screenOrientation=“landscape”
<activity android:name=".MainActivity" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
-
启动Android Studio,菜单"File"-“Setting…”,“Editor”-“Font” 。
参考资料
https://www.jianshu.com/u/0a61c9729dbc
一、关于安卓应用
P2 Module
-
一个对应多个,一个对应一个
-
:应用名称
:包名(无中文、数字、空格)
-
SDK版本越低适配性越强
-
左侧工程结构栏:
app:一个Module,默认创建的应用程序
-
xml没有应用名预览怎么办?点击小眼睛数第二个打钩
P3 项目结构
-
左侧项目结构栏:以Android为例讲解
.app\
-
:全局描述文件
-
:java源码文件
-
:资源文件,图片、布局等等
-
-
:(前三行默认生成)
<application //配置应用属性 android: //配置应用图标、
标签等 <activity android:name=".MainActivity"> //配置所应用的Activity <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
-
:
.\MainActivity:
public class MainActivity extends AppCompatActivity { //定义一个java类,一个Activity就是一个java类,MainActivity继承AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { //重写onCreate super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //指定当前Activity的布局文件 注意:R文件自动生成 // R文件生成失败解决方法:Build-Clean Project } }
-
:
-
:位图文件PNG JPEG GIF、9path文件、xml资源文件(后面两种只能放在该目录)
-
:布局文件
-
:图标文件(需要适应屏幕分辨率的图片推荐放在该目录,可提高显示性能、占用内存更少)
-
:保存一些资源,颜色、尺寸、字符串、样式
P4 模拟器
借助AVD看模拟器
P8 新建module
.file \new \new module
二、用户界面设计基础
p10 View类
-
- 位于***android.view***包中 如:android.view.View
-
View类的子类一般位于***android.widget***包中 如:android.widget.TextView
-
View类常用属性:
android:id = "@+id/user" //唯一标识 android:background = "@mipmap/bg" //设置背景 图片资源 android:background = "#FF00FF" //设置背景 颜色值
内边距
android:padding = "16dp" //设置上下左右内边距组件
android:padding = "@dimen/activity_margin"
//细分:android:paddingLeft = android:paddingStart
// android:paddingTop
// android:paddingRight = android:paddingEnd
// android:paddingBottom
p11 ViewGroup类
-
- 控制View的摆放
-
继承View类,抽象类,使用子类作为容器
-
控制其子组件分布时依赖的内部类
-
- 设置布局宽度、高度
android:layout_width="100dp"
android:layout_height="100dp"
//FILL_PARENT:与父容器相同
//MATCH_PARENT:与父容器相同
//WRAP_CONTENT:根据自身内容确定
外边距
android:layout_marginLeft //=android:layout_marginStart
android:layout_marginTop
android:layout_marginRight //=android:layout_marginEnd
android:layout_marginBottom
p12 控制UI界面
建议使用xml布局文件控制UI界面
P20 布局管理器简介
-
- :相对布局管理器 (相对其它组件的布局方式)
- :线性布局管理器 (按照垂直或者水平方向布局的组件)
- :帧布局管理器 (组件从屏幕左上方布局组件)
- :表格布局管理器 (按照行列方式布局组件)
:绝对布局管理器 (按照绝对坐标来布局组件)- :网格布局管理器
P21相对布局管理器
-
(这个是在布局管理器上设置的属性)
android:gravity //设置布局管理器中各组件的摆放方式 android:ignoreGravity //指定哪一个组件不受上一个属性影响
-
(这个是在组件上设置的属性)
android:layout_above //指定组件相对于参考组件相对位置 android:layout_below android:layout_toLeftof android:layout_toRightof android:layout_alignParentBottom //设置组件与布局管理器哪边对齐 bool类型 true对齐 android:layout_alignParentLeft android:layout_alignParentRight android:layout_alignParentTop android:layout_alignBottom //设置组件与哪个组件的哪边对齐 android:layout_alignLeft android:layout_alignRight android:layout_alignTop android:layout_centerHorizontal //设置组件位于布局管理器哪个位置 android:layout_centerInParent android:layout_centervertical
P23线性布局管理器
-
android:orientation: //设置布局的方向
-
竖直:
一行只能放一个组件,组件不会换行
组件一个一个排到边缘时,剩下的组件不会显示出来
-
水平:
一列只能放一个组件
组件一个一个排到边缘时,剩下的组件不会显示出来
-
-
android:gravity: //控制组件的对齐方式
center:居中
right:居右
right|bottom:居右下角
-
子组件属性
-
android:layout_weight: //设置组件所占权重,组件在父容器 剩余空间 的比例,默认值0
如:在水平布局的LinearLayout中有两个Button,一个占80,一个占120,总宽度为320,则剩余空间120:如果这两个Button的layout_weight属性值都为0,那么这两个按钮都会按原大小显示;如果layout_weight都为1,则一个占140,一个占180。
-
android:layout_gravity //设置组件位置
-
P25帧布局管理器
-
组件重叠
android:foreground //设置前景图像(始终位于最上层的图像)
android:foregroundGravity //设置前景图像的位置,原尺寸显示,可以只盖住一部分
p27表格布局管理器
-
android:collapseColumns //设置哪些列被隐藏,列序号从0开始,多个列用“,”表示 android:stretchColumns //允许哪些列被拉伸,即自动拉伸适应屏幕剩余空间,列序号同上 android:shrinkColumns //允许哪些列被收缩,即当一行内容超出屏幕宽度时,收缩某一列宽度使其它内容显示出来,列序号同上
-
**TableRow:**表格行 一个组件占一列
<TableRow android:paddingTop="200dp">
p29网格布局管理器
-
android:columnCout //指定网格最大列数 android:orientation //当没有为组件分配行和列时,为其设置排列方式,水平或垂直 android:rowCount //指定网格的最大行数
-
android:layout_column //指定组件位于网格第几列 android:layout_columnSpan //指定组件横向跨几列 android:layout_columnWeight //指定组件在水平方向的权重,即分配水平空间的比例 android:layout_gravity //设置组件用什么方式占据网格空间 android:layout_row //指定组件位于网格第几行 android:layout_rowSpan //指定组件纵向跨几列 android:layout_rowWeight //指定组件在垂直方向的权重
p31布局管理器的嵌套
- 根布局管理器必须包含xmlns属性
- 在一个布局文件中,最多只能有一个根布局管理器
- 不能嵌套太深,太深会影响性能
三、基本UI组件
- 包括:文本类组件、按钮类组件、日期时间类组件
p34文本框组件
-
文本框
<TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="200dp" android:text="@string/name" android:textSize="36sp" android:textColor="FFFFFF"/>
-
设置颜色时,可以用RGB,也可以直接用ARGB调透明度
-
设置单行文本框: (多余字用省略号显示)
android:singleLine="true"
p36编辑框组件
-
编辑框(文本框组件的子类,文本框的属性都适用)
<EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/hint_text"/>
-
指定提示信息:
android:hint="请输入账号"
-
输入密码变成小黑点,即密码框:
android:inputType="textPassword" //密码框 android:inputType="number" //只能输入数字
-
在编辑框内绘制图像属性
android:drawableLeft="@mipmap/mc" //相当于android:drawableStart //类似的有android:drawableBottom //android:drawableEnd=android:drawableRight //android:drawableTop
-
图片与文字的间距调整:
android:drawablePadding
-
-
设置编辑框组件的行数:
android:lines="5"
输入第六行时第一行不见了,可以滚动鼠标显示
-
:到java咯!
xml里编辑框id设为et1
EditText et=(EditText)findViewById(R.id.et1); et.getText();
p38普通按钮组件
-
按钮
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="text"/>
-
为按钮设置一个监听器,点击按钮时会触发这个监听器,从而执行相关操作。
-
-
xml里按钮1的id设为button1,java代码:
Button button=(Button)findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this,"单击了按钮1",Toast.LENGTH_SHORT).show(); } });
-
xml里按钮2的id设为button2
-
在java的Activity中编写一个包含View类型参数的方法
public void myClick(View view){ Toast.makeText(MainActivity.this,"单击了按钮2",Toast.LENGTH_SHORT).show(); //编写要执行的动作代码 }
-
将xml里按钮2的android.onClick属性指定为步骤1中的方法名
android.onClick="myClick"
-
-
p40图片按钮
-
- 相同点:单击时都可以触发onClick事件
- 不同点:ImageButton没有android.text属性,文字是在制作图片时添加的
-
图片按钮
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/picture"/>
-
去掉多余的灰色背景:
android:background="#0000"
-
p42单选按钮
-
单选按钮
<RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选我"/>
默认选中状态:
android:isChecked="true"
-
多个单选按钮
<RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rg"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="男"/> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女"/> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保密"/> </RadioGroup> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="提交" android:id="@+id/button"/>
-
RadioGroup rg=(RadioGroup)findViewById(R.id.rg); rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton r=(RadioButton)findViewById(checkedId); r.getText(); Toast.makeText(MainActivity.this,"性别:"+r.getText(),Toast.LENGTH_SHORT).show(); } });
RadioGroup rg=(RadioGroup)findViewById(R.id.rg);
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i=0;i<rg.getChildCount();i++){
RadioButton r=(RadioButton)rg.getChildAt(i);
if(r.isChecked()){
Toast.makeText(MainActivity.this,r.getText(),Toast.LENGTH_SHORT).show();
break;
}
}
}
});
p44复选框
-
复选框
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示密码"/>
默认选中状态:
android:isChecked="true"
-
多个单选按钮
-
多个复选框
多复制几个
<CheckBox android:id="@+id/pingguo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="苹果"/> <CheckBox android:id="@+id/xiangjiao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="香蕉"/> <CheckBox android:id="@+id/mihoutao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="猕猴桃"/>
-
CheckBox apple=(CheckBox)findViewById(R.id.apple); apple.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(apple.isChecked()){ Toast.makeText(MainActivity.this,apple.getText(),Toast. LENGTH_SHORT).show(); } } });
p46日期选择器
-
日期选择器
<DatePicker android:id="@+id/data" android:layout_width="match_parent" android:layout_height="match_parent"> </DatePicker>
java里把继承AppCompatActivity改成继承Activity可以使其完整显示。
-
public class MainActivity extends Activity { int year,month,day; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DatePicker data=(DatePicker)findViewById(R.id.data); Calendar calendar=Calendar.getInstance(); year=calendar.get(Calendar.YEAR); month=calendar.get(Calendar.MONTH); day=calendar.get(Calendar.DAY_OF_MONTH); data.init(year, month, day, new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { MainActivity.this.year=year; MainActivity.this.month=monthOfYear; MainActivity.this.day=dayOfMonth; show(year,monthOfYear,dayOfMonth); } }); } private void show(int year,int month,int day){ String str=year+"年"+(month+1)+"月"+day+"日"; Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show(); } }
p47时间选择器
-
时间选择器
<TimePicker android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-
TimePicker time=(TimePicker)findViewById(R.id.time); time.setIs24HourView(true); //采用24小时进制 time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { String str=hourOfDay+"时"+minute+"分"; Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show(); } });
p48计时器
- 计时器
<Chronometer
android:layout_width="wrap_content"
android: