Android

Posted 小宏

tags:

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

Ctrl+Q:方法的帮助文档
Ctrl+Alt+L:规范化代码
Shift+F10:运行

Log.e:表示错误信息,比如可能导致程序崩溃的异常
Log.w:表示警告信息
Log.i:表示一般消息
Log.d:表示调试信息,可把程序运行时的变量值打印出来,方便跟踪调试
Log.v:表示冗余信息

Toast.makeText(MainActivity.this,"提示文字",Toast.LENGTH_SHORT).show();

String desc=String.format(“您勾选了控件%d,状态为%b",buttonView.getId(),isChecked);

天下难事必作于易,天下大事必作于细

android支持的像素:px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(与设备无关的显示单元)、dip(就是dp)、sp(用于设置字体大小)
常用的有px、dp和sp
px是手机屏幕上可显示的最小单位,与物理设备的显示屏有关
dp与物理设备无关,只与屏幕的尺寸有关(同样尺寸的的屏幕以dp计量的分辨率是一样的)
dp和px之间的联系取决于具体设备上的像素密度(像素密度就是DisplayMetrics里的density参数,即1dp包含多少个px)
当density=1.0时,dp=px
当density=1.5时,2dp=3px;
当density=2时,1dp=2px;
sp专门用于设置字体
系统设置普通字体:dp和sp设置的字体一样大
系统设置大字体:dp的文字大小不变,sp的字体却变大了


用法:
1.在xml布局文件中,sp用于设置文字,其余大小的地方用dp
2.在代码中,Android用于设置大小的函数都以px为单位
在代码中使用dp时,得先把dp值转换成px值,例
int dip_10=Utils.dip2px(this,10L);

Android中颜色值,由透明度和红、绿、蓝三原色定义,有八位十六进制数(FFEEDDCC,FF表示完全不透明)和六位十六进制数(xml文件中默认不透明,代码中默认透明)两种编码
系统中已定义的颜色常量:
BLACK:黑色
DKGRAY:深灰
GRAY:灰色
LTGRAY:浅灰
WHITE:白色
RED:红色
GREEN:绿色
BLUE:蓝色
YELLOW:黄色
CYAN:青色
MAGENTA:玫红
TRANSPARENT:透明

用法:
1.在布局文件中设置颜色值需要“#000000”,例:android:textColor="#000000";
布局文件中用res/values/colors.xml,可“@color/常量名”
2.在代码中可以用“0xff00ff00”,例:setTextColor(0xff00ff00);也可以通过Color.rgb(int red,int green,int blue)和Color.argb(int alpha,int red,int green,int blue);
代码中使用功能/res/values/colors.xml,可getResources().getColor(R.color.常量名);

获取手机的分辨率(当前屏幕的宽和高)
获得DisplayMetrics对象,然后从该对象中获得宽度、高度、像素密度等信息
DisplaryMetrics对象的常用属性:
widthPixels:以px为单位计量的宽度值
heightPixels:以px为单位计量的高度值
density:像素密度,即1dp包含多少个px


用法:
public class DisplayUtil{
public static int getSreenWidth(Context ctx){
WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}

public static int getSreenHeight(Context ctx){
WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
DispalyMetrics dm = new DisplaryMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}

public static int getSreenDensity(Context ctx){
WindowManager wm = (WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
DispalyMetrics dm = new DisplaryMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.density;
}

View:
是Android的基本视图,所有控件和布局都由View类直接或间接派生而来,故而View类的基本属性和方法是各空间和布局通用的。

用法:
1.xml文件中常用属性:
id:该视图的编号
layout_width:该视图的宽度,可以是dp值,也可以是match_parent、match_content(若内容超过上一级视图,该视图保持和上一级视图一样宽,超出宽度的内容进行滚动才能显示);
layout_height:该视图的高度
layout_margin:该视图与周围视图之间的空白距离(包括上、下、左、右)。另有layout_marginTop、layout_marginBottom、layout_marginLeft、layout_marginRight
minWidth:该视图的最小宽度
minHeight:该视图的最小高度
background:该视图的背景(背景可以是颜色或图片)
layout_gravity:制定该视图与上级视图的对齐方式,可以使用“|”把多种对齐方式拼接起来
对齐方式:
left:靠左对其
right:
top:
bottom:
center:
center_horizontal:水平方向居中
center_vertical:垂直方向居中
padding:指定该视图边缘与内部内容之间的空白距离。另有paddingTop、paddingBottom、paddingLeft、paddingRight。
visibility:该视图的可见类型
visible:可见,默认值
invisible:不可见,但占着位置
gone:消失,不可见且不占位置

2.代码中常用设置:
setMinimumWidth:设置该视图的最小宽度
setMiniumHeight:设置该视图的最小高度
setBackgroundColor:设置该视图的背景颜色
setBackgroundResource:设置该视图的背景
setBackgroundDrawable:设置该视图的背景图片
setPadding:设置该视图边缘与内部内容之间的空白距离
setVisibility:设置该视图的可视类型
*setLayoutParams:设置该视图的布局参数

视图组ViewGroup:
用法:
addView:往布局中添加一个视图
removeView:从布局中删除制定视图
removeAllViews:删除该布局下的所有视图

LinearLayout:线性布局
继承了View和ViewGroup类的所有属性和方法,还有其特有的xml属性


用法:
1.在xml文件中
orientation:制定线性布局的方向(horizontal表示水平布局,vertical表示垂直布局,默认是水平布局)
gravity:指定布局内部视图与本线性布局的对齐方式,取值同layout_gravity
layout_weight:指定当前视图的宽或高占上级线性布局的权重
layout_weight并非在当前LinearLayout节点中设置,而是在下级视图的节点中设置

用法:
layout_weigth是指定的是当前视图在宽度上的权重,layout_width就要同时设置为0dp
2.在代码中
setOrientation:(LinearLayout.HORIZONTAL表示水平方向...)
setGravity:

ScrollView:滚动视图
与线性布局类似,滚动视图也分为垂直方向和水平方向两类
其中,垂直滚动的视图名为ScrollView,水平滚动的视图名为HorizontalScrollView。

垂直滚动时:layout_width要设置为math_parent,layout_height要设置为wrap_content
水平滚动时:layout_width要设置为wrap_content,layout_hegith要设置为match_parent

滚动视图下面有且只能挂一个布局节点

有时ScrollView的实际内容不够,又想让它充满屏幕,设置layout_height为match_parent,结果还是不会充满,正确的做法是再增加一行fillViewport属性设置,例:android:fillViewport="true"


文本显示视图:TextView
常用的属性:
text:设置文本内容
textColor:设置文本颜色
textSize:设置文本大小
textAppearance:设置文本风格,风格定义在res/styles.xml
gravity:设置文本的对齐方式

跑马灯用法:
android:focusable="true"
android:focusableInTouchMode="true"
android:ellipsize="marquee" //跑马灯

Button:

1.单击监听用法:
class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v){
if(v.getId()==R.id.btn_click){
Toast.makeText(ClickActivity.this,"您单击了控件:"+((TextView)v).getText(),Toast.LENGTH_SHORT).show();
}
}
}

btn.setOnClickListener(new MyOnClickListener());
2.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public void onClick(View v){
if(v.getId()=R.id.btn_test)
Toast.makeText(MainActivity.this,"按下按钮",Toast.LENGTH_SHORT).show();
}

btn.setOnClickListener(this);

Button文字周围放置图片
使用TextView就是实现,那么基于TextView的Button自然能够实现

属性:
drawableTop:指定文本上方的图形
drawableBottom:指定文本下方的图形
drawableLeft:指定文本左边的图形
drawableRight:指定文本右边的图形
drawablePadding:指定图形与文本的间距

代码中实现:
setCompoundDrawables:设置文本周围的图形。可分别设置左边、上边、右边、下边的图形
setCompoundDrawablePadding:设置图形与文本的间距

用法:
//onCreate()函数中的代码片段
drawable=getResouces().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); //必须设置图片大小,否则不显示图片

//点击事件中可以添加的代码
btn_test.setCompoundDrawables(drawable,null,null,null);

ImageView: 图像显示控件

属性:
scaleType:指定图形的拉伸类型,默认是fitCenter
fitXY:拉伸图片使其正好填满视图 (填满ImageView)
fitStart:拉伸图片使其位于视图上部
fitCenter:拉伸图片使其位于视图的中部 (图片被拉伸但未超出控件范围)
fitEnd:拉伸图片使其位于视图的下部
center:保持图片原尺寸,并使其位于视图中间 (原图显示,图片没有拉伸)
centerCrop:拉伸图片使其充满视图,并位于视图中间 (图片被拉伸且已超出控件范围)
centerInside:使图片位于视图中间(只压不拉)。当图片尺寸大于视图时,centerInside等同于fitCenter;当图片尺寸小于视图时,centerInside等同于center
src:指定图形来源。
注意视图不按scaleType指定的方式拉伸,背景默认以fitXY方式拉伸

代码中用法:

setScaleType:
setImageDrawable:设置图形的Drawable对象
setImageResource:设置图形的资源id
setImageBitmap:设置图形的位图对象

使用截图功能(这些方法都继承自View类)

setDrawingCacheEnabled:设置绘图缓存的可用状态。true表示打开,false表示关闭
isDrawingCacheEnabled:判断该控件的绘图缓存是否可用
setDrawingCacheQuality:设置绘图缓存的质量
getDrawingCache:获取该控件的绘图缓存结果,返回值为Bitmap类型
setDrawingCacheBackgroundColor:设置绘图缓存的背景颜色。
提供该方法是因为绘图缓存默认背景色是黑色,如果不提前设置缓存的背景色,截图的结果就是黑乎乎一片,所以需要将背景色设置为默认颜色(通常是白色)

步骤:
1. setDrawingCacheEnabled(true); //先开启绘图缓存,之后变更的界面才会记录到缓存中;如果先变更界面再开启绘图缓存,缓存里就是空
2. getDrawingCache(); //获取绘图缓存图像数据
3. setImageBitmap(bitmap);
4. setDrawingCacheEnabled(false); //延迟若干毫秒后调用,关闭绘图缓存
该方法写在延时函数中,如果接下来还要截图就再开启绘图缓存

延时函数:
private Handler mHandler = new Handler();
private Runnable mResetCache = new Runnable() {
@Override
public void run() {
iv_test.setDrawingCacheEnabled(false);
}
};

mHandler.postDelayed(mResetCache,200); //主程序中调用该函数延时

ImageButton图像按钮:
派生自ImageView,而不是派生自Button,只是ImageView有个默认的按钮外观
只能显示图形不能显示文本
ImageButton上的图像可按比例伸拉,而Button上的大图会拉伸变形(因为背景图无法按比例拉伸)
Button能在背景显示一张图形,而ImageButton可分别在前景和背景显示两张图形,实现图片叠加效果

应用场景:
输入法打不出来的字符和以特殊字体显示的字符串,适合先切图再用ImageButton显示


项目目录中的Drawable文件夹:

导入图片:
1.直接复制到该项目目录中
2.通过批量drawable插件Android Postfix Completion生成并导入各分辨率的图片

Android把素有显示的图形都抽象为Drawable(可绘制的)
这里的图形不止于图片,还包括色块、画板、背景等

drawable-ldpi:存放低分辨率的图片(如240*320)
drawable-mdpi:存放中等分辨率的图片(如320*480),这样的之智能手机已经很少了
drawable-hdpi:存放高分辨率的图片(如480*800),一般对应4寸~4.5寸的手机,但也不绝对
drawable-xhdpi:高分辨率的图片(如720*1280),一般对应5~5.5寸的手机
drawable-xxhdpi:超高分辨率的图片(如1080*1920),一般对应6~6.5寸的手机
drawable-xxxhdpi:存放超高分辨率的图片(如1440*2560),一般对应7寸以上的平板电脑

基本上,分辨率加大一级,宽度和高度就要加大二分之一或三分之一的像素。
如果各目录中存在同名图片,Android会根据手机的分辨率适配对应文件夹的图片

代码中用法:

1.使用setBackgroundResource和setImageResource方法,直接参数指定R.drawable.*
2.使用setBackgroundDrawable、setImageDrawable和setCompoundDrawables等方法,参数是Drawable对象
Drawable drawable=getResources().getDrawable(R.drawable.apple);

StateListDrawable: 状态图形,(部件不同状态的控制)
该类是Drawable的一个子类,该子类在xml文件中定义了不同状态时呈现图形列表
不仅用于Button控件,而且可以用于其他拥有不同状态的控件

状态类型属性:
state_pressed:是否按下(true、false) 常用于Button
state_checked:是否勾选 常用于单选框RadioButton、复选框CheckBox
state_focused:是否获取焦点 常用于文本编辑框EditText
state_selected:是否选中 各控件均可

//background的属性可以设置为如下代码
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/check_choose"/>
<item android:drawable="@drawable/check_unchoose"/>

</selector>

Shape:形状图形
定义文件以shape元素为根节点。根节点下定义了6个节点:corners(圆角)、gradien(渐变)、padding(间隔)、size(尺寸)、solid(填充)、stroke(描边)
实际开发常用的有3个节点:corners、solid、stroke。
shape节点的常用属性:
rectangle:矩形,默认值
oval:椭圆,此时corners节点会失效
line:直线,此时必须设置stroke节点,不然会报错
ring:圆环
corners时shape (若无corners节点,则表示么有圆角)
bottomLeftRadius:像素类型,左下圆角的半径
bottomRightRadius:右下圆角的半径
topLeftRadius:左上圆角的半径
topRightRadius:右上圆角的半径
radius:圆角半径(若有上面4个的定义,则不需要radius定义)
gradien: (描述形状内部的颜色渐变定义,若无该节点,表示没有渐变效果)
angle:整型,渐变的起始角度。为0时表示是时钟的9点位置,值增大表示往逆时针方向旋转。例如:90表6点位置,180表3点位置
type:渐变类型
lincar:线性渐变,默认值
radial:放射渐变,起始颜色即使圆心颜色
sweep:滚动渐变,即一个线段以某个端点为圆心做360度旋转
centerX:浮点型,圆心的x坐标。当android:type=“linear"时不可用
centerY:浮点型,圆心的y坐标。当android:type=“linear"时不可用
gradientRadius:整型,渐变的半径。当android:type="radial"时才需要设置该属性
centerColor:颜色类型,渐变的中间颜色
startColor:颜色类型,渐变的起始颜色
endColor:颜色类型,渐变的终止颜色
useLevel:布尔类型,设置为true无渐变色、false有渐变色
padding:描述形状图形与周围视图的间隔大小。若无该节点,则表示四周不设间隔
bottom:像素类型,与下边的间隔
left:像素类型,与坐标的间隔
right:像素类型,与右边的间隔
top;像素类型,与上边的间隔
size:用来表述形状图形的尺寸大小(宽度和高度)若没有该节点,则表示宽高自适应
height:像素类型,图形高度
width:像素类型,图形宽度
solid:描述形状图形内部的填充色彩,若没有该节点,表示无填充颜色
color:颜色类型,内部填充的颜色
stroke:描述形状图形四周边线的规格定义,若无该节点,表示不存在描边
color:颜色类型,描边的颜色
dashGap:像素类型,每段虚线之间的间隔
dashWidth:像素类型,每段虚线的宽度
width:像素类型,描边的厚度。若dashGap和dashWidth有一个值为0,则描边为实线。

xml文件用法:
<shape xmls:android="http://schemas.android.com/apk/res/androd">
<solid android:color=#ffdd66"/>
<stroke
android:width="1dp"
android:color="#ffaabbcc"/>
<corners
android:bottomLeftRadius="10dp"
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"/>
</shape>

在界面中添加一个水平分割线:

1.在TextView控件中来内需填入许多横线或下划线
2.让美工做一个横线的切图,然后ImageView控件塞进横线图
3.用Shape,根节点Shape属性设置为line
4.在布局文件中添加View控件,高度设置为1dp,背景颜色设置为线条颜色 (最简单)

九宫格图片
实现原理与shape类似,即拉伸图形时,只对内部进行拉伸,不对边缘做拉伸操作
避免边缘被拉宽、拉模糊的问题

使用到drawable9patch工具

计算器项目:
为了减少冗余代码,可将相同的样式定义写在values目录下的style.xml文件中,然后再布局文件节点添加styl‘e="@style/btn_cal”这样的属性
用法:
<style name="btn_cal">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@color/black</item>
<item name="android:textSize">30sp</item>
<item name=android:background">@drawable/btn_nine_selector</item>
</style>

相对布局RelativeLayout:
下级视图的位置是相对位置,如果不设定下级视图的参照物,那么下级视图默认显示再RelativeLayout内部的左上角
确定视图位置的参照物分两种:
1.与该视图自身平级的视图
2.该视图的上级视图

属性:
layout_toLeftOf:当前视图在指定视图的左边
layout_toRightOf:当前视图在指定视图的右边
layout_above:当前视图在指定视图的上方
layout_below:当前视图在指定视图的下方
layout_alignLeft:当前视图在指定视图的左侧对齐
layout_alignRight:当前视图在指定视图的右侧对齐
layout_alignTop:当前视图与指定视图的顶部对齐
layout_alignBottom:当前视图与指定视图的底部对齐
		layout_centerInParent:当前视图在      上级视图的中间
layout_centerHorizontal:当前视图 在上级视图的水平方向居中 (屏幕最上方中间)
layout_centerVertical: 在上级视图的垂直方向居中 (屏幕最左方中间)
layout_alignParentLeft:当前视图 与上级视图的左侧对齐 (屏幕左上角)
layout_alignParentRight:
layout_alignParentTop:
layout_alignParentBottom: 与上级视图的底侧对齐 (屏幕左下角)

在代码中动态添加视图
用到的是RelativeLayout.LayoutParams的addRule方法,该方法第一个参数表示相对位置类型,第二个参数表示参照物视图的id

框架视图FrameLayout:
其下级视图无法指定所处的位置,只能统统从上级FrameLayout的左上角开始添加,并且后面添加的子视图会把之前的子视图覆盖掉
场景:
一般需要重叠显示的场景,比如绘图、游戏界面等

属性:
foreground:指定框架布局的前景图像。该图像在框架内部永远处于最顶层,不会被框架内的其他视图覆盖
foregroundGravity:指定前景图像的对齐方式。该属性的取值同gravity

绝对布局AbsoluteLayout:
表格布局TableLayout:

复选框CheckBox:
CompoundButton类是抽象的符合按钮,因为是抽象的,所以不能直接使用。
实际开发中用到是CompoundButton类的几个派生类,主要有复选框CheckBox、单选按钮RadioButton以及开关按钮Witch

CompoundButton类在布局文件中的属性:
checked:按钮的勾选状态,true表示勾选,false表示未勾选。默认未勾选
button:指定左侧勾选图标的图形。如果不指定就使用系统的默认图标。

CompoundButton在代码中可使用下列4中方法进行设置
setChecked:设置按钮的勾选状态
setButtonDrawable:设置左侧勾选图标的图形
setOnCheckedChangeListener:设置勾选状态变化的监听器
isChecked:判断按钮是否勾选


复选框CheckBox通过setOnCheckedChangeListener方法设置勾选监听器,对应的监听器要实现接口CompoundButton.OnCheckedChangeListener。

开关按钮Switch:
方方正正有点土

Android从4.1.2版本开始支持该控件。
起始Switch是一个高级版本的CheckBox,在选中与取消选中时可展现的界面元素比CheckBox丰富

属性:
textOn:设置右侧开始时的文本
textOff:设置左侧关闭时的文本
switchPadding:设置左右两个开关按钮之间的距离
thumbTextPadding:设置文本左右两边的距离。如果设置了该属性switchPadding属性就会失效
thumb:设置开关轨道的背景
track:设置开关标识的图标

Android是实现类似于ios的开关按钮
主要思路:
1.借助状态列表图形StateListDrawable,首先定义一个状态列表
//background属性可以设置为下面的代码 (不直接修改button的属性是因为其属性是由限制的,无论多大的图片,都只显示一个小小的图标)
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/switch_on"/>
<item android:drawable="@drawable/switch_off"/>
</selector>
2.button属性要先设置为@null

单选按钮RadioButton:

只能选择一个,不能多选,按钮范围可以通过RadioGroup容器来确定
RadioGroup实质上是个布局,同一组RadioButton都要放在同一个RadioGroup节点下
RadioGroup其下可挂其他子部件,如TextView、ImageView等
RadioGroup属性:
orientation:指定下级控件的排列方式

RadioGroup常用的方法:

setCheckedId:选中指定资源编号的单选按钮
getCheckedRadioButtonId:获取选中状态单选按钮的资源编码
setOnCheckedChangeListener:设置单选按钮勾选变化的监听器

单选按钮的选中事件一般不由RadioButton处理,而由RadioGroup相应。
选中事件在实现时,首先要写一个选中监听器实现接口RadioGroup.OnCheckChangeListener,然后调用RadioGroup对象的setOnCheckedChangeListener

RadioButton经常会更换按钮图标
如果通过button属性变更图标,那么图标与文字就会挨的很近
为了拉开图标与文字之间的距离,得换成drawableLeft属性展示新图标(不要忘了把button属性改为@null)此时再设置drawablePadding即可只当间隔距离

图标设置方式:
1.button:用于图标大小要求不高,间隔要求也不高
2.background:用于能够较大空间显示图标的场合
3.drawableLeft:对图标和文件之间的间隔有要求的场合

下拉框Spinner:
属性:
spinnerMode:设置为dropdown,当前下拉框的正下方展示列表
spinnerMode:设置为dialog,在页面中部以对话框形式展示列表

代码中调用的方法:
setPrompt:设置标题文字
setAdapter:设置下拉列表的适配器。适配器可选择ArrayAdapter或SimpleAdapter
setSelection:设置当前选中哪项。注意此方法要setAdapter方法后调用
setOnItemSelectedListener:设置下拉列表的选中监听器,该监听器要实现接口OnItemSelectedListener


数组适配器ArrayAdapter:

//spinner_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="20sp"
android:paddingLeft="20dp">

</TextView>

//item_dropdown.xml
设置弹出窗口的布局方式


//使用
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner= findViewById(R.id.spinner_id);
spinner.setPrompt("选项");
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.spinner_item,startArray);
adapter.setDropDownViewResouce(R.layout.item_dropdown); //这个用来明确弹出窗口的布局
spinner.setAdapter(adapter);
spinner.setSelection(0);
spinner.setOnItemSelectedListener(this);
}
private String[] startArray={"火星","水星","木星"};
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this,"您选择的是"+startArray[position],Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}

SimpleAdapter:


文本编辑框EditText:
没有自动获取文本编辑框长度的方法,但是可以通过
public static int getMaxLength(EditText et){
int length=0;
try{
inputFilter[] inputFilters=et.getFilters();
for(InputFilter filter:inputFilters){
Class<?> c = filter.getClass();
if(c.getName().equals("android.text.InputFilter$LengthFilter")){
Field[] f = c.getDeclaredFields();
for(Field field: f){
if(field.getName().equals("mMax")){
field.setAccessible(true);
length = (Integer)field.get(filter);
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}
return length;
}

属性:
inputType:指定输入的文本类型,指定多个类型可以用“|”
text:文本
textPassword:文本密码,显示时用“*”替代
number:整型数
numberSigned:带符号的数字,允许在开头带负号“-”
numberDecimal:带小数点的数字
numberPassword:数字密码,显示时用*代替
datetime:时间日期格式,除了数字外,还允许输入横线、斜杠、空格、冒号
date:日期格式,除了数字外,还允许输入横线-和斜杠/
time:时间格式,除了数字外,还允许输入冒号:
maxLength:指定文本允许输入的最大长度
hint:指定提示文本的内容
textColorHint:指定提示文本的颜色

//更换编辑框的光标
cursorVisible:指定光标是否可见
textCursorDrawable,指定光标的图像

//更换边框
background:
@null:隐藏边框

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:[email protected]/shape_edit_focus"/>
<item android:drawable="@drawable/shape_edit_normal“/>
</selector>

//自动隐藏输入法
常用的做法时给该页面的根节点设置focusable和focusableInTouchMode属性,通过将这两个属性设置为true可强制让根节点获得焦点,避免输入法自动弹出


编辑框文本达到指定长度时,自动关闭输入法
1.获得允许输入的最大长度,当输入长度等于最大长度时,即触发关闭软键盘
获取输入的最大长度的函数见上
监控当前已输入的文本长度用到文本监听器接口TextWatcher,其包含三个方法:
beforeTextChanged:在文本改变之前触发
onTextChanged:在文本改变过程中触发
afterTextChanged:在文本改变之后触发
输入法通过系统服务INPUT_METHOD_SERVICE管理,所以隐藏输入法也要通过该服务实现
方法1:
public static void hideAllInputMethod(Activity act){
InputMethodManager imm=(InputMethodManager)act.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm.isActive() == true){
imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
}
}
方法2:
public static void hideOneInputMethod(Activity act,View v){
InputMethodManager imm = (InputMethodManager)act.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
}

//输入回车符自动跳转(按下回车后,自动跳到下一个编辑框)
用到了文本监听器接口TextWatcher,主要监听用户是否输入回车符


private class jumpTextWatcher implements TextWatcher{
private EditText mThisView = null;
private View mNextView = null;

public JumpTextWatcher(EditText vThis,View vNext){
super();
mThisView = vThis;
if(vNext!=null){
mNextView = vNext;
}
}
@文本改变前
@文本发生改变

@Override
public void afterTextChanged(Editable s){
String str=s.toString;
if(str.indexOf(" ")>=0||str.indexOf(" ")>=0){ //发现回车符或换行符
mThisView.setText(str.replace(" ","").replace(" ","")); //去掉回车符或换行符
if(mNextView!=null){
mNextView.requestFocus(); //让下一个视图获得焦点,即将光标移动到下一个视图
if(mNextView instanceof EditText){
EditText et = (EditText)mNextView;
//让光标自动移到编辑框内部的文本末尾
//方式一、直接调用EditText的setSelection方法
et.setSelection(et.getText().length());
//方式二、调用Selection类的setSelection方法
//Editable edit=et.getText();
//Selection.setSelection(edit,edit.length());
}
}
}
}
}


自动完成编辑框AutoCompleteTextView:
实现原理:
EditText结合监听器TextWatcher与下拉列表Spinner,一旦监控到EditText发生改变,就会自动弹出适配好的文字下拉列表
属性:
completionHint:设置下拉列表底部的提示文字
completionThreshold:设置至少输入多少个字符才会显示提示
dropDownHorizontalOffset:设置下拉列表与文本框之间的水平偏移
dropDownVerticalOffset:设置下拉列表与文本框之间的垂直偏移
dropDownHeight:设置下拉列表的高度
dropDownWidth:设置下拉列表的宽度

Android四大组件之一,Activity:
一个Activity代表一个页面,Activity的onCreate方法是页面的入口函数
调用startActivity方法可以跳转到下一个页面

1.生命周期
onCreate:创建页面。把页面上的各个元素加载到内存中
onStart:开始页面。把页面显示在屏幕上
onResume:恢复页面。让页面在屏幕上活动起来,如开启动画、开始任务等
onPause:暂停页面。让页面在屏幕上的动作停下来
onStop:停止页面。把页面从屏幕上撤下来
onDestroy:销毁页面。把页面从内存中清除掉
onRestart:重启页面。重新加载内存中的页面数据

打开页面
onCreate--onStart--onResume
跳转页面
上一个页面onPause--下一个页面onCreate--onStart--onResume--上一个页面onStop
从这个页面返回的奥上一个页面
下一个页面onPause--上一个页面onRestart--onStart--onResume--下一个页面onStop--onDestroy

横屏、竖屏切换
进行切换时都是原屏幕的页面从onPause到onStop再到onDestroy一路销毁,然后新屏幕的页面从onCreate到onStart再到onResume一路创建而来

2.组成部分
3.工作原理
4.页面间的消息传递


































































































































































































































































































































































以上是关于Android的主要内容,如果未能解决你的问题,请参考以下文章

androidAndroid 获取系统各个目录

AndroidAndroid不同版本下Notification创建方法

AndroidAndroid Q 系统视频演示

AndroidAndroid源码及系统目录结构分析

AndroidAndroid属性allowBackup安全风险

Androidandroid镜像翻转