简单控件
文本显示
文本内容
- 可以使用XML的属性android:text设置文本
<TextView
android:id="@+id/tv_hello"
android:layout width="wrap content"
android:layout height="wrap content"
android:text="你好,世界"/>
- Java代码中调用文本视图对象的setText方法设置文本
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("你好,世界");
对于第一种方法,Android studio不推荐直接在XML布局文件里直接写字符串,会提示“Hardcoded string xxx should use @string resource”,这样修改需要一个个XML文件改,费时费力。推荐把字符串放到专门的地方进行管理,@string位于res/values目录下的strings.xml
<resource>
<string name="app_name">xherlock</string>
<string name="hello">你好,世界</string>
</resource>
上述代码定义了一个名为app_name的字符串常量,值为xherlock,以及名为hello,值为“你好,世界”的字符串常量。此时布局xml就可以改成,效果和之前一样
<TextView
android:id="@+id/tv_hello"
android:layout width="wrap content"
android:layout height="wrap content"
android:text="@string/hello"/>
java这样
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText("R.string.hello");
文本大小
java中调用setTextSize方法,XML添加属性android:textSize="30px"(必须带单位)
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setTextSize(30);
常见单位:
- px:手机屏幕最小显示单位,与设备显示屏有关
- dp:也写作dip,与设备无关的显示单位,只与屏幕的尺寸有关
- sp:原理与dp差不多,但被专门用来设置字体大小,手机设置里显示字体大小通常只有sp可以正确调整,java的setTextSize源码正是默认sp
文本颜色
java的setTextColor,在Color类中定义了12种颜色
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setTextColor(Color.GREEN);
但XML无法引用Color类的颜色常量,因此使用了一套规范的编码标准,色值交给由透明度alpha和RGB三原色,八位十六进制数表示(前两位表示透明度,FF表示完全不透明,00表示完全透明)或者六位十六进制数表示
但是对于6位表示法,XML中默认不透明,java代码中默认透明,因此java代码最好用8位
XML中添加属性android:textColor,并在色值前添加井号#。同时和字符串资源一样,android也把颜色当作一种资源,res/values目录下的colors.xml,调用就是@color/颜色名称
<resources>
<color name="colorPrimary">#008577</color>
</resources>
不仅文本颜色,还有背景颜色,xml中使用android:background来设置,java中两种方式
- 色值来自Color类或16进制数,则调用setBackgroundColor
- 色值来自colors.xml,则调用setBackgroundResource(R.color.xxx)
视图基础
设置视图的宽高
layout_height或layout_width
- match_parent:表示与上级视图保持一致
- warp_content:表示与内容自适应,但最宽不超过上级视图的宽度,一旦超过要换行;最高不能超过上级视图的高度,一旦超过就会被隐藏
- dp:单位具体尺寸
XML文件中采用任意方式均可设置视图的宽高,但Java设置复杂
- 调用getLayoutParams方法获取布局参数(默认px,需要从dp转为px),参数类型为ViewGroup.LayoutParams
- 布局参数的width、height,修改这两个属性值即可调整控件的宽高
- 调用setLayoutParams方法,填入修改后的布局参数使之生效
public static int dip2px(Context content, float dpValue) {
float scale = context.getResource().getDisplayMetrics().density; // 获取当前手机的像素密度(1dp=?px)
return (int) (dpValue * scale + 0.5f);
}
TextView tv_code = findViewById(R.id.tv_code);
ViewGroup.LayoutParams params = tv_code.getLayoutParams();
params.width = Utils.dip2px(this, 300);
tv_code.setLayoutParams(params);
设置视图的间距
android:layout_marginTop、android:layout_marginLeft、android:layout_marginRight、android:layout_marginBottom、android:layout_margin(一次性四周间距)
layout_margin不仅可以用于文本视图,还可用于所有视图,因为不管布局还是控件,统统由视图基类View派生而来,而layout_margin正是View的一个通用属性,所以View的子孙皆可使用它
与layout_margin对应的是内部间距padding,也通用
设置视图的对齐方式
App界面视图排列默认靠左朝上对齐,XML中使用android:layout_gavity可以指定当前视图的对齐方向,当属性值为top时表示朝上对齐,bottom朝下对齐,left朝左,right朝右;既朝上又靠左,top|left
对于内部视图的对齐方式,使用android:gravity指定
常用布局
线性布局LinearLayout
- 通过属性android:orientiation区分方向:从左到右horizontal(默认),从上到下vertical
- 权重:指线性布局的下级视图各自拥有多大比例的宽高,android:layout_weight
相对布局RelativeLayout
相对位置的属性取值 | 相对位置说明 |
---|---|
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 | 当前视图与上级视图的底部对齐 |
网格布局GridLayout
- 要想实现类似表格的多行多列形式可采用网格布局,默认从左往右,从上往下排列,塞满后下一行,直到放完所有下级视图
- 判断容纳几行几列:android:columnCount和rowCount,指定列数和行数
滚动视图ScrollView
- 垂直方向滚动ScrollView:layout_width属性值match_parent,layout_height属性值wrap_content
- 水平方向滚动HorizontalScrollView:layout_width属性值wrap_content,layout_height属性值match_parent
- 滚动视图节点下必须只能挂着一个子布局节点
按钮触控
按钮控件Button是由TextView派生而来,文本视图拥有的属性和方法,包括文本内容、大小、颜色等,按钮控件均可使用
不同点:有默认按钮背景、内部文本默认居中对齐,还有textAllCaps、onClick两个属性
- textAllCaps:按钮控件text默认转成大写字母,textAllCaps=False时,不转大写
- onClick:点击后Java代码调用方法
点击事件:但实际开发中不推荐onClick,而是在代码中给按钮对象注册点击监听器
package com.example.chapter03;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.chapter03.util.DateUtil;
public class ButtonClickActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_result; // 声明一个文本视图实例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button_click);
tv_result = findViewById(R.id.tv_result); // 获取名叫tv_result的文本视图
// 从布局文件中获取名叫btn_click_single的按钮控件
Button btn_click_single = findViewById(R.id.btn_click_single);
// 设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_single.setOnClickListener(new MyOnClickListener());
// 从布局文件中获取名叫btn_click_public的按钮控件
Button btn_click_public = findViewById(R.id.btn_click_public);
// 设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_public.setOnClickListener(this);
}
// 定义一个点击监听器,它实现了接口View.OnClickListener
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) { // 点击事件的处理方法
String desc = String.format("%s 您点击了按钮:%s",
DateUtil.getNowTime(), ((Button) v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
}
@Override // 可以监听多个
public void onClick(View v) { // 点击事件的处理方法
if (v.getId() == R.id.btn_click_public) { // 来自按钮btn_click_public
String desc = String.format("%s 您点击了按钮:%s",
DateUtil.getNowTime(), ((Button) v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
}
}
长按事件:setOnLongClickListener,重写的是onLongClick
禁用按钮:android:enabled属性,False时禁用;setEnabled方法来设置按钮的可用状态
图像显示
ImageView,需要把图片放到res/drawable目录中,然后再去引用该图片的资源名称,属性android:src来设置,格式为"@drawable/不含扩展名的图片名称"
也可以java设置setImageResource
ImageView iv_scale = findViewById(R.id.iv_scale);
iv_scale.setImageResource(R.drawable.apple);
ImageView默认图片居中显示,无论多大,都会自动缩放图片,使之刚好够ImageView边界,且保持宽高比,可以通过android:scaleType来贺之缩放类型,java是setScaleType方法设置
XML | ScaleType | 说明 |
---|---|---|
fitCenter | FIT_CENTER | 保持宽高比例,缩放图片居中 |
centerCrop | CENTER_CROP | 缩放图片使其充满视图(超出被裁减)并居中 |
centerInside | CENTER_INSIDE | 保持宽高比例,缩小图片使之居中(只缩小不放大) |
center | CENTER | 保持原始尺寸,居中 |
fitXY | FIT_XY | 缩放拉伸填满视图 |
fitStart | FIT_START | 保持宽高比例,缩放使其位于视图上方或左侧 |
fitEnd | FIT_END | 保持宽高比例,缩放使其位于视图下方或右侧 |
图像按钮ImageButton:和Button区别
- Button既可显示文本也可显示图片(setBackgroundResource)
- Button背景图fitXY方式,无法按比例缩放
- Button只能靠一张图片
同时展示文本和图像
Button提供和图标有关的属性:
- drawableTop:文字上方的图片
- drawableBottom:文字下方的图片
- drawableLeft:文字左边的图片
- drawableRight:文字右边的图片
- drawablePadding:制定图片与文字间距