Loading... # 简单控件 ## 文本显示 ### 文本内容 1. 可以使用XML的属性android:text设置文本 ~~~xml <TextView android:id="@+id/tv_hello" android:layout width="wrap content" android:layout height="wrap content" android:text="你好,世界"/> ~~~ 2. Java代码中调用文本视图对象的setText方法设置文本 ~~~java 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** ~~~xml <resource> <string name="app_name">xherlock</string> <string name="hello">你好,世界</string> </resource> ~~~ 上述代码定义了一个名为app_name的字符串常量,值为xherlock,以及名为hello,值为“你好,世界”的字符串常量。此时布局xml就可以改成,效果和之前一样 ~~~xml <TextView android:id="@+id/tv_hello" android:layout width="wrap content" android:layout height="wrap content" android:text="@string/hello"/> ~~~ java这样 ~~~java TextView tv_hello = findViewById(R.id.tv_hello); tv_hello.setText("R.string.hello"); ~~~ ### 文本大小 java中调用setTextSize方法,XML添加属性android:textSize="30px"(必须带单位) ~~~java 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种颜色 ~~~java 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/颜色名称 ~~~xml <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设置复杂 1. 调用getLayoutParams方法获取布局参数(默认px,需要从dp转为px),参数类型为ViewGroup.LayoutParams 2. 布局参数的width、height,修改这两个属性值即可调整控件的宽高 3. 调用setLayoutParams方法,填入修改后的布局参数使之生效 ~~~java public static int dip2px(Context content, float dpValue) { float scale = context.getResource().getDisplayMetrics().density; // 获取当前手机的像素密度(1dp=?px) return (int) (dpValue * scale + 0.5f); } ~~~ ~~~java 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,而是在代码中给按钮对象注册点击监听器 ~~~java 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 ~~~java 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:制定图片与文字间距 最后修改:2024 年 01 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏