0x04 简单控件

(1)文本显示

a. 添加文本

设置文本内容主要有两种方式:

  • XML:通过属性android:text设置

    • 在 layout 目录下新建 activity_text_view.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      <TextView
      android:id="@+id/tv_ha"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="你好,安卓" /> </LinearLayout>
  • Java:通过调用文本视图对象(TextView)的setText()方法设置

    • 在 java/(package) 下新建 TextViewActivity.java

      package com.example.myapplication;
      
      import android.os.Bundle;
      import android.widget.TextView; import androidx.annotation.Nullable;
      import androidx.appcompat.app.AppCompatActivity; public class TextViewActivity extends AppCompatActivity {
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_text_view);
      TextView tv_ha = findViewById(R.id.tv_ha);
      tv_ha.setText("你好,世界");
      }
      }

特别的,可以将需要添加的文本内容统一设置在 res/values/string.xml 中,在 XML 中通过text="@string/***"获取,在 Java 中通过setText(R.string.***)获取

b. 字体大小

设置文本大小主要有两种方式:

  • XML:通过属性android:textSize设置

    需要设置的单位:

    • px:手机屏幕最小显示单位,与设备显示屏有关
    • dp:与屏幕尺寸有关
    • sp:专门用于设置字体大小,在系统设置中可以调整字体大小
    <TextView android:textSize="20px"></TextView>
  • Java:通过调用setTextSize()方法设置

    tv_ha.setTextSize("20");

    此时单位由官方设置为 sp

c. 字体颜色

  • XML

    • 文本文字颜色:通过属性android:textColor设置,格式为 RGB(A) 的十六进制数

      <TextView android:textColor="#00ff00ff"></TextView>
      // or
      <TextView android:textColor="#00ff00"></TextView>
    • 文本背景颜色:通过属性android:background设置

      <TextView android:background="@color/green"></TextView>
  • Java

    • 文本文字颜色:通过调用setTextColor()方法设置,可从 Color 类中选色或使用十六进制数

      tv_ha.setTextColor(Color.GREEN);
      // or
      tv_ha.setTextColor(0xFF00FF00); // 前两位为透明度
      // or
      tv_ha.setTextColor(0x00FF00); // 不包含透明度
    • 文本背景颜色:通过调用setBackgroundColor()方法设置

      tv_ha.setBackgroundColor(Color.GREEN)	// 从 Java 的 Color 类选色
      tv_ha.setBackgroundColor(R.color.green) // 从 XML 的 color 类中选色

(2)视图基础

a. 宽高

  • XML:通过属性android:layout_width/android:layout_height设置宽/高

    共三种取值:

    • match_parent:与父视图一致
    • wrap_content:与内容自适应
    • dp为单位的数值
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="300dp"></LinearLayout>
  • Java:在 XML 中设置其宽高为wrap_content的前提下,

    1. 调用控件对象的getLayoutParams()方法,获取该控件的布局参数
    2. 修改宽(width)高(height)属性的参数
    3. 调用控件对象的setLayoutParams()方法,设置修改后的布局参数
    // ...
    import android.view.ViewGroup; public class TextViewActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    // ...
    ViewGroup.LayoutParams params = tv_ha.getLayoutParams();
    params.width = 20; // 单位为 px
    params.height = 40;
    tv_ha.setLayoutParams(params);
    }
    }

    对于宽高单位从 dp 向 px 的转换,可以通过以下方法实现:

    // (package)目录下添加 utils 软件包,新建 dp2px.java 文件,内容如下:
    package com.example.myapplication.utils; import android.content.Context; public class dp2px {
    public static int d2p(Context context, float dpValue) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int)(dpValue * scale + 0.5f); // 0.5f 用于四舍五入
    }
    }
    // 在对应 (Activity).java 文件中引用上述代码
    // ...
    import com.example.myapplication.utils.dp2px;
    public class TextViewActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    // ...
    params.width = dp2px.d2p(this, 300);
    // ...
    }
    }

b. 边距

  • XML

    • 通过属性android:layout_margin设置外边距
    • 通过属性android:padding设置内边距
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="300dp"
    android:padding="60dp">
    </LinearLayout>

c. 对齐

  • XML

    • 通过属性android:layout_gravity设置外对齐
    • 通过属性android:gravity设置内对齐
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="left"
    android:gravity="top|right">
    </LinearLayout>

(3)常用布局

a. 线性布局 LinearLayout

  • 通过属性android:orientation设置排列方向:水平(horizontal)/垂直(vertical)
  • 通过属性android:layout_weight设置布局权重
    • android:layout_width="0dp":此时权重为宽度比例
    • android:layout_height="0dp":此时权重为高度比例
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:background="#ff0000"
android:textColor="#ffffff"
android:text="横向第一项" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:background="#ff0000"
android:textColor="#ffffff"
android:text="横向第二项" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:layout_gravity="center"
android:background="#00ff00"
android:textColor="#ffffff"
android:text="竖向第一项" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:layout_gravity="center"
android:background="#00ff00"
android:textColor="#ffffff"
android:text="竖向第二项" />
</LinearLayout> </LinearLayout>

b. 相对布局 RelativeLayout

  • 相对布局的下级视图位置由其他视图决定,用于确定下级视图位置的参照物分为

    1. 与该视图自身平级的视图
    2. 该视图的上级视图
  • 若未设置,则默认为左上角
相对位置取值 相对位置说明
android:above="@id/xxxxx" 当前视图在指定视图的上边
android:toLeftOf="@id/xxxxx" 当前视图在指定视图的左边
android:toRightOf="@id/xxxxx" 当前视图在指定视图的右边
android:below="@id/xxxxx" 当前视图在指定视图的下边
android:alignTop="@id/xxxxx" 当前视图在指定视图的上对齐
android:alignLeft="@id/xxxxx" 当前视图在指定视图的左对齐
android:alignRight="@id/xxxxx" 当前视图在指定视图的右对齐
android:alignBottom="@id/xxxxx" 当前视图在指定视图的下对齐
android:layout_centerInParent="true" 当前视图在上级视图的中间
android:layout_centerHorizontal="true" 当前视图在上级视图的水平居中
android:layout_centerVertical="true" 当前视图在上级视图的垂直居中
android:alignParentTop="true" 当前视图在上级视图的上对齐
android:alignParentLeft="true" 当前视图在上级视图的左对齐
android:alignParentRight="true" 当前视图在上级视图的右对齐
android:alignParentBottom="true" 当前视图在上级视图的下对齐

c. 网格布局 GridLayout

  • 支持多行多列的表格排列
  • 默认从左往右、从上往下排列,含有以下属性
    1. columnCount属性:指定网格列数
    2. rowCount属性 :指定网格行数
  • 可以通过设置权重属性layout_columnWeightlayout_rowWeight进行行列填充调整

d. 滚动视图 ScrollView

  • 垂直滚动视图:ScrollView

    <ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    </ScrollView>
  • 水平滚动视图:HorizontalScrollView

    <HorizontalScrollView
    android:layout_width="wrap_content"
    android:layout_height="match_parent">
    </HorizontalScrollView>

(4)按钮触控

a. 控件 Button

控件 Button 由 TextView 派生而来,有一定的区别

  • 有默认的按钮背景

  • 内部文本默认居中对齐

  • 默认将小写字母转为大写

  • textAllCaps属性:指定是否将英文字母转为大小写,true/false

    • 保持原状:android:textAllCaps="false"
  • onClick属性:接管用户点击动作,可设置触发的方法

    • XML

      <Button
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="获取时间"
      android:textColor="@color/black"
      android:textSize="20sp"
      android:textAllCaps="false"
      android:onClick="aClickEvent" />
      <TextView
      android:id="@+id/tv_res"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:textColor="@color/black"
      android:textSize="20sp" />
    • Java

      • utils/getDateString.java

        package com.example.myapplication.utils;
        
        import java.text.SimpleDateFormat;
        import java.util.Date; public class getDateString {
        public static String getNowTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        return sdf.format(new Date());
        }
        }
      • MainActivity.java

        package com.example.myapplication;
        
        import androidx.appcompat.app.AppCompatActivity;
        
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView; import com.example.myapplication.utils.getDateString; public class MainActivity extends AppCompatActivity { private TextView tv_res; @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_res = findViewById(R.id.tv_res);
        } public void aClickEvent(View view) {
        String str = String.format("%s:现在时间%s", ((Button)view).getText(), getDateString.getNowTime());
        tv_res.setText(str);
        }
        }

b. 点击事件和长按事件

XML:

<Button
android:id="@+id/btn_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取时间"
android:textColor="@color/black"
android:textSize="20sp"
android:textAllCaps="false" />
<TextView
android:id="@+id/tv_res"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/black"
android:textSize="20sp" />

监听器:用于监听控件的动作行为,只有控件发生了指定的动作,监听器才会触发并执行

  • 点击监听器:setOnClickLintener()方法设置,当按钮被按住的时间少于 500 毫秒时会触发

    public class MainActivity extends AppCompatActivity {
    
        private TextView tv_res;
    
        @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv_res = findViewById(R.id.tv_res);
    findViewById(R.id.aClickEvent).setOnClickListener(new AOnClickEvent(tv_res));
    } static class AOnClickEvent implements View.OnClickListener { private final TextView tv_res; // 构造函数
    public AOnClickEvent(TextView tv_res) {
    this.tv_res = tv_res;
    } @Override
    public void onClick(View view) {
    // 通过判断 id 确认执行项目,实现简单函数复用
    if (view.getId() == R.id.btn_time) {
    String str = String.format("%s:现在时间%s", ((Button)view).getText(), getDateString.getNowTime());
    tv_res.setText(str);
    }
    }
    }
    }
  • 长按监听器:setOnLongClickLintener()方法,当按钮被按住的时间超过 500 毫秒时会触发

    findViewById(R.id.aClickEvent).setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
    String str = String.format("%s:现在时间%s", ((Button)view).getText(), getDateString.getNowTime());
    tv_res.setText(str);
    return true;
    }
    });
    }

对于上述写法涉及了匿名内部类的概念,可以用 lambda 写法替换,如:

findViewById(R.id.aClickEvent).setOnLongClickListener(view -> {
String str = String.format("%s:现在时间%s", ((Button)view).getText(), getDateString.getNowTime());
tv_res.setText(str);
return true;
});

c. 禁用和恢复按钮

  • 在实际情况中,按钮通常有两种类型:

    • 不可用按钮:不允许点击,点击时无事件触发,文字灰色
    • 可用按钮:允许点击,点击时触发事件,文字颜色正常
  • 是否允许点击由enable属性控制,其值为true时允许点击,值为false时不允许

  • XML:android:enable="true"

  • Java:findViewById(R.id.xxxxx).setEnable(true)

(5)图像显示

a. 图像视图 ImageView

图像视图通常位于 res/drawable*** 目录

XML 中的缩放类型 Java ScaleType 类的缩放类型 说明
fitXY FIT_XY 图片填充
fitStart FIT_START 保持宽高比,位于视图上方/左侧
fitCenter FIT_CENTER 保持宽高比,位于视图中间
fitEnd FIT_END 保持宽高比,位于视图下方/右侧
center CENTER 保持图片原尺寸,并使其位于视图中间
centerCrop CENTER_CROP 拉伸图片使其充满视图,并位于视图中间
centerInside CENTER_INSIDE 保持宽高比,缩小图片使其位于视图中间
  • XML:通过android:src="@drawable/pictureName"属性设置

    <ImageView
    android:id="@+id/iv"
    android:layout_width="match_parent"
    android:layout_height="220dp"
    android:src="@drawable/ic_launcher_background"
    android:scaleType="fitCenter" />
  • Java:通过调用setImageResource(R.drawable.pictureName)方法设置

    // ...
    import android.widget.ImageView;
    // ...
    ImageView iv = findViewById(R.id.iv);
    iv.setImageResource(R.drawable.ic_launcher_background);
    iv.setScaleType(ImageView.ScaleType.FIT_CENTER);

b. 图像按钮 ImageButton

控件 ImageButton 由 ImageView 派生而来,有一定的区别

  • 与 Button 相比,ImageButton

    • 只能显示图片
    • 可按比例缩放
    • 可分别在前景和背景显示图片,从而事项两张图片的叠加效果
      • 适合表达特殊字体或公式等
  • 与 ImageView 相比,ImageButton
    • 有默认的按钮背景
    • 默认缩放类型为 center

c. 图像与文本结合

  • 利用 LinearLayout 对 ImageView 和 TextView 组合布局
  • 利用 Button 的android:drawableXxx属性设置文本周围的图标
    • android:drawableTop:指定文字上方的图片
    • android:drawableLeft:指定文字左侧的图片
    • android:drawableRight:指定文字右侧的图片
    • android:drawableBottom:指定文字下方的图片
    • android:drawablePadding:指定文字与图片的间距

点我进入下一节


Android 开发入门(2)的更多相关文章

  1. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  2. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  3. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  4. 教我徒弟Android开发入门(一)

    前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...

  5. Android开发入门经典【申明:来源于网络】

    Android开发入门经典[申明:来源于网络] 地址:http://wenku.baidu.com/view/6e7634050740be1e650e9a7b.html?re=view

  6. Android开发入门要点记录:四大组件

    cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...

  7. Android开发入门

    教我徒弟Android开发入门(一) 教我徒弟Android开发入门(二) 教我徒弟Android开发入门(三) 出处:http://www.cnblogs.com/kexing/tag/Androi ...

  8. android开发入门经验 ADT Bundle环境搭建

    现在有许多做开发的转做移动端开发,做J2EE的转做Android开发,我也把自己的一些入门经验与大家分享一下,希望能给你带来帮助. 工具/原料 JDK,ADT,JAVA 方法/步骤   开发工具的准备 ...

  9. [Android]Android开发入门之HelloWorld

    引言:在做Unity开发的时候,发现这么个问题,虽然Unity是跨平台的,能够进行Android,IOS,Web,PC等开发,但如果要实现一些稍微系统层的东西,还是需要通过通信,调用原系统的接口(自定 ...

  10. 教我徒弟Android开发入门(二)

    前言: 上一期实现了简单的QQ登录效果,这一期继续对上一期进行扩展 本期的知识点: Toast弹窗,三种方法实现按钮的点击事件监听 正文:   Toast弹窗其实很简单,在Android Studio ...

随机推荐

  1. 解密Spring中的Bean实例化:推断构造方法(上)

    在Spring中,一个bean需要通过实例化来获取一个对象,而实例化的过程涉及到构造方法的调用.本文将主要探讨简单的构造推断和实例化过程,让我们首先深入了解实例化的步骤. 实例化源码 protecte ...

  2. Java 接口:比较对象的大小

    1 package com.bytezreo.interfacetest; 2 3 /** 4 * 5 * @Description 接口:比较对象的大小 6 * @author Bytezero·z ...

  3. vue3使用路由keep-alive和监听路由实现transition

    随着vue3.0的发布,vue-router发布了4.0版本,文档 很明了,提供了vue2路由到vue3的变化和写法指导. vue2: // transition <transition nam ...

  4. Learning by teaching --- 费曼学习法

    世界上存在成千上万种学习法,如果上天只让我掌握一种,那一定就是"费曼学习法". 介绍 费曼学习法是由诺贝尔物理学奖获得者理查德·费曼提出的一种学习方法,其核心思想是将所学内容用自己 ...

  5. MVC阶段所有框架完整组合示例

    思路:创建工程,导包.编辑配置文件包括 核心spring配置   SpringConfig myBatis 配置文件  mybatisConfig  JdbcConfig  jdbc.properti ...

  6. Alt+Space 快速打开切换程序 - Everything - AutoHotKey

    Alt+Space 快速打开切换程序 - Everything - AutoHotKey 需求 电脑切换任务 需要用鼠标找,效率比较低,用快捷键Alt+Space 打开列表,输入指定关键字回车,切换或 ...

  7. iVCam 可以当电脑的摄像头 同一个wifi

    iVCam 可以当电脑的摄像头 同一个wifi

  8. favorite 单词学习 主要是发音 fa - vor - it 注意 ri不连读 是自然带出来的r的尾音

    favorite 单词学习 主要注意发音 [ ˈfeɪ v(ə)r ɪt ] 主要是发音 fa - vor - it 注意 ri不连读 是自然带出来的r的尾音 favor : 来自拉丁语favere, ...

  9. 灰度发布、蓝绿部署、金丝雀发布和AB测试及在k8s中的实现

    灰度发布.蓝绿部署.金丝雀发布和AB测试都是软件开发和部署中常用的策略,每种策略都有其特定的用途和优势.下面是对这些策略的简要解释: 灰度发布(Grayscale Release): 灰度发布是一种逐 ...

  10. manjaro安装微信deepin-wine-wechat后启动不了

    直接将主目录下载的 .deepinwine 删除! 随后,点击图标,重新安装!