简单控件

文本显示

文本内容

  1. 可以使用XML的属性android:text设置文本
<TextView
          android:id="@+id/tv_hello"
          android:layout width="wrap content"
          android:layout height="wrap content"
          android:text="你好,世界"/>
  1. 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设置复杂

  1. 调用getLayoutParams方法获取布局参数(默认px,需要从dp转为px),参数类型为ViewGroup.LayoutParams
  2. 布局参数的width、height,修改这两个属性值即可调整控件的宽高
  3. 调用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方法设置

XMLScaleType说明
fitCenterFIT_CENTER保持宽高比例,缩放图片居中
centerCropCENTER_CROP缩放图片使其充满视图(超出被裁减)并居中
centerInsideCENTER_INSIDE保持宽高比例,缩小图片使之居中(只缩小不放大)
centerCENTER保持原始尺寸,居中
fitXYFIT_XY缩放拉伸填满视图
fitStartFIT_START保持宽高比例,缩放使其位于视图上方或左侧
fitEndFIT_END保持宽高比例,缩放使其位于视图下方或右侧

图像按钮ImageButton:和Button区别

  • Button既可显示文本也可显示图片(setBackgroundResource)
  • Button背景图fitXY方式,无法按比例缩放
  • Button只能靠一张图片

同时展示文本和图像

Button提供和图标有关的属性:

  • drawableTop:文字上方的图片
  • drawableBottom:文字下方的图片
  • drawableLeft:文字左边的图片
  • drawableRight:文字右边的图片
  • drawablePadding:制定图片与文字间距
最后修改:2024 年 01 月 04 日
如果觉得我的文章对你有用,请随意赞赏