自动完成文本框(AutoCompleteTextView) ,用于实现允许用户输入-定字符后,显示一个下拉菜单,供用户从 中选择,当用户选择某个选项后,按用户选择自动填写该文本框。
xml
package com.jingyi.advancedcomponents;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String[] COFFEE=new String[]{"Espresso","EspressoMacchiato","Americano","FlatWhite","CaffèLatte","Cappuccino"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autoTextView1);
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, COFFEE);
textView.setAdapter(adapter);
Button button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,textView.getText().toString(),Toast.LENGTH_SHORT).show();
}
});
}
}
2.1.2 进度条
当一个应用在后台执行时,前台界面不会有任何信息,这时用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度。在Android中,进度条 用于向用户显示某个耗时操作完成的百分比。
[V] setProgress(int progress)方法:用于设置进度完成的百分比。
[V] incrementProgressBy(int dif)方法:用于设置进度条的进度增加或减少。当参数值为正数时,表示进度增加;为负数时,表示进度减少。
xml
public class MainActivity extends AppCompatActivity {
private ProgressBar horizonBar;
private ProgressBar circleBar;
private int progressStatus=0;//完成进度
private Handler handler;//处理消息的Handler的对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
horizonBar = (ProgressBar) findViewById(R.id.proBar1);
circleBar=(ProgressBar) findViewById(R.id.proBar2);
handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
if (msg.what==0x111){
horizonBar.setProgress(progressStatus);//更新进度
}else{
Toast.makeText(MainActivity.this, "耗时操作已完成", Toast.LENGTH_SHORT).show();
horizonBar.setVisibility(View.GONE);//设置进度条不可见且不占用空间
circleBar.setVisibility(View.GONE);
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
while(true){
progressStatus=runprogress();//获取完成的进度
Message message = new Message();
if (progressStatus<100){
message.what=0x111;
handler.sendMessage(message);//发送未完成的消息
}else{
message.what=0x110;
handler.sendMessage(message);//发送已完成的消息
break;
}
}
}
}).start();
}
//模拟耗时行为
private int runprogress(){
progressStatus+=Math.random()*15;//设置完成的进度
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
return progressStatus;
}
}
2.1.3 拖动条和星级评分条
1.拖动条
拖动条与进度条类似,所不同的是,拖动条允许用户拖动滑块来改变值,通常用于实现对某种数值的调节。例如,调节图片的透明度或是音量等。
xml
java
public class MainActivity extends AppCompatActivity {
private SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.textView1);
seekBar = (SeekBar) findViewById(R.id.seekBar1);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
textView.setText("当前值:"+progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this, "开始滑动", Toast.LENGTH_SHORT).show();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this, "结束滑动", Toast.LENGTH_SHORT).show();
}
});
}
}
2.星级评分条
星级评分条与拖动条类似,都允许用户拖动来改变进度,所不同的是,星级评分条通过星星图案表示进度。通常情况下,使用星级评分条表示对某- -事物的支持度或对某种服务的满意程度等。例如,淘宝网中对卖家的好评度,就是通过星级评分条实现的。
除了表2.4中介绍的属性外,星级评分条还提供了以下3个比较常用的方法。
[V] getRating0方法:用于获取等级,表示选中了几颗星。.
[V] getStepSize(): 用于获取每次最少要改变多少个星级。
[v] getProgress0方法:用于获取进度,获取到的进度值为getRating0方法返回值与getstepSiue0方法返回值
之积。
public class MainActivity extends AppCompatActivity {
private RatingBar ratingBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ratingBar = (RatingBar) findViewById(R.id.ratingBar1);
Button button = (Button) findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int progress = ratingBar.getProgress();//获取进度
float rating = ratingBar.getRating();//获取等级
float stepSize = ratingBar.getStepSize();//获取每次最少要改变多少个星级
Log.i("星级评分条[","step="+stepSize+",progress="+progress+",rating="+rating+"]");
Toast.makeText(MainActivity.this, "你提交了"+rating+"颗星", Toast.LENGTH_SHORT).show();
}
});
}
}
2.1.4 选项卡
选项卡主要由TabHost、TabWidget 和frameI ayout3个组件组成,用于实现一个多标签页的用户界面,通过它可以将一一个复杂的对话框分割成若干个标签页,实现对信息的分类显示和管理。使用该组件不仅可以使界面简洁大方,还可以有效地减少窗体的个数。
在Android中,实现选项卡的一般步骤如下:
(1)在布局文件中添加实现选项卡所需的TabHost、TabWidget 和frameLayout组件.
(2)编写各标签页中要显示内容所对应的XML布局文件。
(3)在Activity中,获取并初始化TabHost组件.
(4)为TabHost对象添加标签页。
main.xml
tab1.xml
tab2.xml
activity.java
package com.jingyi.tabpage;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TabHost;
public class MainActivity extends AppCompatActivity {
private TabHost tabHost;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tabHost=(TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();//初始化TabHost组件
LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.tab1,tabHost.getTabContentView());
inflater.inflate(R.layout.tab2,tabHost.getTabContentView());
tabHost.addTab(tabHost.newTabSpec("tab1")
.setIndicator("World家")
.setContent(R.id.linearLayout1));//设置第一个标签页标题将它添加到TabHost
tabHost.addTab(tabHost.newTabSpec("tab2")
.setIndicator("智慧交通")
.setContent(R.id.linearLayout2));//设置第二个标签页标题将它添加到TabHost
}
}
2.1.5 图像切换器
图像切换器( ImageSwitcher),用于实现类似于Windows操作系统下的"Windows照片查看器"中的上一张、下一张切换图片的功能。在使用ImageSwitcher时,必须实ViewSwitcher.ViewFactory接口,并通过makeView(方法来创建用于显示图片的ImageView. makeView()方法将返回一个显示图片的ImageView.在使用图像切换器时,还有一个方法非常重要,那就是setImageResource0方法,该方法用于指定要在ImageSwitcher中显示的图片资源.
package com.jingyi.exchangeimage;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.frameLayout;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher;
public class MainActivity extends AppCompatActivity {
private int[] imagesId=new int[]{R.drawable.nonet,R.drawable.noroots,R.drawable.nosingle,R.drawable.nulldata};//保存图片id的数组
private int index=0;//当前图像的索引
private ImageSwitcher imageSwitcher;// 图像切换器对象
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitch1);
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));//设置淡入动画
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));//设置淡出动画
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
imageView = new ImageView(MainActivity.this);//实例化一个ImageView类的对象
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);//设置保持纵横比居中缩放图像
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(frameLayout.LayoutParams.WRAP_CONTENT, frameLayout.LayoutParams.WRAP_CONTENT));
return imageView;
}
});//使用ImageSwitcher类的父类ViewSwitcher的setFactory方法指定视图切换工厂
imageSwitcher.setImageResource(imagesId[index]);//初始化默认显示图片
Button up = (Button) findViewById(R.id.btn1);
Button down = (Button) findViewById(R.id.btn2);
up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (index>0){
index--;
}
else{
index=imagesId.length-1;//防止越界
}
imageSwitcher.setImageResource(imagesId[index]);//显示当前索引位置的图片
}
});
down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (index
2.1.6 网格视图
网格视图(GridView) 是按照行、列分布的方式来显示多个组件,通常用于显示图片或是图标等。
GridView与ListView类似,都需要通过Adapter来提供要显示的数据。在使用GridView组件时,通常使用SimpleAdapter或者baseAdapter类为GridView组件提供数据。
main.xml
items.xml
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridView1);
int[] images =new int[]{R.drawable.home,R.drawable.find,
R.drawable.game,R.drawable.ercode,R.drawable.message,
R.drawable.toolbar};//初始化保存图片的数组
String [] title=new String[]{"首页","发现","游戏","二维码","信息","工具栏"};//初始化图片对应的标题数组
List
如果不需要图片标题,只显示图片名称则可以使用baseAdapter
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridView1);
int[] images =new int[]{R.drawable.home,R.drawable.find,
R.drawable.game,R.drawable.ercode,R.drawable.message,
R.drawable.toolbar};//初始化保存图片的数组
baseAdapter adapter=new baseAdapter(){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView==null){
imageView=new ImageView(MainActivity.this);//实例化ImageView对象
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);//设置缩放方式
imageView.setPadding(5,0,5,0);
}else{
imageView=(ImageView) convertView;
}
imageView.setImageResource(images[position]);
return imageView;
}
@Override
public int getCount() {
return images.length;//获取图片的数量
}
@Override
public Object getItem(int position) {
return position;//获取当前项
}
@Override
public long getItemId(int position) {
return position;//获取当前项的索引
}
};
gridView.setAdapter(adapter);
}
}
2.1.7 画廊视图
画廊视图(Gallery)表示,能够按水平方向显示内容,并且可用手指直接拖动图片移动,一.般用来浏览图片,被选中的选项位于中间,并且可以响应事件显示信息。
main.xml
attr.xml
java
public class MainActivity extends AppCompatActivity {
private int[] images =new int[]{R.drawable.home,R.drawable.find,
R.drawable.game,R.drawable.ercode,R.drawable.message,
R.drawable.toolbar};//初始化保存图片的数组
Gallery gallery = (Gallery) findViewById(R.id.gallery1);
baseAdapter baseAdapter=new baseAdapter() {
@Override
public int getCount() {
return images.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if(convertView==null){
imageView=new ImageView(MainActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(300,300));
TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
imageView.setPadding(5,0,5,0);
imageView.setBackgroundResource(typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground,0));
}else{
imageView=(ImageView) convertView;
}
imageView.setImageResource(images[position]);
return imageView;
}
};
gallery.setAdapter(baseAdapter);
gallery.setSelection(images.length/2);//初始化默认选中的图片
gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "您选择了第"+(position+1)+"张图片", Toast.LENGTH_SHORT).show();
}
});
}
}
2.1.8 案例1:标题的进度条
由于标题进度条的实现需要在Android 5老版本之前的版本.上运行才有效果,我们需要将新建工程相关配置的资源修改为低版本的参数。还要创建一- 个低版本API的Android虚拟机用来展现我们的进度条。
(1)修改新建项目的applbuild.gradle中compileSdk、targetSdk 为20,并删除dependencies里引用的资源。
(2)修改新建项目的MainActivity,将继承的AppCompatActivity 修改为Activity。
(3)修改新建项目的resayout目录下的布局文件activity_ main.xml, 为默认添加的垂直线性布局管理器设置
一个android:id属性
(4)修改AndroidManifest.xml,将roudlcon、supportsRt、 theme 属性删除。
删除src/main/res/values/themes.xml、src/main/res/values-night. src/main/res/drawable/ic_ launcher_ background.xml、
src/main/res/drawable-v24目录、sr/main/res/mipmap-anydpi-v26 目录,全部删除。到此我们清除 了所有不适配低版本API的相关属性和资源。
(5)在主活动MainActivity中,定义一个用于保存要显示图片id的数组( 需要将要显示的图片复制到res/drawable文件夹中)和一个垂直线性布局管理器的对象
public class MainActivity extends Activity {
private int[] images =new int[]{R.drawable.home,R.drawable.find,
R.drawable.game,R.drawable.ercode,R.drawable.message,
R.drawable.toolbar};//初始化保存图片的数组
private LinearLayout l;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);//显示水平进度条
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//圆圈进度条
setContentView(R.layout.activity_main);
l=(LinearLayout) findViewById(R.id.linearLayout1);//获取布局文件的布局管理器
new MyTack().execute();
}
class MyTack extends AsyncTask {
@Override
protected void onPreExecute(){
setProgressBarVisibility(true);//执行任务前进度条可见
setProgressBarIndeterminateVisibility(true);//圆形进度条可见
super.onPreExecute();
}
@Override
protected LinearLayout doInBackground(Void... params) {
LinearLayout ll = new LinearLayout(MainActivity.this);//新建一个水平线性布局管理器
for(int i=0;i<6;i++){
ImageView imageView = new ImageView(MainActivity.this);//创建一个ImageView对象
imageView.setLayoutParams(new LinearLayout.LayoutParams(245,108));
imageView.setImageResource(images[i]);//设置要显示的图片
ll.addView(imageView);//将ImageView添加到线性布局管理器中
try{
Thread.sleep(1000);//线程休眠1000毫秒
}catch (InterruptedException e){
e.printStackTrace();
}
publishProgress(i+1);//触发onProgressUpdate()方法更新进度
}
return ll;
}
@Override
protected void onProgressUpdate(Integer... values){
super.onProgressUpdate(values);
setProgress(values[0]*2500);//任务执行中设置进度条的进度最大值为10000
}
@Override
protected void onPostExecute(LinearLayout result){
setProgressBarVisibility(false);//任务执行后隐藏进度条
l.addView(result);//水平线性布局管理器添加到垂直线性布局管理器中
super.onPostExecute(result);
}
}
}
2.1.9 幻灯片样式图片浏览器
public class MainActivity extends AppCompatActivity {
private int[] images =new int[]{R.drawable.home,R.drawable.find,
R.drawable.game,R.drawable.ercode,R.drawable.message,
R.drawable.toolbar};//初始化保存图片的数组
private ImageSwitcher imageSwitcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageSwitcher=(ImageSwitcher)findViewById(R.id.imageSwitcher);
Gallery gallery = (Gallery) findViewById(R.id.gallery1);
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));//设置淡入动画
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));//设置淡出动画
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
ImageView imageView = new ImageView(MainActivity.this);//实例化一个ImageView类的对象
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);//设置保持纵横比居中缩放图像
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(frameLayout.LayoutParams.WRAP_CONTENT, frameLayout.LayoutParams.WRAP_CONTENT));
return imageView;
}
});
baseAdapter adapter=new baseAdapter(){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView==null){
imageView=new ImageView(MainActivity.this);//实例化ImageView对象
imageView.setScaleType(ImageView.ScaleType.FIT_XY);//设置缩放方式
imageView.setLayoutParams(new Gallery.LayoutParams(300,300));
TypedArray typedArray=obtainStyledAttributes(R.styleable.Gallery);
imageView.setPadding(5,0,5,0);//设置ImageView内边距
}else{
imageView=(ImageView) convertView;
}
imageView.setImageResource(images[position]);
return imageView;
}
@Override
public int getCount() {
return images.length;//获取图片的数量
}
@Override
public Object getItem(int position) {
return position;//获取当前项
}
@Override
public long getItemId(int position) {
return position;//获取当前项的索引
}
};
gallery.setAdapter(adapter);
gallery.setSelection(images.length/2);
gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
imageSwitcher.setImageResource(images[position]);
}
});
}
}
2.2 消息提示框与对话框
在Android项目开发中,经常需要将-些临时信息显示给用户,虽然使用前面介绍的基本组件可以达到显示信息的目的,但是这样做不仅会增加代码量,而且对于用户来说也不够友好。为此,Android 提供了消息提示框与对话框来显示这些信息。下面将分别介绍消息提示框与对话框的基本应用。
2.2.1 使用Toast显示消息提示框
Toast类用于在屏幕中显示一个消息提示框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失。通常用于显示一些快速提示信息,应用范围非常广泛。
1.使用构造方法创建
Toast toast=new Toast(this)
2.使用Toast类的makeText()方法创建一个名为toast的Toast对象
Toast toast=Toast.makeText(this,"显示的内容",Toast.LENGTH_SHORT)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7lbsDNt-1648024515958)(C:Users机械师AppDataRoamingTyporatypora-user-images1647997958819.png)]
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast.makeText(this, "通过makeText()创建的消息提示框", Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast toast=new Toast(this);
toast.setDuration(Toast.LENGTH_SHORT);//设置持续时间
toast.setGravity(Gravity.CENTER,0,0);//设置对齐方式
LinearLayout linearLayout = new LinearLayout(this);//创建一个线性布局管理器
ImageView imageView = new ImageView(this);//创建一个ImageView
imageView.setImageResource(R.drawable.alert);
imageView.setPadding(0,0,5,0);//设置ImageView的内边距
linearLayout.addView(imageView);//把imageView添加到线性布局管理器中
TextView textView = new TextView(this);
textView.setText("通过构造方法创建的消息提示框");
linearLayout.addView(textView);
toast.setView(linearLayout);//设置消息提示框要显示的视图
toast.show();
}
}
2.2.2 使用Notification在状态栏显示通知(Android8区别)
在使用手机时,当有未接来电或是新短消息时,手机会给出相应的提示信息,这些提示信息通常会显示到手机屏幕的状态栏上。Android也提供了用于处理这些信息的类,它们是Notification和NotificationManager。其中,Notification代表的是具有全局效果的通知;而NotificationManager则是用于发送Notification通知的系统服务。
Android 8之前,使用Notification的步骤:
使用Notification和NotificationManager类发送和显示通知也比较简单,大致可以分为以下4个步骤。
(1)调用getSystemService()方法获取系统的NotificationManager服务。
(2)创建一个Notification对象,并为其设置各种属性。
(3)为Notification对象设置事件信息。
(4)通过NotificationManager类的notify0方法发送Notification通知。
Android8及其之后,使用Notification的步骤:
(1)调用getSystemService0方 法获取系统的NotificationManager服务。
(2)创建通知构造器NotificationCompat.Builder对象。
(3)调用NotificationCompat. Builder对象的方法设置通知相关内容。
(4)通过notify0方法发送Notification通知。
如果使用Android8之前的方法编写Demo,使其运行在AndroidO或者更高的Android设备上,会出现以下的报错:
Developer warning for package "com.example.my"Failed to post notification on channel ‘default’ See log for more
details
出现这种错误主要原因是我们一般常 NotificationCompat.Builder类来实现通告栏功能NotificationCompat. Builder builder=new NotificationCompat.Builder(getApplicationContextO,“default”);在Android8.0
(API26)以前手机上运行通知栏要么全部屏蔽通知栏(防止骚扰),要么全部正常运行通知栏。我们用NotificationCompat.Builder类实现是完全没有问题的。自从Android8.0 (API26) 出现时,为了让用户更好的体验,于是新增通道功能(也就是NotificationChannel类),通过通道功能( 也就是NotificationChannel 类)能够让用户有选择的权利,用户可以设置屏蔽无关重要的垃圾通告,用户也可以设置开启选择重要的通告。也就是说我们在Android8.0 (API26) 及以上的版本实现通告栏功能用NotificationCompat.Builder类,是无法正常运行的就会导致我们出现报错现象出现。
AndroidManifest.xml
main.xml
MainActivity.java
public class MainActivity extends AppCompatActivity {
//获取通知管理器,用于发送通知
//final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//通知栏管理器(获取系统服务)
String id="channel_1";//自定义消息通道ID属性
String description="通知描述";//自定义通道描述属性
int importance=NotificationManager.importANCE_HIGH;//通知栏重要消息提示音设置
int NOTIFYID_1=0x1;
int NOTIFYID_2=0x2;
Button button_getMsg = (Button) findViewById(R.id.btn1);
button_getMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NotificationChannel channel = new NotificationChannel(id, "Demo", importance);//建立通知栏通道类(需要有ID,重要属性)
channel.setDescription(description);//设置通道信道的属性
channel.enableLights(true);//通知出现时闪烁灯(如果设备支持)
channel.enableVibration(true);//通知出现时进行震动(如果设备支持)
channel.setVibrationPattern(new long[]{100,200,300,400,500,400,300,200,400});//设置震动频率
manager.createNotificationChannel(channel);//创建通知信道
Notification notification = new Notification.Builder(MainActivity.this, id)//创建Notification对象
.setContentTitle("这里是通知标题")//设置通知标题
.setSmallIcon(R.drawable.notification)//设置通知的小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alert))//设置通知的大图标
.setContentText("这里是通知的内容")//设置通知内容
.setAutoCancel(true)//设置自动删除通知
.build();//运行
manager.notify(NOTIFYID_1,notification);//通知栏保留多条通知
Intent intent = new Intent(MainActivity.this, ContentActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
Notification notification2=new Notification.Builder(MainActivity.this,id)
.setContentTitle("我是通知标题")
.setSmallIcon(R.drawable.alert)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alert))
.setContentText("Welcome to Android")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.build();
manager.notify(NOTIFYID_2,notification2);
}
});
Button button2 = (Button) findViewById(R.id.btn2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
manager.cancel(NOTIFYID_1);//清除ID号为常量NOTIFYID_1的通知
manager.cancelAll();//清除所有通知
}
});
}
}
ContentActivity.java
public class ContentActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contentlayout);
}
}
2.2.3 使用alertDialog创建对话框
alertDialog类的功能非常强大,它不仅可以生成带按钮的提示对话框,还可以生成带列表的列表对话框,概括起来有以下4种:
[V]带确定、中立和取消等N个按钮的提示对话框,其中的按钮个数不是固定的,可以根据需要添加。例如,
不需要中立按钮,则可以生成只带有确定和取消按钮的对话框,也可以是只带有一一个按钮的对话框。
[V]带列表的列表对话框。
[V]带多个单选列表项和N个按钮的列表对话框。
[V]带多个多选列表项和N个按钮的列表对话框。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button1 = (Button) findViewById(R.id.btn1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertDialog alertDialog= new alertDialog.Builder(MainActivity.this).create();
alertDialog.setIcon(R.drawable.alertdialog);//设置对话框的图标
alertDialog.setTitle("系统提示:");//设置对话框的标题
alertDialog.setMessage("这是一个带取消、中立和确定按钮的对话框!");//设置要现实的内容
//添加“取消”按钮
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"您单击了取消按钮",Toast.LENGTH_SHORT).show();
}
});
//添加“确定”按钮
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"您单击了确定按钮",Toast.LENGTH_SHORT).show();
}
});
//添加“中立”按钮
alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.show();//显示对话框
}
});
Button button2 = (Button) findViewById(R.id.btn2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] local=new String[]{"辽宁省","河北省","广东省","吉林省","海南省"};
alertDialog.Builder builder=new alertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.advise);
builder.setTitle("请选择您的位置");
builder.setItems(local, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"您选择了"+local[which],Toast.LENGTH_SHORT).show();
}
});
builder.create().show();//创建对话框并显示
}
});
Button button3 = (Button) findViewById(R.id.btn3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] items=new String[]{"标准","无声","会议","户外","离线"};
alertDialog.Builder builder=new alertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.chang);
builder.setTitle("请选择您的情景模式");
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"您选择了"+items[which],Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("确定",null);
builder.create().show();
}
});
Button button4 = (Button) findViewById(R.id.btn4);
boolean[] checkItems=new boolean[]{false,true,false,true,true};//各列表项状态
String[] items=new String[]{"办公室","网络中心","图书馆","编辑部","农业部"};
alertDialog.Builder builder=new alertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.part);
builder.setTitle("请选择要涉及的部门:");
builder.setMultiChoiceItems(items, checkItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
checkItems[which]=isChecked;//改变被操作列表项的状态
}
});
//为对话框添加"确定"按钮
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String result="";//保存选择的结果
for (int i=0;i
2.2.4 案例1:询问是否退出的对话框
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageButton imageButton = (ImageButton) findViewById(R.id.exit);
//为“退出"按钮添加单击事件监听器
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertDialog alertDialog=new alertDialog.Builder(MainActivity.this).create();
alertDialog.setIcon(R.drawable.exit);
alertDialog.setTitle("系统提示");
alertDialog.setMessage("确定要退出吗?");
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();//返回系统主界面
}
});
alertDialog.show();
}
});
}
}
2.2.5 案例2:带图标的列表对话框
main.xml
items.xml
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int[] images = {R.drawable.app,R.drawable.secret,R.drawable.safe,R.drawable.mail,R.drawable.sing};
final String[] title=new String[]{"程序管理","保密设置","安全设置","邮件设置","铃声设置"};
List



