Android Studio开发基础知识(持续更新中~)

Posted Monster_CYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio开发基础知识(持续更新中~)相关的知识,希望对你有一定的参考价值。

阅读本文需要有Java前端的基础,本文是我学习android时的笔记。

大纲

一、UI开发

AS快捷键

InfoKey
复制行Ctrl+D
删除行Ctrl+Y
注释Ctrl+/
注释2Ctrl+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_marginToppaddingTop
layout_marginBottompaddingBottom
layout_marginLeftpaddingLeft
layout_marginRightpaddingRight
padding

3.针布局(FrameLayout)

该布局为每个加入其中的控件创建一个空白区域(称为一帧,每个控件占据一帧),所以控件默认显示在左上角,先放的在最底层。

KeyInfo
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
textSizesp
textStylebold,italic
gravity文本位置
layout_width控件高
layout_heightwrap_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的属性

KeyInfo
indeterminate不确定模式,动画无限循环
indeterminateDrawable设置不确定模式是否可drawable
max进度的最大值
maxHeight进度Widget最大高
maxWidth进度Widget最大宽
minHeight进度Widget最小高
minWidth进度Widget最小宽
progress进度默认值,0~max
progressBackgroundTint背景颜色
secondaryProgress定义二级进度值,0~max

ProgressBar的方法

FunctionInfo
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()方法需要设置三个参数:

  1. 建立数组,用于显示选项内容
  2. 参数是否默认选中:0表示选中第一个,-1表示默认不选中
  3. 设立监听,允许对话框被点击

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()方法需要设置三个参数:

  1. String[] 建立数组,用于显示选项内容
  2. boolean[] 建立数组,参数是否默认选中
  3. 设立监听,允许对话框被点击(相比单选多了一个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第十九期 - Glin架构

Android studio 下的robotium自动化测试和持续集成

拥抱Android Studio:Android Studio与Gradle深入

Android studio 的知识-----下载和安装

android笔记——android studio环境搭建