Android UI控件

目录

一、View控件:

1.概述:

  • View是构建用户界面控件(Button,Textfields等等)的父类,所有的用户界面可见控件以及布局类都是由View派生来的。
  • 一个View占用了屏幕上的一个矩形区域并且负责界面绘制和事件处理,能够实现所占据区域的界面绘制、焦点变化和界面事件处理等功能。
  • 绝大部份UI控件放在android.widget包及其子jar包,android.view包及其子jar包中。

2.View类常用属性及方法:

  • 我们可以在java类中通过方法创建控件并给控件设置属性,也可以通过在xml文件中添加标签的方式创建控件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二、TextView控件:

  • 文本类控件,用来显示文本

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv_one"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="文本:123456789101112131415"
        android:textColor="#FFFF0000"
        android:textStyle="bold"
        android:textSize="50sp"
        android:background="#FF00FFFF"
        android:gravity="center"
        android:shadowColor="@color/purple_700"
        android:shadowRadius="3.0"
        android:shadowDx="20.0"
        android:shadowDy="20.0"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:clickable="true"/>
    <!--
        1.id:设置该TestView的id,方便java代码通过findViewById(R.id.tv_one)获取该组件。
        2.layout_width:设置组件宽度
            match_parent:宽度设置为父容器宽度,即LinearLayout的宽度。
            wrap_content:根据该控件里面的内容自动分配宽度。
            200dp:手动设置组件宽度,单位为dp。
        3.layout_height:设置组件高度
        4.text:设置组件显示的文本内容
        5.textColor:设置文本颜色
        6.textStyle:设置文本样式
            bold:加粗
            italic:斜体
            normal:常规
        7.textSize:设置文本大小,单位为sp
        8.background:设置控件背景(图片为背景或背景色)
        9.gravity:设置控件中内容的对齐方式
        10.padding:控件显示的文字内容与控件边界的距离。
		11.layout_margin:本控件与其它相邻控件及父控件上下左右的距离。
		12.drawableRight:文本框右边绘制图片。
		13.autoLink设置是否当文本超链接:none/web/email/phone/map/all
        14.设置文字阴影:
            (1)shadowColor:设置阴影文字的颜色
            (2)shadowRadius:设置阴影透明度
            (3)shadowDx:设置阴影与原文字的x轴偏移量
            (4)shadowDy:设置阴影与原文字的y轴偏移量
        15.设置文字跑马灯效果:
            (1)singleLine:设置内容单行显示
            (2)ellipsize:设置文本省略
                start:文本过长时省略前面的文字
                end:文本过长时省略后面的文字
                marquee:实现文字跑马灯效果
            (3)marqueeRepeatLimit:"marquee_forever"重复滚动无限次
            (4)focusable:是否可以获取焦点
            (5)focusableInTouchMode:触摸模式下是否可以获取焦点
            (6)clickable:鼠标点击实现跑马灯
        16.letterSpacing:字符间距,最大值为1    
    -->
</LinearLayout>

2.创建自定义TextView控件:

第一步:创建MyTextView.java文件:

  • 必须继承TextView父类。
  • 必须重写父类的构造方法。
package com.example.t.androidproject.myapplication2;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
import androidx.annotation.Nullable;
import android.annotation.SuppressLint;

@SuppressLint("AppCompatCustomView")
public class MyTestView extends TextView {
    public MyTestView(Context context) {
        super(context);
    }

    public MyTestView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyTestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    //我们可以重写类中的方法变成我们需要的方法,这里是设置控件默认聚焦为true
    @Override
    public boolean isFocused() {
        return true;
    }
}

第二步:在XML文件中使用MyTextView:

  • 使用方法同默认的TextView控件。
<com.example.t.androidproject.myapplication2.MyTestView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"/>

三、EditText控件:

  • EditText是用来输入和编辑字符串的控件

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <EditText
            android:layout_height="100dp"
            android:layout_width="200dp"
            android:hint="请输入用户名"
            android:textColorHint="@color/blue"
            android:inputType="phone"
            android:drawableLeft="@drawable/ic_baseline_how_to_reg_24"
            android:drawablePadding="20dp"
            android:paddingLeft="20dp"
            android:background="@color/white"/>
    <!--
    1.EditText继承了TextView,所以EditText标签可以使用TextView的全部属性
    2.hint:输入框提示文字
    3.textColorHint:提示文字的颜色
    4.inputType:输入类型(手机号,密码,邮箱...)
    5.drawableXXX:输入框指定位置添加图片
    6.drawablePadding:图片与输入内容的间距
    7.background:@null:可以去除输入框的下划线及边框,也可以设置边框
    8.maxLength:限制输入字符数量
    9.singleLine:设置文本行数
    10.maxLines:设置最大的显示行数
	11.minLines:设置最小的显示行数
	
    -->
    </LinearLayout>

2.事件监听:

第一步:创建监听类,实现接口TextWatcher,并实现接口中的三个方法。

public void afterTextChanged(Editable s) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after){}

第二步:为控件绑定监听。

//该方法位于监听类内的方法。
public void addTextChangedListener(TextWatcher watcher)

四、Button控件:

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:text="按钮"
            android:backgroundTint="@drawable/color_select"
            android:background="@drawable/button_select"
            android:textSize="50sp"
            android:layout_height="100dp"
            android:layout_width="200dp"/>
    <!--
    1.Button按钮继承了TextView,所以Button标签可以使用TextView的全部属性
    
    2.设置按钮按下、松开时背景颜色切换:
    backgroundTint:设置背景颜色,通过绑定drawable/color_select.xml文件进行颜色切换
    
    3.设置按钮按下、松开时背景图片切换:
    background:设置背景颜色,通过绑定drawable/button_select.xml文件进行颜色切换
    -->
    </LinearLayout>

2.selector选择器:

  • 创建在drawable文件夹下。
    button_select.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_baseline_add_circle_24" android:state_pressed="true"/>
    <item android:drawable="@drawable/ic_baseline_add_circle_outline_24"/>
</selector>
<!--selector选择器:
    drawable:设置背景图片,背景图片必须用drawable属性
    state_pressed:设置按钮按下时的背景图片
-->

color_select.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/gray" android:state_pressed="true"/>
    <item android:color="@color/blue"/>
</selector>
<!--selector选择器:
    color:设置颜色,背景颜色必须用color属性
    state_pressed:设置按钮按下时的背景颜色
-->

3.事件监听:

方法一:纯java代码创建事件监听:

第一步:java中创建事件监听器:
package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;

public class LoginActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        //根据button标签的id获取button
        Button btn = findViewById(R.id.mybtn1);

        //btn按钮绑定监听,设置按钮点击事件
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //按钮点击时修改按钮文本内容
                btn.setText("按钮点击");
            }
        });

        //btn按钮绑定监听,设置按钮长按事件
        btn.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //按钮长按时修改按钮文本内容
                btn.setText("按钮长按");
                //注意如果这里的返回值如果是true,则按钮按钮点击事件不会执行
                //如果这里的返回值如果是false,则按钮按钮点击事件会执行
                return false;
            }
        });

        //btn按钮绑定监听,设置按钮触摸事件
        btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //按钮触摸时修改按钮文本内容
                btn.setText("按钮触摸");
                //注意如果这里的返回值如果是true,则按钮长按、按钮点击事件都不会执行
                //如果这里的返回值如果是false,则按钮长按、按钮点击事件都会执行
                return false;
            }
        });
        //三个事件执行顺序:
            //onTouch事件--->onLongClick--->onClick,返回值都为false时依次执行,如果某个事件返回值为true,则其后面的事件将不会执行
    }
}

方法二:xml属性+java代码绑定监听:

第一步:xml属性绑定方法:
<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/mybtn1"
            android:text="按钮"
            android:textSize="50sp"
            android:layout_height="100dp"
            android:layout_width="200dp"
            android:onClick="myclick"/>
    <!--
    onclick:设置点击按钮的事件监听,myclick是我们在java中自己写的方法
    -->
    </LinearLayout>


第二步:java中创建myclick方法:
package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;

public class LoginActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
    }
    //我们自己写的方法
    public void myclick(View view) {
        //根据button标签的id获取button
        Button btn = findViewById(R.id.mybtn1);
        //按钮触摸时修改按钮文本内容
        btn.setText("按钮触摸");
    }
}

五、ImageView控件:

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/image1"
            android:scaleType="fitXY"
            android:maxHeight="200dp"
            android:maxWidth="200dp"
            android:adjustViewBounds="true"/>
    <!--
    1.src设置图片路径
    2.scaleType:设置图片缩放
        fitCenter:默认,等比缩放图片后放于控件中间
        fitStart:等比缩放图片后放于控件左上角
        fitEnd:等比缩放图片后放于控件右下角
        fitXY:非等比拉伸图片占满ImageView
        centerCrop:等比拉伸图片占满ImageView,多余的部分裁剪
        center:保持原图大小,显示在控件中心,若图片过大,则进行裁剪
        centerInside:等比缩放图片至控件完全显示图片
        matrix:保持原图大小,截取图片左上角部分至铺满控件
    3.等比缩放图片铺满控件:
    maxHeight:最大高度
    maxWidth:最大宽度
    adjustViewBounds:允许自动调整图片大小,宽高哪个边先达到设定的max值,另一条边进行等比缩放
    需要设置layout_width和layout_height = wrap_content
    -->
    </LinearLayout>

六、ProgressBar控件:

  • 进度条控件。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ProgressBar
            android:id="@+id/pb1"
            android:layout_width="300dp"
            android:layout_height="100dp"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:max="100"/>
    <!--
    1.style="@style/Widget.AppCompat.ProgressBar.Horizontal":设置水平进度条,默认不写是圆形进度条
    2.max:进度条最大值
    3.progress:进度条已完成进度值
   	4.indeterminate:是否显示进度
   	5.visibility:设置进度条的可见性
   		View.VISIBLE:设置进度条可见
		View.INVISIBLE:不可见,但这个View仍然会占用在xml文件中所分配的布局空间,不重新layout 
		View.GONE:设置进度条不可见,不占布局空间
    -->
    </LinearLayout>

2.java动态控制进度条进度:

    //我们自己写的方法,点击按钮(按钮调用了该方法),进度条进度+1
    public void myclick(View view) {
        //根据标签的id获取ProgressBar
        ProgressBar pb1 = findViewById(R.id.pb1);
        //获取进度条当前进度
        int progress = pb1.getProgress();
        progress = progress+1;
        //修改进度条进度
        pb1.setProgress(progress);
        /*其他方法:
        	  pb1.incrementProgressBy(int diff)指定增加的进度
			  pb1.setVisibility(int v)设置该进度条是否可视
			  pb1.setMax(int max)设置进度条的最大值
		*/	
    }

七、ImageButton控件:

  • 图片按钮控件。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageButton
            android:layout_width="300dp"
            android:layout_height="100dp"
            android:src="@drawable/image1"/>
    <!--
    1.src:设置按钮图片
    -->
    </LinearLayout>

八、Toast控件:

  • 提醒用户的快捷短消息的窗口。
  • 直接在Java中创建,不需要在布局文件中创建。

1.Toast使用方式:

第一步:创建Toast对象:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.Nullable;


public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Button btn = findViewById(R.id.btn1);

        /*方式一:
        static Toast makeText(Context context, CharSequence text, int duration)
            1.context是toast显示在哪个作用域,通常是当前Activity。
            2.text指显示的文本内容。
            3.duration指定显示时间,Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。
         */
        Toast toast1 = Toast.makeText(this, "提示信息", Toast.LENGTH_SHORT);
        /*方式二
        static Toast makeText(Context context, int resId, int duration)
            1.context是toast显示在哪个作用域,通常是当前Activity。
            2.resId指显示内容,使用string.xml中定义的显示的消息内容,通过R.java来引用。
            3.duration指定显示时间,Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。
         */
        Toast toast2 = Toast.makeText(this, R.string.app_name, Toast.LENGTH_SHORT);
    }
}

第二步:在需要的地方调用show方法进行消息提示:

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {//点击按钮会提示
                toast1.show();
            }
        });

2.设置Toast显示位置:

  • 不设置该方法默认显示在屏幕居中靠下位置。
        /*
        public void setGravity(int gravity, int xOffset, int yOffset)
            三个参数分别表示(起点位置,水平向右位移,垂直向下位移)
         */
        toast1.setGravity(Gravity.CENTER, 0, 0);//显示在屏幕正中间

九、AlertDialog控件:

  • 消息弹框。
  • 直接在Java中创建,不需要在布局文件中创建。

1.AlertDialog使用方式:

第一步:创建AlertDialog对象:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;


public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Button btn = findViewById(R.id.btn);
        //创建构建器对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //创建AlertDialog对话框,并设置属性
        AlertDialog alertDialog = builder.setIcon(R.mipmap.qq)//添加图标
                .setTitle("我是对话框")//添加标题
                .setMessage("对话框内容")//添加内容
                /*对话框上添加确定按钮
                setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
                    text:按钮文本
                    listener:事件监听器,内含点击按钮触发的事件

                 */
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                /*对话框上添加取消按钮
                setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
                    text:按钮文本
                    listener:事件监听器,内含点击按钮触发的事件
                */
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                /*对话框上添加忽略按钮
                setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
                    text:按钮文本
                    listener:事件监听器,内含点击按钮触发的事件
                */
                .setNeutralButton("忽略", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        
                    }
                })
                .create();//创建对话框,必须在链式调用的最后执行create方法创建对话框
    }
}

第二步:在需要的地方调用show方法显示对话框:

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {//点击按钮会显示对话框
                //显示对话框
                alertDialog.show();
            }
        });

2.设置AlertDialog布局:

		//获取布局文件
        View dialogView = getLayoutInflater().inflate(R.layout.avtivity_login, null);
        //调用构建器对象的setView方法添加布局文件
        builder.setView(dialogView);

十、CheckBox控件:

  • 复选框。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
       <CheckBox
           android:id="@+id/c2"
           android:layout_width="200dp"
           android:layout_height="100dp"
           android:text="复选框1"
           />
        <CheckBox
            android:id="@+id/c1"
            android:layout_width="200dp"
            android:layout_height="100dp"
            android:text="复选框2"
            android:checked="true"
            />
    </LinearLayout>
        <!--
        1.继承了TextView和Button,可以使用TextView和Button的所有属性
        2.checked:默认是否被选中
        -->

2.事件监听:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import androidx.annotation.Nullable;

public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        CheckBox c1 = findViewById(R.id.c1);
        CheckBox c2 = findViewById(R.id.c2);
        
        /*
        常用方法
        1.public boolean isChecked():确定复选框是否被选中。
		2.public void setChecked(boolean checked):设置默认选中
		3.public void toggle():切换复选框的选中和未选中状态
		*/

        c1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            /*
            第一个参数buttonView:状态发生改变的CompoundButton按钮
            第二个参数checked:表示当前点击的CheckBox是否为选中(Checked)状态。
            */
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked == true){//CheckBox被选中时执行dosome
                    //dosome
                }
            }
        });
        c2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked == true){
                    //dosome
                }
            }
        });
    }
}

十一、RadioGroup&RadioButton控件:

  • RadioGroup是单选框的容器,RadioButton是单个单选框

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
       <RadioGroup
           android:id="@+id/g1"
           android:layout_width="500dp"
           android:layout_height="500dp">
           <RadioButton
               android:id="@+id/b1"
               android:layout_width="100dp"
               android:layout_height="100dp"
               android:text="单选钮1"/>
           <RadioButton
               android:id="@+id/b2"
               android:layout_width="100dp"
               android:layout_height="100dp"
               android:text="单选钮2"
               android:checked="true"/>
        </RadioGroup>
    </LinearLayout>
        <!--RadioGroup
        1.继承了LinearLayout
        -->
        <!--RadioButton
        1.继承了TextView和Button,可以使用TextView和Button的所有属性
        2.checked:默认是否被选中
        -->

2.事件监听:

  • RadioGroup进行事件监听。
package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import androidx.annotation.Nullable;

public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        RadioGroup g1 = findViewById(R.id.g1);

        /*RadioButton常用方法
        public boolean isChecked():确定单选框是否被选中。
        public void setChecked(boolean checked):设置默认选中。
        public void toggle():切换单选框的选中和未选中状态。
         */

        //单选框组RadioGroup状态发生改变时的事件监听
        g1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            /*
            第一个参数:状态发生改变的RadioGroup
            第二个参数checkedId,表示当前被选中的RadioButton的ID。
             */
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                //获取被选中的RadioButton单选框
                RadioButton radioButton = findViewById(checkedId);
                //dosome
            }
        });
    }
}

十二、Spinner控件:

  • 下拉列表框。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
       <Spinner
           android:id="@+id/spin1"
           android:layout_width="200dp"
           android:layout_height="200dp"
           android:entries="@array/xiala"/>
    </LinearLayout>
        <!--Spinner
        entries:下拉列表内容,需要在values/strings.xml中创建array标签
        -->

2.事件监听:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import androidx.annotation.Nullable;

public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Spinner spinner1 = findViewById(R.id.spin1);

        //下拉列表选项被选中时执行的事件
        spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            /*选项被选中时触发的方法
            AdapterView:选项被选中的视图列表
            view:当前选中的item选项
            position:被选中的item选项在视图中的位置
            id:被选中item选项的id
             */
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //获取被选中的元素
                spinner1.getSelectedItem().toString();
            }
            //没有选项被选中时触发的方法
            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
    }
}

十三、ArrayAdapter适配器:

1.作用:

为Spinner控件设置列表项。

2.使用方式:

方式一:读取资源文件中定义的列表项。

第一步:在values文件夹中定义数据文件;
第二步:将该数据文件封装进ArrayAdapter类的对象中;
第三步:将Spinner绑定该Adapter对象。
package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.annotation.Nullable;

public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Spinner spinner1 = findViewById(R.id.spin1);
        //将配置文件中的数据封装进ArrayAdapter
        ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.xiala,android.R.layout.simple_spinner_item);
        // 将ArrayAdapter绑定Spinner
        spinner1.setAdapter(adapter);

    }
}

方式二:通过List集合或者数组设置列表项。

第一步:创建List集合对象,定义数据;
第二步:将该List对象封装进ArrayAdapter类的对象中;
第三步:将Spinner绑定该Adapter对象。
package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

public class LoginActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Spinner spinner1 = findViewById(R.id.spin1);
        List list = new ArrayList();
        list.add("选项1");
        list.add("选项2");
        //将list集合中的数据封装进ArrayAdapter(构造方法)
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,list);
        // 将ArrayAdapter绑定Spinner
        spinner1.setAdapter(adapter);

    }
}

十四、DatePicker控件:

  • 向用户提供包含年、月、日的日期数据并允许用户对其进行修改。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <DatePicker
        android:id="@+id/date1"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"/>
</LinearLayout>
    <!--DatePicker
    datePickerMode:日期控件外观,有两种:spinner,calendar
    calendarViewShown:是否显示calendar类型的外观,
        设置android:datePickerMode="spinner"时必须加该属性
    -->

2.事件监听:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.DatePicker;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        DatePicker data1 = findViewById(R.id.date1);
        
        /*其他常用方法:
        getDayOfMonth()获取日期天数
        getMonth()获取日期月份0-11
        getYear()获取年
        updateDate(year,month,day)更新日期
        init(year,month,day,dateChangedListener)初始化日期控件
         */

        data1.setOnDateChangedListener(new DatePicker.OnDateChangedListener() {
            //日期控件的日期改变时执行的事件
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            /*
            view 与监听器关联的视图。
            year 用户设置的年。
            monthOfYear 用户设置的月份(0-11),与Calendar兼容。
            dayOfMonth 用户设置的日期。
             */
            }
        });
    }
}

十五、TimePicker控件:

  • 向用户显示一天中的时间(可以为24小时制,也可以为AM/PM),并允许用户进行选择。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TimePicker
        android:id="@+id/time1"
        android:layout_width="300dp"
        android:layout_height="400dp"
        android:timePickerMode="spinner" />
</LinearLayout>
    <!--TimePicker
    timePickerMode:事件控件外观,有两种:spinner,clock
    -->

2.事件监听:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.TimePicker;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        TimePicker time1 = findViewById(R.id.time1);

        /*其他常用方法:
        getCurrentHour()获取当前小时
        getCurrentMinute()获取当前分钟
        setCurrentHour()修改当前小时事件
        setCurrentMinute()修改当前分钟时间
         */

        time1.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            //时间控件的时间改变时执行的事件
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            /*
            View:与监听相关的视图。
            hourOfDay:当前小时
            Minute:当前分钟
            */
            }
        });
    }
}

十六、ListView控件:

  • ListView是一个列表控件,它以列表的形式展示具体内容,既可以方便的显示从系统中其他应用读取出来的数据,也可独立的为各行元素设置监听器。
  • 每一行列表都是一个独立的元素。可以是一个字符串,也可以是一个组合控件。默认ListView中每个元素都是一个TextView。

1.常用属性:

<?xml version="1.0" encoding="utf-8"?>
<!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/xiala"/>
</LinearLayout>
    <!--ListView
    entries:设置列表内容
    divider:设置列表分隔条样式(引入图片样式)
    dividerHeight:设置列表分隔条高度
    -->

2.使用ArrayAdapter为ListView绑定数据源:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import java.util.ArrayList;
import java.util.List;

public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        //获取ListView
        ListView listview1 = findViewById(R.id.listview1);
        //获取数据
        List list  = new ArrayList();
        for (int i = 0; i < 20; i++) {
            list.add("列表行"+i);
        }
        //ArrayAdapter适配器对象
        /*
        第一个参数:上下文
        第二个参数:每行列表项(TextView)外观样式。Android为其提供如下属性样式,或者自己定义一个TextView的布局文件。
            simple_list_item_1:每个列表项都是一个普通的textView
            simple_list_item_2:每个列表项都是一个普通的textView(字体略大)
            simple_list_item_checked:每个列表项都是一个已勾选的列表项
            simple_list_item_multiple_choice:每个列表项都是带多选框的文本
            simple_list_item_single_choice:每个列表项都是带单选框的文本
        第三个参数:数据源(如:数组)
         */
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list);
        //ListView绑定适配器对象
        listview1.setAdapter(adapter);
    }
}

3. 使用SimpleAdapter为ListView绑定数据源:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        //获取ListView
        ListView listview1 = findViewById(R.id.listview1);
        //获取数据list(map())
        List list  = new ArrayList();
        for (int i = 0; i < 4; i++) {
            Map<String,String> map = new HashMap();
            map.put("11","文本"+i);
            map.put("22","按钮"+i);
            map.put("33","编辑"+i);
            list.add(map);
        }
        //SimpleAdapter适配器对象
        /*public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
            第一个参数:context,SimpleAdapter所要运行关联到的视图,一般指当前的Activity;
            第二个参数:是个List集合对象,该集合中每一个Map对象对应一个列表项;
            第三个参数:指定一个界面布局文件的id,即ListView里单个列表项的布局样式;
            第四个参数:是Map<key,?>中键key,即每一行key中put的内容;
            第五个参数:第3个参数布局文件里ListView单个列表项需要显示的所有控件的id,注意第四个和第五个参数要一一对应。
         */
        SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.dan, new String[]{"11","22","33"}, new int[]{R.id.view1, R.id.btn1, R.id.edit1});
        //ListView绑定适配器对象
        listview1.setAdapter(adapter);
    }
}

4.SimpleCursorAdapter为ListView绑定数据源:

常用于ListView对SQLite查询结果的渲染。

//查询数据
selectBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Cursor cursor = database.rawQuery("select stuId as _id,stuName,stuSex,stuAge from student", null);
        SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(MainActivity.this,R.layout.one,cursor,new String[]{cursor.getColumnName(0),cursor.getColumnName(1),cursor.getColumnName(2),cursor.getColumnName(3)},new int[]{R.id.oneid,R.id.onename,R.id.onesex,R.id.oneage});
        listview.setAdapter(cursorAdapter);
    }
});
/* public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
*	 context:上下文
*  	 layout:ListView单个列表项布局样式
*	 c:游标,即SQLite查询结果
*	 from:查询结果的属性列
*	 to:每个属性列的查询结果渲染到哪个控件中,其中from和to要一一对应
* */

5.事件监听:

OnItemClickListener:监听器在点击该项目的子项时触发。
OnItemLongClickListener:长按事件监听。
OnTouchListener:监听器在触碰到ListView时触发。
OnScrollListener:监听器在ListView滚动时触发。

        listview1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                /*
                ListView lv:被点击列表项属于哪个ListView
                View v:被点击的item对象
                int position:被点击的item对象是第几行
                long id:被点击的item对象的id
                 */
            }
        });

十七、Toolbar控件:

  • 自定义Activity标题栏。
  • 使用前首先修改themes.xml文件,使Activity不自动生成Toolbar:
    <style name="Theme.MyApplication2" parent="Theme.MaterialComponents.DayNight.NoActionBar">

1.常用XML属性:

<?xml version="1.0" encoding="utf-8"?>
    <!--这里的LinearLayout我们可以当作是一个存放控件的容器,后面会学习它的使用-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/tb1"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/blue"
            app:title="标题"
            app:titleTextColor="@color/purple_700"
            app:titleMarginStart="0dp"
            app:subtitle="子标题"
            app:subtitleTextColor="@color/gray"
            app:logo="@drawable/ic_launcher_foreground"
            app:navigationIcon="@drawable/ic_baseline_arrow_back_24">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="居中标题"
                android:layout_gravity="center"
                android:gravity="center"/>
        </androidx.appcompat.widget.Toolbar>
    </LinearLayout>
        <!--
        1.background:设置背景色
        2.title:标题
        3.titleTextColor:标题颜色
        4.titleMarginStart:标题左外边距
        5.subtitle:子标题
        6.subtitleTextColor:子标题颜色
        7.logo:图片logo
        8.navigationIcon:设置返回箭头
        9.一般使用嵌套TextView的方法设置居中标题
        -->

效果图:
请添加图片描述

2.事件监听:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NotificationCompat;

public class LoginActivity extends Activity {

    NotificationManager manager;
    Notification notification;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);
        Toolbar toolbar = findViewById(R.id.tb1);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            //设置返回箭头navigationIcon的事件监听
            @Override
            public void onClick(View v) {

            }
        });
    }
}

十八、ViewPager控件:

  • 实现屏幕左右滑动切换页面。

1.实现页面左右滑动:

第一步:创建ViewPager标签:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="horizontal" >
    <androidx.viewpager.widget.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/vp"/>
</LinearLayout>

第二步:使用PagerAdapter为ViewPager填充布局:

package com.example.t.androidproject.myapplication2;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import java.util.ArrayList;
import java.util.List;


public class LoginActivity extends Activity {
    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.avtivity_login);

        //LayoutInflater用于获取布局文件对象
        LayoutInflater lf = getLayoutInflater();
        //LayoutInflater对象的inflate方法来获取布局文件
        View view1 = lf.inflate(R.layout.layout1,null);
        View view2 = lf.inflate(R.layout.layout2,null);
        View view3 = lf.inflate(R.layout.layout3,null);
        //将多个Layout布局文件存入集合
        List<View> list = new ArrayList();
        list.add(view1);
        list.add(view2);
        list.add(view3);

        //创建适配器,用于给viewpager添加多个布局文件,必须重写四个方法
        PagerAdapter pagerAdapter = new PagerAdapter() {
            @NonNull
            @Override
            //当要显示的布局文件可以进行缓存的时候,会调用这个方法将要显示布局的文件进行初始化。
            //我们只需要将要显示的布局文件view加入到ViewGroup中,然后作为返回值返回即可
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                //将给定的布局对象view添加到ViewGroup容器中,创建并显示出来
                container.addView(list.get(position),0);
                //返回一个新页面
                return list.get(position);
            }

            @Override
            // 获取要滑动的布局文件的数量
            public int getCount() {
                return list.size();
            }
            @Override
            //判断instantiateItem()返回的object与当前view是否是同一个,即判断显示的是否为同一个布局文件
            public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
                return view == object;
            }
            //本案例PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将布局文件销毁
            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                container.removeView(list.get(position));
            }
        };

        //第一步:获取viewpager
        ViewPager viewpager = findViewById(R.id.vp);
        //第二步:使用Adapter为viewpager填充布局
        viewpager.setAdapter(pagerAdapter);
    }
}

十九、Shape标签:

  • 用于绘制简单形状。
  • corners(圆角)、gradient(渐变)、
    solid(填充)、 padding(内边距)、 stroke(描边)、size(大小)

1.绘制圆角矩形:

  • 在drawable文件夹下绘制,作为图片用于布局文件中。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"/>
    <solid android:color="@color/blue"/>
</shape>
    <!--
       android:radius 全部的圆角半径,为角的弧度,值越大角越圆
       android:topLeftRadius 左上角的圆角半径
       android:topRightRadius 右上角的圆角半径
       android:bottomLeftRadius 左下角的圆角半径
       android:bottomRightRadius 右下角的圆角半径
       solid:设置填充色
    -->

二十、GridView控件:

<GridView
        android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp"
        android:numColumns="2">
    </GridView>
    BaseAdapter ba=new BaseAdapter() {
        @Override
        public int getCount() {
            return evaluatelist.size();
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //单条评论信息
            String[] strs=evaluatelist.get(position);
            String username=strs[1];
            String datail=strs[2];
            LinearLayout menu_item=(LinearLayout) LayoutInflater.from(getActivity()).inflate(R.layout.evaluate_item, null);
            TextView cname=(TextView) menu_item.findViewById(R.id.username);
            cname.setText(username);
            TextView clevel=(TextView) menu_item.findViewById(R.id.detail);
            clevel.setText(datail);
            return menu_item;
        }
    };
    evaluateGridView.setAdapter(ba);
}

在这里插入图片描述

二十一、VideoView控件:

视频播放控件。

    <VideoView
        android:id="@+id/video"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>

1.播放网络视频的方式:

String vurl = "https://.....................mp4";
video.setVideoPath(vurl);
video.requestFocus();
video.start();

二十二、ViewFlipper控件:

轮播图控件。

<ViewFlipper
        android:id="@+id/flipper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <ImageView
            android:id="@+id/swiper1"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <ImageView
            android:id="@+id/swiper2"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <ImageView
            android:id="@+id/swiper3"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <ImageView
            android:id="@+id/swiper4"
            android:scaleType="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</ViewFlipper>

1.开启轮播:

ViewFlipper flipper = view.findViewById(R.id.flipper);
flipper.startFlipping();

二十三、LinearLayout嵌套案例:登陆界面

1.效果:

在这里插入图片描述

2.布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:background="@mipmap/index">
    <LinearLayout
        android:layout_width="380dp"
        android:layout_height="300dp"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/shape_corner"
        android:layout_marginTop="50dp"
        android:orientation="vertical">
        <!--图片加账号密码-->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <!--图片-->
            <ImageView
                android:layout_width="100dp"
                android:layout_height="120dp"
                android:layout_marginLeft="15dp"
                android:layout_marginTop="15dp"
                android:background="@mipmap/qq" />
            <!--账号密码框-->
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <LinearLayout
                    android:layout_marginLeft="8dp"
                    android:background="@drawable/shape_corner"
                    android:backgroundTint="@color/white"
                    android:layout_marginTop="15dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                    <TextView
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:layout_marginRight="5dp"
                        android:layout_gravity="center"
                        android:text="账号"
                        android:textSize="20sp"/>
                    <EditText
                        android:layout_width="200dp"
                        android:layout_height="50dp"
                        android:hint="输入账号"
                        android:textColor="@color/gray"
                        android:paddingLeft="5dp"
                        android:background="@null"
                        android:drawableRight="@drawable/ic_baseline_arrow_drop_down_24"/>
                </LinearLayout>
                <LinearLayout
                    android:layout_marginLeft="8dp"
                    android:background="@drawable/shape_corner"
                    android:backgroundTint="@color/white"
                    android:layout_marginTop="15dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                    <TextView
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:layout_marginRight="5dp"
                        android:layout_gravity="center"
                        android:text="密码"
                        android:textSize="20sp"/>
                    <EditText
                        android:layout_width="200dp"
                        android:layout_height="50dp"
                        android:textColor="@color/gray"
                        android:paddingLeft="5dp"
                        android:background="@null"
                        android:drawableRight="@drawable/ic_baseline_arrow_drop_down_24"/>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="记住密码"
                android:textSize="18sp"
                android:layout_marginLeft="25dp"
                android:layout_marginTop="15dp"
                android:checked="true"/>
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="自动登录"
                android:textSize="18sp"
                android:layout_marginLeft="125dp"
                android:layout_marginTop="15dp"
                android:checked="true"/>
        </LinearLayout>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="5dp"
            android:backgroundTint="@color/blue"
            android:gravity="center"
            android:paddingLeft="80dp"
            android:paddingTop="20dp"
            android:paddingRight="80dp"
            android:paddingBottom="20dp"
            android:text="登录"
            android:textSize="20sp"
            android:textStyle="bold" />
    </LinearLayout>
    <LinearLayout
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="20dp"
        android:orientation="horizontal">
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="隐身登录"
            android:textSize="18sp"
            android:textColor="@color/gray"
            android:layout_marginLeft="25dp"
            android:layout_marginTop="15dp"/>
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开启震动"
            android:textSize="18sp"
            android:textColor="@color/gray"
            android:layout_marginLeft="125dp"
            android:layout_marginTop="15dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="20dp"
        android:orientation="horizontal">
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="隐身登录"
            android:textSize="18sp"
            android:textColor="@color/gray"
            android:layout_marginLeft="25dp"
            android:layout_marginTop="15dp"/>
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开启震动"
            android:textSize="18sp"
            android:textColor="@color/gray"
            android:layout_marginLeft="125dp"
            android:layout_marginTop="15dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="160dp"
        android:orientation="horizontal"
        android:background="@color/gray1">
        <Button
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="25dp"
            android:background="@drawable/ic_baseline_apps_24"
            android:backgroundTint="@color/black" />
    </LinearLayout>
</LinearLayout>

3.圆角矩形图片:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"/>
    <solid android:color="@color/gray"/>
</shape>
    <!--
       android:radius 全部的圆角半径,为角的弧度,值越大角越圆
       android:topLeftRadius 左上角的圆角半径
       android:topRightRadius 右上角的圆角半径
       android:bottomLeftRadius 左下角的圆角半径
       android:bottomRightRadius 右下角的圆角半径
       solid:设置填充色
    -->
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值