PopupWindow(以弹窗方式呈现组件)

在MainActivity中记得设置ID,用来给各事件获取对应的值

 public static final int NID_1=0x1;public static final int NID_2=0x2;public static final int NID_3=0x3;public static final int NID_4=0x4;

在activity文件中设置一个按钮,用来点击呈现效果

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/show"android:text="显示弹出窗口"android:onClick="showWindow"/>

新建一个布局文件popup_window_layout,内容如下,用于点击按钮后显示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Buttonandroid:id="@+id/button_edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="编辑" /><Buttonandroid:id="@+id/button2_delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="删除" />
</LinearLayout>

在MainActivity文件中实现按钮点击事件

 //按钮事件方法public void showWindow(View v){View view=getLayoutInflater().inflate(R.layout.popup_window_layout,null);//创建PopupWindow(相对的视图控件,宽,高)PopupWindow popupWindow=new PopupWindow(view,ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);popupWindow.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.btn_default));popupWindow.setAnimationStyle(android.R.style.Animation_Translucent);popupWindow.getBackground().setAlpha(100); //背景透明度popupWindow.setOutsideTouchable(true);  //点击弹窗外任意处弹窗消失popupWindow.setFocusable(true);   //获得焦点popupWindow.setTouchable(true);   //设置是否响应点击事件popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);//popupWindow.showAtLocation(v, Gravity.BOTTOM,0,0);   //显示的位置//获取屏幕尺寸DisplayMetrics dm=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int width= dm.widthPixels;int height=dm.heightPixels;}

测试效果如下

Notification(通知)

在布局文件中放置按钮用来点击呈现效果

    <Buttonandroid:id="@+id/button_normal_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="0dp"android:layout_marginTop="5dp"android:onClick="sendNotification1"android:text="发送一个普通的通知" /><Buttonandroid:id="@+id/button2_big_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="0dp"android:layout_marginTop="53dp"android:onClick="sendNotification2"android:text="发送一个大视图的通知" /><Buttonandroid:id="@+id/button3_progress"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="0dp"android:layout_marginTop="113dp"android:onClick="sendNotification3"android:text="发送一个进度条的通知" /><Buttonandroid:id="@+id/button4_custom"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:onClick="sendNotification4"android:layout_alignParentTop="true"android:layout_marginStart="0dp"android:layout_marginTop="176dp"android:text="发送一个自定义视图的通知" />

设置按钮一的点击事件(发送一个普通的通知)

 //发送一个普通的通知public void sendNotification1(View v){//API 11之前创建通知的方式
//        Notification n=new Notification();//API 11 之后
//        Notification.Builder builder=new Notification.Builder(this);//v4支持包NotificationCompat.Builder builder1=new NotificationCompat.Builder(this);//设置相关的属性builder1.setSmallIcon(R.mipmap.ic_launcher);//设置图标builder1.setContentTitle("你有一条新消息");builder1.setContentText("新年快乐!万事如意!");
//        builder1.setAutoCancel(true);//点击后自动取消通知builder1.setDefaults(Notification.DEFAULT_ALL);builder1.setNumber(10);builder1.setTicker("新消息");
//        builder1.setOngoing(true);//设置为常驻通知//定义一个意图,当点击通知时,要打开一个界面(Activity)Intent intent=new Intent(this,Main2Activity.class);intent.putExtra("msg","新年快乐!万事如意!");//参数:上下文,请求编码,意图,创建PendingIntet的方式
//        PendingIntent.FLAG_CANCEL_CURRENT:取消当前的PI,创建新的
//        PendingIntent.FLAG_NO_CREATE:如果有就用,没有不创建
//        PendingIntent.FLAG_ONE_SHOT:只使用一次
//        PendingIntent.FLAG_UPDATE_CURRENT:如果有,更新Intent,没有就创建PendingIntent pi=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);//通知的事件builder1.setContentIntent(pi);//创建一个通知对象Notification n=builder1.build();//获取系统的通知管理器,然后发送NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);nm.notify(NID_1,n);}

新建一个Main2Activity,但点击通知时显示,activity2中代码如下

 <TextViewandroid:id="@+id/msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="144dp"android:layout_marginTop="315dp"android:text="Hello,新年快乐" />

测试效果如下


设置按钮2的点击事件(发送一个大视图的通知)

    //大视图的通知public void sendNotification2(View v){NotificationCompat.Builder builder1=new NotificationCompat.Builder(this);//设置相关的属性builder1.setSmallIcon(R.mipmap.ic_launcher);//设置图标builder1.setContentTitle("消息");builder1.setContentText("消息");//设置大视图样式NotificationCompat.InboxStyle style=new NotificationCompat.InboxStyle();style.setBigContentTitle("霹雳语录");style.addLine("半神半圣亦半仙");style.addLine("全儒全道是全贤");style.addLine("脑中真书藏万卷");style.addLine("掌握文武半边天");builder1.setStyle(style);style.setSummaryText("素还真");builder1.setNumber(5);Notification n=builder1.build();NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);nm.notify(NID_2,n);}

测试效果如下

设置按钮3的点击事件(发送一个带进度条的通知)

 //显示进度条的通知public void sendNotification3(View v){final NotificationCompat.Builder builder1=new NotificationCompat.Builder(this);//设置相关的属性builder1.setSmallIcon(R.mipmap.ic_launcher);//设置图标builder1.setContentTitle("更新中...");builder1.setContentText("正在由装逼模式更新至牛逼模式");builder1.setProgress(100,5,false);final   NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);nm.notify(NID_3,builder1.build());//模拟更新的线程new Thread(new Runnable() {@Overridepublic void run() {for(int progress=0;progress<=100;progress+=5){builder1.setProgress(100,progress,false);nm.notify(NID_3,builder1.build());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}builder1.setProgress(0,0,false);builder1.setContentText("更新完成,由于机主逼格不够,正在返回逗逼模式");nm.notify(NID_3,builder1.build());}}).start();}

测试效果如下


设置按钮4的点击事件(发送一个自定义视图的通知)

   public void sendNotification4(View v){final NotificationCompat.Builder builder1=new NotificationCompat.Builder(this);//设置相关的属性builder1.setSmallIcon(R.mipmap.ic_launcher);//设置图标builder1.setOngoing(true);//创建一个远程的视图RemoteViews views=new RemoteViews(getPackageName(),R.layout.custom_layout);views.setTextViewText(R.id.textView_song_name,"夜雨寄北");views.setTextViewText(R.id.button_play,"暂停");
//        views.setOnClickPendingIntent();//设置按钮的单击事件builder1.setContent(views);builder1.setTicker("霹雳音乐");NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);nm.notify(NID_4,builder1.build());}

新建一个视图custom_layout,代码如下

<?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"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:maxHeight="64dp"android:maxWidth="64dp"android:layout_weight="1"android:adjustViewBounds="true"app:srcCompat="@mipmap/ic_launcher_round" /><TextViewandroid:id="@+id/textView_song_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="歌曲名称..." /><Buttonandroid:id="@+id/button_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="播放" /><Buttonandroid:id="@+id/button2_next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下一首" />
</LinearLayout>

测试效果如下,由于虚拟机版本问题,所以这里图标没能显示出来

Style(样式)

通过在style文件中设置样式

 <style name="TextView_Style" ><item name="android:layout_width">wrap_content</item><item name="android:layout_height">wrap_content</item><item name="android:textColor">@android:color/holo_orange_light</item><item name="android:textSize">35sp</item><item name="android:background">@android:color/darker_gray</item></style><style name="TextView_Style.button">     //继承TextView_Style 样式<item name="android:textSize">50sp</item>

在组件中直接获取style中设置的样式

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="@android:color/holo_orange_light"android:textSize="35sp"android:background="@android:color/darker_gray" /><TextViewstyle="@style/TextView_Style"android:text="Hello World!"/><Buttonstyle="@style/TextView_Style.button" android:text="按钮" />

在Style文件中设置样式

 <style name="MyAppTheme"><item name="android:textColor">#F11B0C</item><item name="android:textSize">60sp</item></style>

在清单文件(AndroidManifest)中设置主题

   <activity android:name=".MainActivity"android:theme="@style/MyAppTheme"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>

在activity文件中放置一个组件,不设置主题拥有的样式

    <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="主题样式测试"/>

测试效果

自定义组件

在res/values文件夹下创建一个attrs.xml文件,代码如下

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="MyView"><attr name="textColor" format="color"></attr><attr name="textSize" format="dimension"></attr><attr name="text" format="string"></attr></declare-styleable>
</resources>

新建一个MyView.java文件,代码如下

public class MyView extends View {private int textColor;private float textSize;private String text;private Paint paint;//画笔public MyView(Context context) {super(context);}public MyView(Context context,AttributeSet attrs) {super(context, attrs);paint=new Paint();//获取配置文件中的属性值TypedArray array=context.obtainStyledAttributes(attrs,R.styleable.MyView);textColor=array.getColor(R.styleable.MyView_textColor,0xFFFFFF);textSize=array.getDimension(R.styleable.MyView_textSize,24);text=array.getString(R.styleable.MyView_text);}public MyView(Context context,AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}//视图的绘制事件方法@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setColor(textColor);paint.setTextSize(textSize);canvas.drawText(text,100,400,paint);}
}

在activity文件中设置组件,代码如下

<?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"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10sp"android:text="自定义组件"/><com.example.customview.MyViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:textColor="#ff0000"app:textSize="30sp"app:text="霹雳布袋戏"/></LinearLayout>

测试效果如下

ScrollView和listView组件嵌套使用冲突

activity代码如下

<?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"tools:context=".MainActivity"android:orientation="vertical">
<ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:entries="@array/names"></ListView><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="button"/></LinearLayout>
</ScrollView>
</LinearLayout>

strings文件代码如下

  <string-array name="names"><item>一页书</item><item>素还真</item><item>叶小钗</item><item>疏楼龙宿</item><item>剑子仙迹</item><item>赮毕钵罗</item><item>苍</item><item>萧中剑</item><item>佛剑分说</item><item>吞佛童子</item><item>一步莲华</item><item>策马天下</item><item>白马纵横</item><item>羽人非獍</item></string-array>

测试效果如下

listView只显示第一条数据

解决方案,自定义一个ListView组件
新建一个MyListView.java文件,代码如下

public class MyListView extends ListView {public MyListView(Context context) {super(context);}public MyListView(Context context, AttributeSet attrs) {super(context, attrs);}public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {heightMeasureSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}
}

将activity中的ListView组件改成我们自己定义的MyListView组件

 <com.example.customview.MyListViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:entries="@array/names"></com.example.customview.MyListView>

测试效果如下

android学习日记——高级组件3(PopupWindow,Notifcation,Style,Theme,自定义组件)相关推荐

  1. Android学习——UI高级组件三

    Android学习--UI高级组件三 PopupWindow(弹出式窗口) Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于:AlertDialog位置固 ...

  2. android学习日记 RecyclerView的简单使用

    android学习日记 RecyclerView的简单使用 文章目录 android学习日记 RecyclerView的简单使用 一.如何使用RecyclerView? 二.使用步骤 1.首先在bui ...

  3. Android学习日记 Notification 通知

    Android学习日记 Notification 通知 文章目录 Android学习日记 Notification 通知 前言 使用步骤 总结 前言 下拉状态栏显示的通知功能 使用步骤 代码如下: p ...

  4. 微信小程序 组件和slot_微信小程序自定义组件详解

    自定义组件能够帮我们更好的复用代码和重构简化代码复杂度.一起来学习一下小程序自定义组件的内容吧. 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程.所有自定义组件相关特性都需要基础库版 ...

  5. android学习日记一

    这几天在公司实习,公司主要是做android项目,以前在学校也学习过android,但是就学了点皮毛,在这里我准备把自己当做android一无所知的人,但是java会点的人,来系统的学习一下andro ...

  6. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  7. vue自定义组件是.vue还是html,Vue自定义组件的四种方式示例详解

    四种组件定义方式都存在以下共性(血泪史) 规则: 1.组件只能有一个根标签 2.记住两个词全局和局部 3.组件名称命名中'-小写字母'相当于大写英文字母(hello-com 相当于 helloCom) ...

  8. 【转】android学习日记01--综述

    转自:http://www.cnblogs.com/aiguozhe/p/3541941.html 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组 ...

  9. android学习日记16--GridView(网格视图)

    一.GridView 1.简述 GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局, 不过和TableLayout还是差别很大的,倒比较像二维的ListVi ...

  10. android学习日记12--布局管理器

    1.概述 布局管理器的用途: a.可以更好的管理组件; b.通过使用布局管理器,Android应用程序可以做到平台无关性 布局管理器都是ViewGroup的子类,所有可充当容器的父类都是ViewGro ...

最新文章

  1. 告诉你你也学不会!中台灵感 SuperCell 的管理之道!
  2. nyoj-66 分数拆分
  3. [深度学习] 自然语言处理---Transformer原理(一)
  4. Node的异步与java的异步_node.js和异步编程回文
  5. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
  6. Android之Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains
  7. MySQL数据库(六) 一一 基本操作之事物和索引
  8. linux内核调度算法(2)--CPU时间片如何分配
  9. python 同步event对象
  10. android 能否控制drawabletop的大小_V038小程序能否逐步完全取代APP?
  11. 数据库基础(4)函数依赖公理和推论(Armstrong公理),属性闭包和求候选键的技巧
  12. java mencoder_java 用ffmpeg和mencoder进行视频转码
  13. 系统分析师论文通用格式
  14. 易点易动助力企业年中固定资产盘点
  15. 针对2020年市面上短信供应商的对比(8家SMS供应商对比)
  16. Linux拨号上网后自动断开,Ubuntu 12.10 拨号上网及停用方法
  17. VMWare虚拟机启动img文件
  18. 数据可视化之美-动态图绘制【补充】(以Python为工具)
  19. 长假将至,携程滴滴都太老土了!俺们区块链的出行方式是酱紫的……
  20. 统计了300课时的代码,得到学Python需要掌握的1024个英语单词

热门文章

  1. Python正在慢慢褪色
  2. 9.2. switchport trunk encapsulation dot1q 提示 invaild input at^marker.
  3. 工作之余可以回味的经典
  4. 浅谈IPv4/IPv6地址转换技术-中科三方
  5. AutoCAD 系统变量
  6. 嵌入式软件开发基础问题
  7. Mybatis什么时候用resultMap,什么时候用resultType
  8. 计算机工程师对社会报答什么,报答作文400字(精选10篇)
  9. matlab2016环境变量,matlab环境变量path
  10. Android 9中实现应用开机自启动(前台服务的方式)