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;
@Override
protected 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() {
@Override
public void onClick(View view) {
popupWindow.showAsDropDown(btn_test);
}
});
//将xml文件转化成view
View 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() {
@Override
public 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;
}
@Override
protected 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);
}
@Override
public 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的View
this.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() {
@Override
public void onDismiss() {
//弹窗结束的收尾工作...
}
});
}
@Override
public 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 = "";
@Override
protected 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() {
@Override
public void onClick(View view) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
.setTitle("警告")
.setMessage("确定删除该条数据吗?")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
});
getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String [] types = {"A照","B照","C照","D照"};
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
.setTitle("请输入你的驾照类型:")
.setItems(types, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
choice = types[i];
Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
dialog.show();
}
});
getBtn_dialog_talk3.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
choice = types[i];
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
});
getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
checkItems[i] = b;
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public 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() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(View view) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
.setTitle("警告")
.setMessage("确定删除该条数据吗?")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity4.this, "取消", Toast.LENGTH_SHORT).show();
}
});
dialog.show();
}
});
2.单选对话框
getBtn_dialog_talk2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String [] types = {"A照","B照","C照","D照"};
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity4.this)
.setTitle("请输入你的驾照类型:")
.setItems(types, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
choice = types[i];
Toast.makeText(MainActivity4.this,"你的驾照为:"+choice,Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
dialog.show();
}
});
3.复选对话框
getBtn_dialog_talk4.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
checkItems[i] = b;
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public 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() {
@Override
public 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() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public 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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/depart_arr"
android:layout_weight="2" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="确定" />
</LinearLayout>
<Spinner
android:id="@+id/spinner2"
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Java代码实现
@Override
protected 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() {
@Override
public 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() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
String choice = areas[i];
Toast.makeText(MainActivity5.this,"你的选择是:"+choice,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
5.3如何使用
跟按钮结合的使用
点击事件是放在button上的
独立使用的
点击事件只能放在Spinner