Android常见界面控件

TextView

TextView控件用于显示文本信息。

常用属性

布局属性 功能描述
android:layout_width 设置TextView控件的宽度
android:layout_height 设置TextView控件的高度
android:id 设置TextView控件的唯一标识
android:background 设置TextView控件的背景
android:layout_margin 设置当前控件与屏幕边界或周围控件、布局的距离
android:padding 设置TextView控件与该控件中内容的距离
android:text 设置文本内容
android:textColor 设置文字显示的颜色
android:textSize 设置文字大小,推荐单位为sp
android:gravity 设置文本内容的位置
android:maxLength 设置文本最大长度,超出此长度的文本不显示
android:lines 设置文本的行数,超出此行数的文本不显示
android:maxLines 设置文本的最大行数,超出此行数的文本不显示。
android:ellipsize 设置当文本超出TextView规定的范围的显示方式。
android:drawableTop 在文本的顶部显示图像
android:lineSpacingExtra 设置文本的行间距
android:textStyle 设置文本样式,如bold(粗体),italic(斜体),normal(正常)
  • :可以通过加\n进行换行
    例:android:text="学校:山东理工大学\n联系电话:123455"会显示两行

Button

Button控件表示按钮,它继承自TextView控件,既可以显示文本,又可以显示图片;
同时也允许用户通过点击来执行操作,当Button控件被点击时,被按下与弹起的背景会有一个动态的切换效果,这个效果就是点击效果 。

点击事件实现方式

方法1:直接通过属性指定(现在一般不用)
在布局文件中指定Button控件的onClick属性方式

  1. 在layout文件中指定onClick属性 android:onClick="click"

  2. 在Activity中实现这个click方法

    public void click(View v){
        Log.i("指定onClick属性方式", "button  is clicked");
    }

方法2. 匿名内部类方式
在Activity中添加匿名内部类

     btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("匿名内部类方式", "button  is clicked");
        }
     });

方法3:接口方式

  1. 设置Button控件的点击监听事件
btn.setOnClickListener(this);//this代表onClickListener的引用
  1. 接着当前Activity实现OnClickListener接口
    public class MainActivity extends AppCompatActivity implements View.onClickListener

  1. 然后实现OnClickListener接口中的方法
    @Override
    public void onClick(View v) {
        Log.i("接口方式", "button  is clicked");
    }

实用属性

去除阴影和点击效果:android:stateListAnimator="@null"
只去除阴影:style="?android:attr/borderlessButtonStyle"

图片 圆角实现

参考1
参考2

styles.xml

Android Studio的styles.xml文件位于“res/values”文件夹中,主要用来设置应用程序的全局样式或者控件样式的。
文件结构如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--ShapeableImageView 圆角-->
    <style name="RoundedStyle">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">30dp</item>
    </style>

    <!--ShapeableImageView 圆 -->
    <style name="CircleStyle">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">50%</item>
    </style>
</resources>

scaleType属性

scaleType属性指定了ImageView如何显示图片。包括是否进行缩放、等比缩放、缩放后展示位置等。
Android 提供了八种scaleType的属性值,每种都对应了一种展示方式,常用的几种如下:

  • fitCenter :等比例缩放。缺省值
    图片宽高比和控件宽高比一致,则填满控件显示,居中显示,即缩放后的图片的中点和控件中点重叠。
    图片宽高比和控件宽高比不一致,则等比缩放图片最长边,直到和控件宽或高一边重叠,这种情况左右或者上下可能会空白

  • fitXY 拉伸图片至完全填充控件。

  • center 控件中心和原始图片中心重叠,图片不进行缩放,只显示控件区域的内容。
    如果原始图片宽高都小于控件宽高,则看起来的效果和居中显示一样。

  • centerCrop 等比例缩放到控件中心和原始图片中心重叠且图片填满控件。

圆角裁切

解决了基本问题,开始对图片进行裁切(以圆形为例):
效果:
image

xml文件

<com.google.android.material.imageview.ShapeableImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:src="@mipmap/ic_avatar"
    app:shapeAppearance="@style/CircleStyle" />

styles文件

  • cornerFamily 角的处理方式,rounded圆角,cut裁剪
  • cornerSize 圆角大小
    可以用百分比,也可以自己计算,比如宽高100dp,圆角50dp
<!--ShapeableImageView 圆 -->
<style name="CircleStyle">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">50%</item>
</style>

描边

效果:
image

xml文件

  • app:strokeColor 描边颜色
  • app:strokeWidth 描边宽度
  • 注意:padding的数值是描边宽度的一半
<com.google.android.material.imageview.ShapeableImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp" 
    android:padding="2dp"
    android:src="@mipmap/ic_avatar"
    app:shapeAppearance="@style/CircleStyle"
    app:strokeColor="@color/red"
    app:strokeWidth="4dp" />

EditText

EditText表示编辑框,它是TextView的子类,用户可在此控件中输入信息。

属性名称 功能描述
android:hint 控件中内容为空时显示的提示文本信息
android:textColorHint 控件中内容为空时显示的提示文本信息的颜色
android:password 输入文本框中的内容显示为“.”
android:phoneNumber 设置输入文本框中的内容只能是数字
android:minLines 设置文本的最小行数
android:scrollHorizontally 设置文本信息超出EditText的宽度情况下,是否出现横拉条
android:editable 设置是否可编辑
android:digits 限制用户输入的内容,用户只能输入规定的字符,其余字符无法输入
android:inputType 规定用户输入的内容类型如:phone,textPassword等等

image

处理TextChanged事件

应用场景:用户输入验证码 达到规定输入长度,自动点击确认
当EditText视图中的文本内容发生改变时,将触发TextChanged(文本变化)事件,处理EditText视图上的TextChanged事件的步骤如下:

  1. 确定EditText视图。
    首先给出需要处理TextChanged事件的EditText视图,例如:
    EditText tEdit = (EditText)findViewById(R.id.my_edit);

  2. 确定监视器。
    需要使用实现TextWatcher接口(在android.text包中)的类的对象作监视器,EditText视图通过如下方法注册监视器:
    public void addTextChangedListener(TextWatcher watcher)

  3. 监视器重写TextWatcher接口的afterTextChanged,beforeTextChanged和onTextChanged。
    当EditText视图中的文本内容发生改变时,监视器就会调用重写的这3个方法。

ImageView

ImageView表示图片,它继承自View,可以加载各种图片资源。

属性名称 功能描述
android:layout_width 设置ImageView控件的宽度
android:layout_height 设置ImageView控件的高度
android:id 设置ImageView控件的唯一标识
android:background 设置ImageView控件的背景
android:layout_margin 设置当前控件与屏幕边界或周围控件的距离
android:src 设置ImageView控件需要显示的图片资源
android:scaleType 将图片资源缩放或移动,以适应ImageView控件的宽高
android:tint 将图片渲染成指定的颜色
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bg" />   设置背景图片

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/icon"/>  设置前景图片

image

ToggleButton视图

ToggleButton视图的继承关系如下:

android.widget.Button
        android.widget.CompoundButton
          android.widget.ToggleButton

和普通的Button视图相比较,ToggleButton外观可以提供两种状态,一种是选中(checked)状态,另一种是未选中状态(unchecked),用户点击ToggleButton视图可以切换它的状态。
image

  • android:disabledAlpha:设置按钮在未选中状态(unchecked)时的alpha值。属性取值0-1之间的小数,取值0按钮完全透明,取值1,按钮完全不透明。

  • android:textOff:设置未选中状态(unchecked)时的文本。取值是字符串。

  • android:textOn:设置选中状态(checked)时的文本。取值是字符串。

确定监视器。

  1. 需要使用实现CompoundButton.OnCheckedChangeListener接口的类的对象作为ToggleButton视图的监视器,ToggleButton视图通过如下方法注册监视器:
public void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener)
  1. 重写CompoundButton.OnCheckedChangeListener接口中的方法。
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // 选中状态时需要执行的代码
        } else {
            //未选中状态时需要执行的代码
        }
    }
});

RadioButton

RadioButton单选按钮,android:checked属性指定是否选中的状态。

RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。

image

语法格式

<RadioGroup
    android:属性名称 ="属性值"
                   ......>
	<RadioButton
	        android:属性名称 ="属性值"
                          ....../>
	......
<RadioGroup/>

CheckBox

CheckBox表示复选框,它是Button的子类,用于实现多选功能,通过android:checked属性指定CheckBox控件是否选中的状态。

布局代码

<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="羽毛球"
        android:textSize="18sp"/>
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="篮球"
        android:textSize="18sp"/>
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="乒乓球"
        android:textSize="18sp"/>


处理CheckBox视图上的click事件

box.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 // Perform action on click
             }
         });

其他常用控件

DatePicker与TimePicker

日期选择事件的接口
DatePicker.OnDateChangedListenerTimePicker.OnTimeChangedListener

可以使用public void init (int year, int monthOfYear, int dayOfMonth,
DatePicker.OnDateChangedListener onDateChangedListener)方法为DatePicker视图注册监视器。
DatePicker.OnDateChangedListener接口中的方法是public void onDateChanged (DatePicker view, int year, int month, int day)

时间选择事件的接口
public void setOnTimeChangedListener (TimePicker.OnTimeChangedListener onTimeChangedListener),方法为TimePicker视图注册监视器。
TimePicker.OnTimeChangedListener接口中的方法是:
public void onTimeChanged (TimePicker view, int hour, int minute)

Chronometer

每隔一秒钟“计时”一次,如果程序需要周期地进行某个操作,就可以考虑使用Chronometer视图。

Chronometer视图上可以触发所谓的Tick(嘀嗒)事件,即每个一秒发生一次Tick(嘀嗒)事件

事件的接口是Chronometer.OnChronometerTickListener接口,该接口中的方法public void onChronometerTick (Chronometer chronometer)

  • public void start ()方法开始“计时”,调用public void stop ()方法停止“计时”。

ProgressBar进度条

android:max:该属性值确定进度条的最大值,取值正整数。对于水平进度条,其意义是将ProgressBar视图的水平空间平分为max份。

android:progress:属性值确定进度条的进度值,取值范围是0与进度条的最大值之间的整数。

系统为ProgressBar视图提供了如下样式

  • Widget.ProgressBar.Horizontal :水平样式。
  • Widget.ProgressBar.Small :小圆形样式。
  • Widget.ProgressBar.Large:大圆形样式。
  • Widget.ProgressBar.Inverse:反色样式(如果视图背景是浅颜色,最好使用该样式)。
  • Widget.ProgressBar.Small.Inverse:反色小圆形样式。
  • Widget.ProgressBar.Large.Inverse:反色大圆形样式。

如果希望使用水平的ProgressBar视图,可以在视图的XML中包含如下设置 style="@android:style/Widget.ProgressBar.Horizontal"
例如:

<ProgressBar
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     style="@android:style/Widget.ProgressBar.Horizontal" />

WebView

为了使得程序中的WebView视图能访问Web页,必须修改项目的配置文件AndroidManifest.xml(在工程的根目录下),在AndroidManifest.xml加入如下内容:
<uses-permission android:name="android.permission.INTERNET" />
例如:

<manifest ... >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

WebView视图使用public void loadUrl (String url)方法加载参数指定的Web页,
例如,假设视图中WebView视图的id是webview,那么下列代码示意加载新浪网的Web页:

    WebView myWebView = (WebView)findViewById(R.id.webview);
    myWebView .loadUrl("http://www.sina.com");

当WebView视图显示某个Web页之后,如果用户点击Web页中的超链接,将会导致打开系统的内置浏览器,并用内置浏览器访问超链接给出的Web页。

  • 如果不想用内置浏览器去访问超链接给出的Web页,而是继续使用WebView视图显示超链接给出的Web页,那么让WebView视图事先调用void setWebViewClient(WebViewClient client)方法,并将WebViewClient类的实例传递给该方法的参数client,例如可以执行如下的代码:
        myWebView.setWebViewClient(new WebViewClient());

WebView视图默认不支持Web页中的JavaScript脚本,如果准备让WebView视图支持JavaScript脚本,

//首先要获得WebView视图的WebSettings对象:
     WebSettings webSettings = myWebView.getSettings();
//然后WebSettings对象开启对JavaScript脚本的支持:
     webSettings.setJavaScriptEnabled(true);

Toast

Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,它显示在应用程序界面的最上层,显示一段时间后自动消失不会打断当前操作,也不获得焦点。
image

Toast.makeText(MainActivity.this,"WIFI已断开",Toast.LENGTH_SHORT).show();
/*
MainActivity.this    当前组件的上下文环境
"WIFI已断开"         提示的字符串信息
Toast.LENGTH_SHORT   显示信息的时长
.show();             显示信息
*/

ListView的使用

Spinner视图

Spinner视图就是下拉列表,其特点是为用户提供多项选择。

Spinner视图中最重要的属性就是android:entries

  • 在设置该属性值之前,必须首先在值资源中给出下拉列表的选项,即需要在值资源中编写一个值资源类型的XML文件。
    该文件必须包含有名字是array的标记,array的item子标记中的文本内容用于指定下拉列表的选项,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="font_list">
        <item>宋体</item>
        <item>楷体</item>
        <item>黑体</item>
   </array>
</resources>

该XML文件的名字建议是array.xml。然后,指定android:entries属性的值是值资源某个array标记, 例如android:entries = "@array/font_lis"

常用属性
image

Spinner动态赋值

动态创建Spinner视图的关键是需要一个实现Adapter接口的类的实例,习惯将这样的类称作一个适配器,适配器的作用是将某些数据转换为Spinner视图中的选项。

//获得一个Spinner视图,
Spinner list = findByViewId(R.id.my_list);

//然后Spinner视图调用
void setAdapter(SpinnerAdapter adapter)方法

ArrayAdapter adapter=new ArrayAdapter(this , layoutID , array);

数据适配器(Adapter)

ArrayAdapter也是BaseAdapter的子类,用法与SimpleAdapter类似,开发者只需要在构造方法里面传入相应参数即可。ArrayAdapter通常用于适配TextView控件。
的构造方法如下:

image

处理Spinner选择事件

需要使用实现AdapterView.OnItemSelectedListener接口

重写接口中的onItemSelected和onNothingSelected方法。

例如:

public void onItemSelected(AdapterView parent, View view, int pos, long id) {
        //参数parent存放着当前Spinner视图的引用,参数pos的值是被选中的选项的索引值(从0开始) 
       Object item= parent.getItemAtPosition(pos);//返回选中的选项
 }
 public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
 }

选择事件带来的问题

Spinner视图的首项(索引值是0的项)默认处于选中状态,因此如果程序代码部分处理了选择事件,那么程序就会立刻执行onItemSelected方法。如果希望用户选择某项后再进行有关操作,代码部分可以不处理选择事件,而是处理一个按钮的onClick事件。当处理onClick事件时,再根据Spinner视图的中的选项情况进行相关的操作 。

ListView

ListView以列表的形式展示数据内容,并且能够根据列表的高度自适应屏幕显示。

属性名称 功能描述
android:listSelector 当条目被点击后,改变条目的背景颜色
android:divider 设置分割线的颜色
android:dividerHeight 设置分割线的高度
android:scrollbars 是否显示滚动条
android:fadingEdge 去掉上边和下边的黑色阴影

Adapter

数据适配器是数据与视图之间的桥梁,它类似于一个转换器,将复杂的数据转换成用户可以接受的方式进行呈现。
常用的数据适配器
BaseAdapter
SimpleAdapter
ArrayAdapter

BaseAdapter

顾名思义BaseAdapter是基本的适配器。他实际上是一个抽象类,通常在自定义适配器时会继承BaseAdapter。
BaseAdapter中的方法

方法名称 功能描述
public int getCount() 获取Item条目的总数
public Object getItem(int position) 根据position(位置)获取某个Item的对象
public long getItemId(int position) 根据position(位置)获取某个Item的id
public View getView(int position, View convertView, ViewGroup parent) 获取相应position对应的Item视图,position是当前Item的位置,convertView用于复用旧视图,parent用于加载XML布局。

SimpleAdapter

SimpleAdapter extends BaseAdapter,实现了BaseAdapter的四个抽象方法并进行封装。因此在使用SimpleAdapter进行数据适配时,只需要在构造方法中传入相应的参数即可。SimpleAdapter的构造方法的具体信息如下:

public SimpleAdapter(
Context context,//上下文对象,一般就是本页面this
List<? extends Map<String, ?>> data, //数据集合
int resource,//Item布局的资源id
String[] from,//Map集合中的key值
int[] to//Item布局中对应的控件
)

优化加载数据

使用ViewHolder类

在加载Item布局时,会使用findViewById()方法找到Item布局中的各个控件,在每一次加载新的Item数据时都会进行控件寻找,这样也会产生耗时操作。
为了优化ListView减少耗时操作,可以将要加载的子View放在ViewHolder类中,当第一次创建convertView时将这些控件找出,在第二次重用convertView时就可直接通过convertView中的getTag()方法获得这些控件。

复用convertView

为了防止数据量过大造成内存溢出,在使用ListView时通常会进行优化,其中一种是复用convertView。

image
image

对话框AltertDialog

RecyclerView

RecyclerView:是Android5.0之后提供的用于在有限的窗口范围内显示大量数据的控件

与ListView相比,RecyclerView的优势为

  • 展示效果:RecyclerView控件可以通过LayoutManager类实现横向或竖向的列表效果、瀑布流效果和GridView效果,而ListView控件只能实现竖直的列表效果。

  • 适配器:RecyclerView控件使用的是RecyclerView.Adapter适配器,该适配器将BaseAdapter中的getView()方法拆分为onCreateViewHolder()方法和onBindViewHolder()方法,强制使用ViewHolder类,使代码编写规范化

  • 复用效果:RecyclerView控件复用Item对象的工作由该控件自己实现,而ListView控件复用Item对象的工作需要开发者通过convertView的setTag()方法和getTag()方法进行操作。

  • 动画效果:RecyclerView控件可以通过setItemAnimator()方法为Item添加动画效果,而ListView控件不可以通过该方法为Item添加动画效果。

实现步骤

一、在app/build.gradle中添加RecyclerView 依赖库

implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha01‘

二、定义Layout中视图对象

     <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

三、自定义Adapter

class MyRecyclerAdapter extends RecyclerView.Adapter<VH>

四、定义LayoutManager

  1. LinearLayoutManager:横向、纵向的列表
  2. GridLayoutManager:像GridView一样的网格布局
  3. StaggeredGridLayoutManager:瀑布流的效果

五、设置RecyclerView 的Adapter
recyclerView.setAdapter(adapter)

自定义View

当使用系统控件不满足需求时,需要自定义控件。
最简单的自定义View就是创建一个类继承自View类或者其子类,并重写该类的构造方法。

posted @ 2023-03-24 16:24  kingwzun  阅读(223)  评论(0编辑  收藏  举报