1.ScrollView(滚动视图)

1.1简介

ScrollView也是一个容器,它是FrameLayout的子类,它的主要作用就是将超出物理屏幕的内容显示出来,(就是滚动条效果)ScrollView提供垂直滚动,进而可将超出物理屏幕的内容显示出来。

在一般情况下,可以将一个采用垂直方式布局组件的LinearLayout作为ScrollLayout容器的子组件,同时,在LinearLayout容器中可以显示超出屏幕物理高度的内容。

1.2注意

1.ScrollView有且只能有一个子view(布局-LinearLayout或RelativeLayout)

2.

如果说子view中的height没有比scrollView高,不能滑动

只能垂直滑动,不能水平滑动,如果想要水平滑动,需要使用HorizatonalScrollView

2.progressBar(滚动条)

2.1介绍

进度条是UI界面中一种实用的UI组件,用于显示一个耗时操作显示出来的百分比,进度条可以动态的显示进度,避免是用户觉得系统长时间未反应,提高用户的体验。

2.2分类

主要分为圆形以及水平进度条,水平进度条是确定的,可以看到水平进度,圆形进度条是不确定的,不知道什么时候完成,就一直在那里转。这两者最典型的例子就是文件拷贝可以用水平进度条看到文件拷贝的进度,圆形进度条则主要使用在网络连接上,不知道网络连接成功的时间,就一直在那里尝试连接,可以显示一直在那里转。

2.3使用

3.PopupWindow(弹出框)

3.1可以加载一个view或者导入自定义的xml布局

3.2使用

xml层

Mainactivity层

3.3如何导入一个自定义布局

首先要创建一个xml文件

在Java代码层编写代码

public class MainActivity3 extends AppCompatActivity {Button btn_test;Button btn_test2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);btn_test = findViewById(R.id.btn_test);btn_test2 = findViewById(R.id.btn_test2);TextView textView = new TextView(MainActivity3.this);textView.setText("嫩爹来喽!!!");PopupWindow popupWindow = new PopupWindow(textView,200,300);popupWindow.setOutsideTouchable(true);btn_test.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {popupWindow.showAsDropDown(btn_test);}});//将xml文件转化成viewView popup_item = getLayoutInflater().inflate(R.layout.popup_item,null);PopupWindow popupWindow2 = new PopupWindow(popup_item,200,300);//设置点击外部取消popupWindow2.setOutsideTouchable(true);//设置背景图popupWindow2.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_launcher_background));btn_test2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//显示弹出框popupWindow2.showAsDropDown(btn_test2);}});}
}

4.Dialog(对话框)

4.1Dialog与PopupWindow的区别

1.两者相同点
1.1 都可以设置对话框
1.2 都可以设置呈现各种弹窗样式

2.两者区别
本质区别:

Dialog是非阻塞式对话框,AlertDialog弹出时后台还可以做其他事情;
popupwindow是阻塞式对话框,popupwindow弹出时程序会等待,在popupwindow结束前程序会一直等待,当调用dismiss方法后popupwindow弹窗关闭程序才向下进行
代码实现区别:

Dialog实现底部弹窗

public class BottomDialog extends Dialog implements View.OnClickListener {private Context context;private TextView tvCall;private String name;private String phone_number;private TextView tv_contact_customer;private TextView tv_cancel;public BottomDialog(@NonNull Context context, String name, String phone_number, @StyleRes int themeResId){super(context, themeResId);this.context = context;this.name = name;this.phone_number = phone_number;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_contact_phone_dialog);//弹窗布局if (this.getWindow() != null) {WindowManager.LayoutParams layoutParams = getWindow().getAttributes();layoutParams.gravity = Gravity.BOTTOM;//底部弹出layoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;layoutParams.height = RelativeLayout.LayoutParams.WRAP_CONTENT;getWindow().getDecorView().setPadding(0, 0, 0, 0);getWindow().setAttributes(layoutParams);//getWindow().setWindowAnimations(R.style.DialogAnimation);//view中添加动画}tvCall = findViewById(R.id.call_service);tv_contact_customer = findViewById(R.id.tv_contact);tv_cancel = findViewById(R.id.tv_close);tv_cancel.setOnClickListener(this);tv_contact_customer.setOnClickListener(this);tvCall.setOnClickListener(this);}@Overridepublic void onClick(View view) {if (view.getId() == R.id.call_service) {if (onCallSalesListener != null) {onCallSalesListener.onCallSalesman();}}if (view.getId() == R.id.tv_contact) {if (onCallSalesListener != null) {onCallSalesListener.onContactCustomerService();}}if (view.getId() == R.id.tv_close) {dismiss();}}//监听接口public interface OnCallSalesListener {void onCallSalesman();void onContactCustomerService();}private OnCallSalesListener onCallSalesListener;public void setOnCallSalesListener(OnCallSalesListener onCallSalesListener) {this.onCallSalesListener = onCallSalesListener;}}

popupwindow实现底部弹窗:

public class BottomPopWindow extends PopupWindow implements View.OnClickListener{private View mMenuView;//文本信息private TextView tv_prompt_info;private final RelativeLayout rl_close;private final TextView tv_close;public BottomPopWindow(final Context context) {super(context);mMenuView = View.inflate(context,R.layout.layout_bottom_pop,null);//提示信息内容tv_prompt_info = mMenuView.findViewById(R.id.tv_info);rl_close = mMenuView.findViewById(R.id.rl_close);rl_close.setOnClickListener(this);tv_close = mMenuView.findViewById(R.id.tv_close);tv_close.setOnClickListener(this);tv_prompt_info.setText("寒塘渡鹤影,冷月葬花魂");tv_prompt_info.setHighlightColor(context.getResources().getColor(android.R.color.transparent));//设置SelectPicPopupWindow的Viewthis.setContentView(mMenuView);//设置布局//设置弹出窗体的宽和高this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);//返回键可点击this.setFocusable(true);//外部可点this.setOutsideTouchable(true);//弹出窗体的背景this.setBackgroundDrawable(new ColorDrawable(0xAA000000));//动画效果this.setAnimationStyle(R.style.DialogAnimation);//弹窗dismiss时调用this.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss() {//弹窗结束的收尾工作...}});}@Overridepublic void onClick(View v) {if (v.getId()==R.id.rl_close || v.getId()==R.id.tv_close ){dismiss();}}
}

基本的对话框要包含什么内容?

package com.hp.demo;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity4 extends AppCompatActivity {Button btn_dialog_talk;Button getBtn_dialog_talk2;Button getBtn_dialog_talk3;Button getBtn_dialog_talk4;Button getBtn_dialog_talk5;private String choice = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main4);btn_dialog_talk = findViewById(R.id.btn_dialog_talk);getBtn_dialog_talk2 = findViewById(R.id.btn_dialog_talk2);getBtn_dialog_talk3 = findViewById(R.id.btn_dialog_talk3);getBtn_dialog_talk4 = findViewById(R.id.btn_dialog_talk4);getBtn_dialog_talk5 = findViewById(R.id.btn_dialog_talk5);btn_dialog_talk.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("警告").setMessage("确定删除该条数据吗?").setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();}});dialog.show();}});getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String [] types = {"A照","B照","C照","D照"};AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("请输入你的驾照类型:").setItems(types, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {choice = types[i];Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}});dialog.show();}});getBtn_dialog_talk3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String [] types = {"A照","B照","C照","D照"};AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("请输入你的驾照类型:").setSingleChoiceItems(types,2, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {choice = types[i];}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setNegativeButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();}});dialog.show();}});getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String [] types = {"A照","B照","C照","D照"};boolean[] checkItems = {true,false,false,true};AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("请输入你的驾照类型:").setMultiChoiceItems(types, checkItems, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i, boolean b) {checkItems[i] = b;}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setNegativeButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {choice = "";for (int j = 0; j <checkItems.length ; j++) {if (checkItems[j]) {choice = choice+types[j]+",";}}Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();}});dialog.show();}});getBtn_dialog_talk5.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {View v = getLayoutInflater().inflate(R.layout.dialog_login,null);AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity4.this).setTitle("登录").setView(v).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//取出用户输入的账号和密码EditText et_user = v.findViewById(R.id.et_user);String user = et_user.getText().toString();EditText et_pwd = v.findViewById(R.id.et_pwd);String pwd = et_pwd.getText().toString();Toast.makeText(MainActivity4.this,"你的账号是:"+user+",你的密码是:"+pwd,Toast.LENGTH_SHORT).show();}});builder.show();}});}
}

4.3对话框的分类

1.普通对话框

btn_dialog_talk.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("警告").setMessage("确定删除该条数据吗?").setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();}});dialog.show();}});

2.单选对话框

getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String [] types = {"A照","B照","C照","D照"};AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("请输入你的驾照类型:").setItems(types, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {choice = types[i];Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}});dialog.show();}});

3.复选对话框

getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String [] types = {"A照","B照","C照","D照"};boolean[] checkItems = {true,false,false,true};AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this).setTitle("请输入你的驾照类型:").setMultiChoiceItems(types, checkItems, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i, boolean b) {checkItems[i] = b;}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setNegativeButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {choice = "";for (int j = 0; j <checkItems.length ; j++) {if (checkItems[j]) {choice = choice+types[j]+",";}}Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();}});dialog.show();}});

4.自定义对话框

getBtn_dialog_talk5.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {View v = getLayoutInflater().inflate(R.layout.dialog_login,null);AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity4.this).setTitle("登录").setView(v).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {//取出用户输入的账号和密码EditText et_user = v.findViewById(R.id.et_user);String user = et_user.getText().toString();EditText et_pwd = v.findViewById(R.id.et_pwd);String pwd = et_pwd.getText().toString();Toast.makeText(MainActivity4.this,"你的账号是:"+user+",你的密码是:"+pwd,Toast.LENGTH_SHORT).show();}});builder.show();}});

5.下拉列表框

5.1静态赋值

读取Strings.xml中的数据,将数据加载到spinner

1. 在values/strings.xml 中定义一个 String-array
        1. 只需要在Spinner中添加属性  entries,在该属性中调用string-array

<resources><string name="app_name">My Application</string><string name="depart_promt">静态赋值的下拉值</string><string-array name="depart_arr"><item>总经办</item><item>人事部</item><item>研发部</item><item>销售部</item><item>管理部</item></string-array>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp"tools:context=".MainActivity5"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Spinnerandroid:id="@+id/spinner01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:entries="@array/depart_arr"android:layout_weight="2" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="确定" /></LinearLayout><Spinnerandroid:id="@+id/spinner2"android:layout_marginTop="50dp"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

Java代码实现

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main5);button = findViewById(R.id.button);spinner2 = findViewById(R.id.spinner2);spinner1 = findViewById(R.id.spinner01);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String choice = spinner1.getSelectedItem().toString();Toast.makeText(MainActivity5.this, "你的选择是:"+choice, Toast.LENGTH_SHORT).show();}});

5.2动态赋值

String[] areas = {"金水区","管城区","惠济区","高新区","中原区"};//创建适配器ArrayAdapter adapter = new ArrayAdapter(MainActivity5.this, android.R.layout.simple_spinner_item,areas);//给下拉框设置适配器spinner2.setAdapter(adapter);spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {String choice = areas[i];Toast.makeText(MainActivity5.this,"你的选择是:"+choice,Toast.LENGTH_SHORT).show();}@Overridepublic void onNothingSelected(AdapterView<?> adapterView) {}});

5.3如何使用

跟按钮结合的使用

点击事件是放在button上的

独立使用的

点击事件只能放在Spinner

Android高级控件相关推荐

  1. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  2. Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

  3. Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷

    Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...

  4. Android 高级控件(七)——RecyclerView的方方面面

    Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...

  5. 移动开发技术(Android)——实验5 Android高级控件的应用

    移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...

  6. 《移动项目实践》实验报告——Android高级控件

    实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...

  7. Android高级控件----AdapterView与Adapter详解

    在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...

  8. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  9. Android 高级控件ListView用法

    BaseAdapter:是所有适配器类的父类,可以对列表项进行最大限度的定制 1.1 自定义适配器中的方法 getCount getView getItem getItemId 1.2 LayoutI ...

  10. Android高级控件之ListView的优化以及下拉刷新页面

    1.ListView的优化 在优化之前我们先来说说配置器的自定义,为什么需要自定义配置器呢,因为系统自带的配置器不能满足我们的需求,所以就需要我们自己写配置器来实现功能, 但是在创建ListView时 ...

最新文章

  1. 高并发下接口幂等性技术方案
  2. Mongodb 数据模型概念
  3. 创建一个提供数据 API 的 Node.js 网站
  4. MySQL必知必会——了解SQL/SQL简介/使用MySQL
  5. linux ftp配置chroot,vsftp chroot 设置
  6. OEA 中 WPF 树型表格虚拟化设计方案
  7. 单例设计模式 (2)
  8. 【MYSQL权限】数据库权限部署
  9. mkfs 格式化分区并创建文件系统
  10. matlab逆滤波、维纳滤波、最小二乘滤波
  11. 配置Windows静态IP地址
  12. gensim中word2vec API参数说明
  13. 通过数字抖动实现更高精度的PWM脉宽控制
  14. JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析
  15. JAVA最佳学习方法
  16. python获取模块的名称_python获取当前模块的名称
  17. 怎样修复小米服务器,小米手机删除的视频想要恢复?那你一定不能错过这些实用技巧...
  18. 啊哈添柴挑战Java1611. 反向输出练习(难)
  19. Hung-Yi Lee homework[7]: Network Compression
  20. Django+redis+celery实现异步任务

热门文章

  1. Linux Wine环境下如何编译安装CS反恐精英
  2. linux查看IP、域名、端口的网络是否相通
  3. WinCE 大排档第一篇
  4. 计算机丢失mfc42.dll怎么修复,丢失mfc42.dll是怎么回事?没有找到mfc42.dll 修复方法...
  5. 中国互联网经历过哪些大事件?
  6. mysql事务的四大特性_浅谈数据库事务四大特性
  7. 【第45题】常用的数学工具类2-三角函数的使用
  8. 分享前后端实现唤起微信扫一扫小demo
  9. 电脑我的世界,我的世界电脑版
  10. Dota游戏中的护甲分析