布局中基本属性
宽: android:layout_width
高: android:layout_height
值: wrap_content 按内容的实际大小来衡量
match_parent 铺满父容器
固定值,如 100dp 50dp
处理内容(或者孩子)的对齐方式
android:gravity="bottom|right"
可以选的值 left 、 right 、 top 、 bottom 、 center(居中) 、
center_horizontal(水平居中) 、 center_vertical(垂直居中)
背景: android:background="@drawable/pic3" 可以设置颜色或者图片或者形状
内边距: android:padding 四周向内设置内边距
paddingLeft 左内边距
paddingRight 右内边距
paddingTop 顶部内边距
paddingBottom 底部内边距
外边距: android:layout_margin 四周向外的边距
layout_marginLeft 左外边距
layout_marginRight 右外边距
layout_marginTop 顶部外边距
layout_marginBottom 底部外边距
显示隐藏: android:visibility="visible" 默认值
visible 表示可见
invisible 不可见 , 占位置
gone 不可见 , 不占位置
文本框TextView
android:text="@string/hello_world" 设置文本内容
android:textColor="@color/my_tx_color" 设置文本颜色
颜色可以直接设置颜色值用 # 开头 如:( RGB 模式) #FF0000 ( ARGB ) #FFFF0000
也可以在 values 下定义颜色值
#ff0000
在布局中使用 @ 引用颜色 android:textColor="@color/my_tx_color"
android:textSize="30sp" 文本大小 ( 单位为 sp ,默认大小是 16sp)
关于大小和尺寸可以在 values 下定义 dimen
30sp
然后用 @ 来引用
android:textSize="@dimen/m_tx_size"
android:shadowRadius="3.0" 设置文本阴影半径
android:shadowColor="#000000" 阴影颜色
android:ellipsize="end" 过长文本处理方式 start\middel\end 表示在开头、中间、结尾加省略号 ( 结合 lines 属性一起使用 )
android:lines="2" 设置显示多少行
android:maxLines="3" 最大行数
android:minLines="2" 最少行数
android:textScaleX="0.5" 水平方向拉伸或者压缩文本 ( 瘦一点或者胖一点 )
android:textStyle="italic" 文本样式(粗体 bold ,斜体 italic )
android:marqueeRepeatLimit="marquee_forever" 跑马灯的重复次数 marquee_forever 表示永久
android:drawableLeft="@drawable/ic_launcher" 在文本左边加小图标 ,
类似的还有 drawableRight 右边加小图标 drawableTop 顶部加小图标 drawableBottom 底部加小图标
布局
普通视图还是布局都继承自 View ,其中 ViewGroup 就是所有布局的父类, ViewGroup 继承自 View 同时可以对 View 进行管理 ( 编排,控制 View 显示位置和大小 )
FrameLayout:帧布局 ( 框架布局 ) ,布局特性是所有孩子默认叠在该容器左上角
其中孩子中可以使用 android:layout_gravity 来调整自己在父容器中的位置 ( 主动权在孩子身上 ) ,跟 android:gravity 不一样的是 android:gravity 主动权在父元素身上
LinearLayout:线性布局,可以水平编排或者垂直编排孩子的显示
android:orientation="vertical" 设置方向 vertical 垂直 ( 沿着 y 坐标 )
horizontal 水平方向(沿着 x 坐标)
线性布局中可以使用 android:layout_weight 属性设置权重,可以将 LinearLayout 中剩下的部分进行比例划分
LinearLayout 中如果需要使用占位视图可以使用 Space
android:layout_width="1dp"
android:layout_height="0dp"
android:layout_weight="1" />
LinearLayout 中使用 android:gravity 可以调整孩子的对齐方式,但是要注意方向,
垂直的 ( 如果高不定 ) ,可以调整孩子在 left\centerhorizontal\right
如果是水平 ( 宽如果不定 ) 可以调整孩子在 top\centervertical\bottom
RelativeLayout:相对布局
第一种:子视图相对于父容器,取值为 true/false
android:layout_alignParentLeft="true" 靠父容器左侧
android:layout_alignParentRight="true" 靠父容器右侧
android:layout_alignParentTop="true" 靠父容器顶部
android:layout_alignParentBottom="true" 靠父容器底部
android:layout_centerVertical="true" 垂直居中
android:layout_centerInParent="true" 居中
android:layout_centerHorizontal="true" 水平居中
第二种:子视图之间相互参考,值对方视图的 id --> @id/xxx,id的声明与使用要注意先后顺序
id 的声明: @+id/id 名称 如: @+id/tv_a
id 的引用: @id/id 名称 如: @id/tv_a
android:layout_toLeftOf 在谁的左侧
android:layout_toRightOf 在谁的右侧
android:layout_above 在谁的上面
android:layout_below 在谁的下面
android:layout_alignTop 顶部对齐
android:layout_alignLeft 左侧对齐
android:layout_alignRight 右侧对齐
android:layout_alignBottom 底部对齐
布局复用
如果有多个页面中存在相同部分效果,可以将相同部分抽出来,然后其他页面应用,提高复用性,其中引用需要使用include标签,用法 定义一个布局,如:titile.xml
在需要使用给title_layout的页面上直接用include导入
布局引入的合并标签
标签可以将导入的布局中的孩子直接添加到目标容器中,减少被引入的布局的根节点
Java中操作布局元素
继承Activity 重写onCreate方法表示监听窗户的创建
super.onCreate(savedInstanceState);
表示窗口已经创建成功(空白窗口)
setContentView(R.layout.activity_main)
;表示设置布局的方法,一般放在onCreate方法中
处理布局中的视图
TextView tvResult=findViewById(R.id.tv)
;表示从布局中加载视图对象的方法,一般要在setContentView之后使用
tvResult.setText / setTextColor / setTextSize ...
注意: java 中使用颜色值必须是十六进制表示法,如 xml 中的红色 #ff0000 对应的 java 表示为 0xff0000 ,并且 java 中建议使用 ARGB 方式表示法,如红色 (RGB
表示 )0xff0000 建议使用 (ARGB 表示 )0xffff0000
按钮----Button
button继承TextView,可以响应用户按下状态的视图
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我试试"/>
按钮的基本设置
基本监听操作
Android系统中针对每一个View,都提供了触摸、点击、长按等基本监听
点击监听的实现(三种方法)
第一种方式
创建一个内部类继承OnClickListener
class BtnClick implements OnClickListener {
当View被点击触发该方法,其中参数v表示被点击的目标View
@Override
public void onClick(View v) {
count++;
tv.setText("按钮被点击了" + count + "次");
}
}
Activity的onCreate()中
从布局中获取按键对象,初始化按键
Button btn = (Button) findViewById(R.id.btn_1);
TextView tv = (TextView) findViewById(R.id.tv_1);
创建监听对象
BtnClick btnClick = new BtnClick();
给按钮设置监听
btn.setOnClickListener(btnClick);
第二种 匿名内部类的方式实现监听
private OnClickListener onBtnListener=new OnClickListener(){
@Override
public void onClick(View v){
tv.setText("匿名内部类的方式设置监听")
}
};
设置监听
btn.setOnClickListener(onBtnListener);
第三种 Activity上直接imPlements OnClickListener然后重写
onClick方法
public classMainActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv=(TextView)findById(R.id.tv_1);
使用this关键字来获取监听器对象
findViewById(R.id.btn_1).setOnClickListener(this);
}
@Override
public void OnClick(View v){
针对多个按钮都需要设置监听的情况,一般只需要一个监听器,然后在监听其中室友视图id区分是谁被点击
switch(v.getId()){
case R.id.btn_1:
tv.setText("直接在Activity上实现的监听方式");
break;
case R.id.btn_2:
tv.setText("直接在Activity上实现的监听方式");
break;
....
}
}
}
长按监听
介于 Android 事件的基本流程如下:
基本事件
ACTION_DOWN 按下瞬间,手指接触屏幕瞬间
ACTION_MOVE 按下之后离开之前的整个过程(重复) 会触发长按
ACTION_UP 离开瞬间 ,手指从屏幕上离开的瞬间
可以看出只有 move 部分有时间,所以可以猜测出 move 部分会触发长按,但是点击触发的位置是 up ,所以会有事件之间传递的问题,为了区分长按和点击需
要在长按触发的方法中通过 true 和 false 处理是否需要拦截
// 设置长按监听 setOnLongClickListener
btn2.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
tvResult.setText(" 按钮 2 被长按 ");
//false 表示不拦截事件
//true 表示拦截事件,事件到此为止
return true;
}
});
Logcat
设备运行中打印 log 信息的信息面板, logcat 等级:
verbose : 最详细的等级 --> Log.v
debug : debug 级别的日志,一般是调试性日志 -->Log.d
info : info 级别的日志,一些运行中的提示信息 --> Log.i
warn : 警告级别日志 -->Log.w
error : 错误级别的日志 -->Log.e
程序中自己打印 log 信息,可以使用如下方式
Log.v( 标签,内容 ); 如 Log.v("m_tag"," 这是一个 log 信息 ");
空指针是最常见的一种异常, null.xxx ,所以出现空指针最快速的解决办法就是找点之前的内容