Android基础——View和ViewGroup

View和ViewGroup

什么是View?

View是最基本的控件,在屏幕上显示为一块矩形区域。所有的控件直接或间接的继承View。View常用于在轮播图程序中显示当前的轮播状态。

什么是ViewGroup?

ViewGroup是可以放置子View和子ViewGroup的容器,通过一定的规律调整内部控件的位置。View和ViewGroup通过嵌套完成对复杂界面的绘制。

继承层次图

Android基础——View和ViewGroup
Android基础——View和ViewGroup

基本属性

属性 对应函数 备注
<?xml version="1.0" encoding="utf-8"?> xml版本和编码格式
xmlns:android http://schemas.android.com/apk/res/android XML namespace,避免元素命名冲突
android:id @+id/string 1.@+id/string表示定义一个名为string的id
2. @id/string表示引用名为string的id
android:layout_width 1. match_parent
2.wrap_content
3.自定义
1.match_parent表示与父元素一样宽
2.wrap_content表示宽度刚好包裹内容
3.单位dp
android:layout_height 1. match_parent
2.wrap_content
3.自定义
同上
android:gravity top、bottom、left、right、center
center_vertical、center_horizontal等
指定文字在控件中的对齐方式
android:layout_gravity 同上 指定控件在布局中的对齐方式
android:visibility gone、visible、invisible View.setVisibility() visible可见
invisible不可见但占据原来位置和大小
gone不可见且不占用屏幕
android:background #00000000-#ffffffff或图片填充 View.setBackground()
android:layout_margin 自定义 指定控件在上下左右方向上偏移的距离,也可单独指定

常用ViewGroup介绍

线性布局

LinearLayout会将所包含的控件在线性方向上依次排列。

属性 对应函数 备注
android:orientation vertical、horizontal 默认horizontal
android:layout_weight 自定义 按比例指定控件大小,使用时将宽度或高度置0

Tips:

  1. 当排列方向为horizontal时,内部控件就不能将宽度指定为match_parent,否则第一个控件就会将水平方向占满,导致其他控件没有可放置位置。
  2. 同理,当排列方向为vertical时,内部控件就不能将高度指定为match_parent

相对布局

RelativeLayout通过相对定位的方式放置控件,其属性大多看名知意,不介绍。

帧布局

FrameLayout中所有的控件都会默认摆放在布局的左上角,后面的控件有可能会覆盖前面的控件。

常用View介绍

TextView

TextView继承View,用于在界面显示一段文本信息,其属性主要是对文本样式的操作。

属性 对应函数 备注
android:text 自定义 getText()、setText() 通过alt+enter将值抽出到string.xml中
android:textSize 自定义 单位sp
android:textColor #00000000-#ffffffff RGBA

其中文本获取和修改:

TextView tv = findViewById(R.id.tv);
Log.d("MainActivity", tv.getText().toString());
tv.setText("java");

Button

Button继承TextView,用于用户的点击,故TextView的属性都可用于Button

属性 对应函数 备注
android:textAllCaps true、false 默认true,对所有英文字母自动进行大写转换

Button点击事件实现

匿名内部类

Button button=findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

      }
});

通过Activity继承View.OnClickListener

Button button=findViewById(R.id.btn);
button.setOnClickListener(this);

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn:
                break;
            default:
                break;
        }
    }

EditText

EditText继承TextView,用于输入和编辑文本,其属性主要是对文本内容的控制。

属性 对应函数 备注
android:hint 自定义 提示文本
android:maxLines 自定义 限制文本最大行数,当超过最大行数时,文本就会向上滚动

ImageView

ImageView继承View,用于在界面显示图片,其属性主要是对图片的控制。

属性 对应函数 备注
android:src @mipmap/xxx
@drawable/xxx
setImageResource() 图片放在mipmap或drawable

其中图片的替换:

ImageView iv=findViewById(R.id.iv);
iv.setImageResource(R.drawable.pic2);

其他常用控件

Menu

在res中新建menu文件夹,创建menu.xml,其中item标签对应具体菜单项,代码如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item1"
        android:title="item1"/>
    <item
        android:id="@+id/item2"
        android:title="item2"/>
</menu>

在Activity中重写onCreateOptionsMenu和onOptionsItemSelected方法。

onCreateOptionsMenu用于加载菜单项,通过getMenuInflater()获取MenuInflater再调用inflate方法,第一个参数为待创建的菜单项,第二个参数指定创建后的菜单项将添加到哪个Menu对象中。最后返回ture显示创建后的菜单,false不显示,具体如下:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

onOptionsItemSelected对应菜单中的点击事件,通过item.getItemId()判断点击的是哪一个菜单项,具体如下:

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.item1:
                break;
            case R.id.item2:
                break;
            default:
        }
        return true;
    }

运行效果如下:
Android基础——View和ViewGroup

点击后展开菜单项:
Android基础——View和ViewGroup

ProgressBar

ProgressBar继承View,用于显示进度条,其主要属性是对进度条的控制。

属性 对应函数 备注
style ?android:attr/progressBarStyleHorizontal 修改为水平进度条
android:max 自定义
android:progress 自定义 setProgress() 当前进度

AlertDialog

AlertDialog继承Dialog,在当前界面弹出一个对话框,该对话框可置顶于所有界面元素之上,用于提示和警告。创建AlertDialog设置相关属性和点击事件:

AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);
        dialog.setTitle("AlertDialog");
        dialog.setMessage("Message");
        dialog.setCancelable(false);
        dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
上一篇:AndroidQ SystemUI之锁屏加载(上)滑动锁屏


下一篇:【调试】记录如何debug系统调用栈