栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

高级用户界面设计

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高级用户界面设计

第 2章 高级用户界面设计 2.1高级组件 2.2.1 自动完成文本框

自动完成文本框(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> items = new ArrayList<>();

        for (int i=0;i map = new HashMap<>();
            map.put("image",images[i]);
            map.put("title",title[i]);
            items.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.items, new String[]{"image", "title"},
                new int[]{R.id.imageView, R.id.textView});
        gridView.setAdapter(adapter);

    }
}

如果不需要图片标题,只显示图片名称则可以使用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> list = new ArrayList<>();

        for (int i=0;i map = new HashMap<>();
            map.put("image",images[i]);
            map.put("title",title[i]);
            list.add(map);

        }
       final SimpleAdapter adapter = new SimpleAdapter(this,list,R.layout.items,new String[]{"image","title"},new int[]{R.id.image,R.id.title});

        Button button = (Button) findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.Builder builder = new alertDialog.Builder(MainActivity.this);
                builder.setIcon(R.drawable.advise);
                builder.setTitle("设置:");
                builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "您选择了["+title[which]+"]", Toast.LENGTH_SHORT).show();
                    }
                });
                builder.create().show();
            }
        });
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号