Android Studio开发基础知识(持续更新中~)
Posted Monster_CYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio开发基础知识(持续更新中~)相关的知识,希望对你有一定的参考价值。
阅读本文需要有Java和前端的基础,本文是我学习android时的笔记。
大纲
一、UI开发
AS快捷键
Info | Key |
---|---|
复制行 | Ctrl +D |
删除行 | Ctrl +Y |
注释 | Ctrl +/ |
注释2 | Ctrl +Shift +/ |
撤销 | Ctrl +Z |
恢复 | Ctrl +Shift +Z |
显示结构 | Ctrl +F12 |
格式化代码 | Ctrl +Alt +L |
打开设置 | Ctrl +Alt +S |
自动补全代码 | Ctrl +Shift +Space |
自动导包 | Alt +Enter |
布局
1.线性布局(LinearLayout)
一些重要属性
//控制子控件的排列方向
orientation="vertical" //垂直
orientation="horizontal" //水平
//设置权重(权重总和为分母,可用于屏幕按钮的适配)
layout_weight="1"
2.相对布局(RelaviteLayout)
Layout下的控件属性
:
控件位置 | Info |
---|---|
layout_centerInParent | 位于 父的 正中央 |
layout_centerVertical | 位于 父的 垂直中 |
layout_centerHorizontal | 位于 父的 水平中 |
layout_above | 位于 某的 上 |
layout_below | 位于 某的 下 |
layout_toLeftOf | 位于 某的 左 |
layout_toRightOf | 位于 某的 右 |
layout_alignParentTop | 是否与父 顶 对齐 |
layout_alignParentLeft | 是否与父 左 对齐 |
layout_alignParentRight | 是否与父 右 对齐 |
layout_alignParentBottom | 是否与父 底 对齐 |
layout_alignTop | 与某的 上 对齐 |
layout_alignLeft | 与某的 左 对齐 |
layout_alignRight | 与某的 下 对齐 |
layout_alignBottom | 与某的 右 对齐 |
与前端CSS类似
控件间距(Margin) | 布局内边距(Padding) |
---|---|
layout_marginTop | paddingTop |
layout_marginBottom | paddingBottom |
layout_marginLeft | paddingLeft |
layout_marginRight | paddingRight |
padding |
3.针布局(FrameLayout)
该布局为每个加入其中的控件创建一个空白区域(称为一帧,每个控件占据一帧),所以控件默认显示在左上角,先放的在最底层。
Key | Info |
---|---|
foreground | 设置容器 的前景图 |
foregroundGravity | 设置前景图显示位置 |
4.表格布局(TableLayout)
需要和TableRow
标签配合使用,TableRow
的数量决定表格的行数。
布局属性 | Info |
---|---|
stretchColumns | 设置列可 拉伸 |
shrinkColumns | 设置列可 收缩 |
collapseColumns | 设置列可 隐藏 |
控件属性 | Info |
---|---|
layout_column | 在控件少于单元格的情况下,指定显示的位置 |
layout_span | 默认为1,可指定控件占几个单元格 |
5.绝对布局(AbsoluteLayout)
//布局属性
layout_x = "50dp";
layout_y = "100dp";
常用控件
1.TextView
控件属性 | Info |
---|---|
text | |
textColor | |
textSize | sp |
textStyle | bold,italic |
gravity | 文本位置 |
layout_width | 控件高 |
layout_height | wrap_content , match_parent |
height | 文本域高( 不常用) |
width | 文本域宽( 不常用) |
maxLength | 文本最大长度 |
phoneNumber | 以电话形式显示 |
password | 以密码形式显示 |
2.EditView
控件属性 | Info |
---|---|
hint | 提示文本 |
lines | 设置固定行高 |
maxLines | 最大行数 |
minLines | 最小行数 |
password | 以密码形式显示 |
phoneNumber | 以电话形式显示 |
scrollHorizontally | 水平滚动条 |
capitalize | 首字母大写 |
editable | 是否可编辑 |
background="@null"属性为去掉控件默认的下划线
3.Button
点击事件的两种实现方法
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
//onClick方法已经弃用了
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"/>
//lambda表达式
btn1.setOnClickListener(view ->
btn1.setText("btn1");
);
public void click(View v)
btn2.setText("btn2");
按钮点击事件较多的情况下,实现OnClickListener接口,重写onClick方法:
public class MainActivity implements View.OnClickListener
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//TODO 初始化N个控件...
@Override
public void onClick(View v)
switch(v.getId())
case R.id.btn1:
btn1.setText("btn1");
case R.id.btn2:
btn1.setText("btn2");
//......
4.RadioButton
Radiobutton
需要与 RadioGroup
配合使用
//RadioGroup控件的属性 控制子控件的排列方向
orientation="vertical" //垂直
orientation="horizontal" //水平
//RadioButtion控件的属性 设置按钮默认为选中状态
checked="ture"
监听事件(setOnCheckedChangeListener)
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
if(i == R.id.rbtn)
//TODO
else
//TODO
);
5.ImageView
//background是背景,会根据控件大小进行伸缩
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg"/>
//src是前景,以原图大小显示
<ImageButton
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/ic_launcher_background"
android:src="@drawable/ic_launcher_foreground"/>
6.ProgressBar
ProgressBar的属性
Key | Info |
---|---|
indeterminate | 不确定模式,动画无限循环 |
indeterminateDrawable | 设置不确定模式是否可drawable |
max | 进度的最大值 |
maxHeight | 进度Widget最大高 |
maxWidth | 进度Widget最大宽 |
minHeight | 进度Widget最小高 |
minWidth | 进度Widget最小宽 |
progress | 进度默认值,0~max |
progressBackgroundTint | 背景颜色 |
secondaryProgress | 定义二级进度值,0~max |
ProgressBar的方法
Function | Info |
---|---|
getMax() | 返回最大值 |
getProgress() | 返回进度 |
getSecondaryProgressBy() | 返回次要进度 |
incrementProgressBy() | 指定增长的进度,正数增加,负数减少 |
isIndeterminate() | 是否为不确定模式 |
setLndeterminate() | 设置为不确定模式 |
系统提供的样式
style=“@andorid:style/*” | Info |
---|---|
Widget.progressBar.Horizontal | 水平进度条 |
Widget.progressBar.Inverse | 普通环形(默认) |
Widget.progressBar.Large | 大环形 |
Widget.progressBar.Small | 小环形 |
自定义进度条比较复杂,不展开
另外,对话框形式的进度条ProgressDialog
已被弃用,不建议使用。
常见对话框
1.AlertDialog
AlertDialog.Builder dialog = new AlertDialog.Builder(this)
.setTitle("密码错误")
.setIcon(R.drawable.ic_launcher_background)
.setPositiveButton("确定",null)
.setNegativeButton("取消",null)
.setMessage("123");
dialog.show();
2.单选(AlertDialog)
new AlertDialog.Builder(this)
.setTitle("选择性别")
.setSingleChoiceItems(new String[]"男", "女", 0,
new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
)
.setPositiveButton("确定",null)
.show();
setSingleChoiceItems()方法需要设置三个参数:
- 建立数组,用于显示选项内容
- 参数是否默认选中:0表示选中第一个,-1表示默认不选中
- 设立监听,允许对话框被点击
3.多选(AlertDialog)
//lambda表达式
new AlertDialog.Builder(this)
.setTitle("选择性别")
.setMultiChoiceItems(new String[]"a", "b", "c", "d", "e", "f",
new boolean[]true, true, false, false, true, true,
((dialogInterface, i, b) ->
))
.setPositiveButton("确定",null)
.show();
setMultiChoiceItems()方法需要设置三个参数:
String[]
建立数组,用于显示选项内容boolean[]
建立数组,参数是否默认选中- 设立监听,允许对话框被点击(相比单选多了一个boolean参数)
4.消息对话框(Toast)
//轻量级信息提醒机制
//别忘了在最后的show方法
Toast.makeText(this,"hello",Toast.LENGTH_SHORT).show();
Toast.makeText(this,"hello",Toast.LENGTH_LONG).show();
5.自定义对话框
新建一个my_dialog.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#fff"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#08F"
android:gravity="center"
android:text="自定义对话框"
android:textColor="#fff"
android:textSize="18sp"
android:visibility="visible"/>
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:id="@+id/tv_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:minHeight="100dp"
android:paddingTop="15dp"
android:paddingRight="20dp"
android:paddingBottom="15dp"
android:paddingLeft="20dp"
android:textColor="#4e5052"
android:textSize="16sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="bottom"
android:background="#EEE"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btn_ok"
android:layout_width="114dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:background="#6200ee"
android:gravity="center"
android:text="确定"
android:textColor="#FFF"
android:textSize="15sp"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="114dp"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="#d0d0d0"
android:gravity="center"
android:text="取消"
android:textColor="#666"
android:textSize="15sp"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
PS:按钮的颜色改不了,就在values/themes.xml中修改
<style name="Theme.Textbook_test01" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
新建MyDialog.java
文件,继承Dialog类
public class MyDialog extends Dialog
private String dialogMessage;
private TextView tvMsg;
private Button btnOK;
private Button btnCancel;
//构造方法
public MyDialog(Context context,String dialogMessage)
super(context);
this.dialogMessage = dialogMessage;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//去除标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//引入自定义对话框布局
setContentView(R.layout.my_dialog);
tvMsg=findViewById(R.id.tv_msg);
btnOK=findViewById(R.id.btn_ok);
btnCancel=findViewById(R.id.btn_cancel);
//设置自定义对话框显示内容
tvMsg.setText(dialogMessage);
btnOK.setOnClickListener(view ->
//TODO 确认后的操作
);
btnCancel.setOnClickListener(view ->
dismiss();//关闭当前对话框
);
在MainActivity.java中创建对象
new MyDialog(this,"我是自定义的Dialog").show();
样式和主题
当style和theme的属性发生冲突时,style的优先级要高于theme
1.样式(styles.xml)
安卓中的样式类似与网页中CSS样式,可以让设计与内容分离。
在res/values下新建styles.xml。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="textStyle_one">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#999</item>
<item name="android:textSize">35sp</item>
</style>
<style name="textStyle_two" parent="@style/textStyle_one">
<item name="android:textSize">25sp</item>
</style>
</resources>
其中name属性是样式名称,parent属性表示继承某个样式
通过标签定义样式。
在布局文件中引用样式:
<TextView
android:id="@+id/tv1"
style这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用。
1、大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.support-multidex进行解决,但是你也许会遇到下面这样的错误,不由得让你冥思苦想,这个出错原因一般是引入了多个相同的包,但是你打开一开,libs下明明就只有一个包呀,让人头疼。
Error:Execution failed for task ‘:app:packageAllDebugClassesForMultiDex‘.
> java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex.class
解决方案如下:首先删掉libs下面的jar包,并解除依赖,然后在gradle脚本中,加入compile ‘com.android.support:multidex:1.0.1‘
(当前最新版本是1.0.1),顺利解决。
2、相信下面这个问题也比较常见,至少楼主遇到很多次了,前面没做笔记,搞的每次都要重新去理解,所以这个问题必须总结一下,杂一看又是v4包重复了。
* What went wrong:
Execution failed for task ‘:app:transformClassesWithJarMergingForDebug‘.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/annotation/ColorRes.class
具体解决方案为:由于很多第三方包都会用到v4支持包,这样在你导入多个支持的时候难免会出现这样的错误,只需在build.gradle里面添加上
configurations {
all*.exclude group: ‘com.android.support‘, module: ‘support-v4‘
}
然后clean一下工程再build就好。记住必须先clean,不然还是无法解决!!
以上是关于Android Studio开发基础知识(持续更新中~)的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio使用时遇见的一些问题+解决方法(持续更新)
Android studio 下的robotium自动化测试和持续集成