扣丁学堂笔记第07天高级UI组件(三)
2016-03-24 20:17
281 查看
1.PopupWindow
MainActivity
popupwindow_layout
2.Notifications_普通通知
MainActivity
现在的通知还不能点击,需定义一个pendingIntent,当点击通知时跳转到一个界面(Activity),然后发送意图
使用eclipse的话,别忘了在清单文件注册MainActivity2.java,否则点击通知无反应
MainActivity
MainActivity2
3.Notifications_大视图通知
通过调用Notification的InboxStyle()的方法得到一个Notification.InboxStyle对象的实例style,再调用style的setBigContentTitle()、addLine()等方法,再调用builder的setStyle方法吧style实例传进去。
MainActivity
4.Notifications_进度条通知
通过线程的方式来模拟更新
MainActivity
5.Notifications_自定义视图通知
custom_layout.xml预览图
MainActivity
6.样式和主题_Style
如果需要重复使用相同属性的组件,一个一个配置显得效率太低,可以使用自定义样式来解决属性的重复配置,style的xml位于values目录下
style.xml
activity_main.xml
7.样式和主题_Theme
8.自定义组件_实现步骤
9.自定义组件_ScrollView嵌套ListView、GridView的冲突
ScrollView中只能包含一个组件,所以需要一个LinearLayout容纳里面需要的组件
在ScrollView中添加一个足够item的ListView和足够的Button,模拟器显示ListView的item就会有丢失,为了解决冲突,需要新建一个MyListView继承自ListView,重写构造方法,还要添加onMeasure()方法
arrays.xml
activity_main.xml
MyListView.java
MainActivity
package com.example.popupwindowtest; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.PopupWindow; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void showClick(View view) { View v = getLayoutInflater().inflate(R.layout.popupwindow_layout, null); PopupWindow mPopupWindow = new PopupWindow(v, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); // mPopupWindow.getBackground().setAlpha(100); 这句会报空指针异常,表示不解 mPopupWindow.setBackgroundDrawable(getResources().getDrawable( android.R.drawable.alert_dark_frame)); mPopupWindow.setAnimationStyle(R.style.AppTheme); mPopupWindow.setOutsideTouchable(true); mPopupWindow.setTouchable(true); mPopupWindow.setFocusable(true); mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mPopupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0); } }
popupwindow_layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <Button android:id="@+id/edit_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="编辑" /> <Button android:id="@+id/delete_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="删除" /> </LinearLayout>
2.Notifications_普通通知
MainActivity
package com.example.notificationtest; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private static final int NID_1 = 0x1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void sendClick(View v) { Notification.Builder builder = new Notification.Builder(this); // 通知属性 builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentTitle("你有一条新消息"); builder.setContentText("生日快乐!"); // 创建一个通知 Notification n = builder.build(); // 创建一个通知管理器,发送通知 NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(NID_1, n); } }
现在的通知还不能点击,需定义一个pendingIntent,当点击通知时跳转到一个界面(Activity),然后发送意图
使用eclipse的话,别忘了在清单文件注册MainActivity2.java,否则点击通知无反应
MainActivity
package com.example.notificationtest; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { public static final int N_ID = 0x1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void sendClick1(View v){ Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentTitle("你有一条新消息"); builder.setContentText("爱安卓,爱生活!"); builder.setTicker("新消息"); Intent intent = new Intent(this,MainActivity2.class); intent.putExtra("msg", "你是猴子请来的逗比吗?"); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pi); Notification n = builder.build(); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(N_ID,n); } }
MainActivity2
package com.example.notificationtest; import android.app.Activity; import android.app.NotificationManager; import android.content.Context; import android.os.Bundle; import android.widget.TextView; public class MainActivity2 extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); TextView textView = (TextView) findViewById(R.id.tv); String msg = getIntent().getStringExtra("msg"); textView.setText(msg); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.cancel(MainActivity.N_ID); } }
3.Notifications_大视图通知
通过调用Notification的InboxStyle()的方法得到一个Notification.InboxStyle对象的实例style,再调用style的setBigContentTitle()、addLine()等方法,再调用builder的setStyle方法吧style实例传进去。
MainActivity
public void sendClick2(View v){ Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentTitle("你有大视图新消息"); // sbuilder.setContentText("爱安卓,爱生活!"); builder.setTicker("新消息"); Notification.InboxStyle style = new Notification.InboxStyle(); style.setBigContentTitle("吟诗作对"); style.addLine("长亭外"); style.addLine("古道边"); style.addLine("一行白鹭上青天"); builder.setStyle(style); Notification n = builder.build(); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(N_ID2, n); }
4.Notifications_进度条通知
通过线程的方式来模拟更新
MainActivity
public void sendClick3(View v){ final Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentTitle("更新中"); builder.setContentText("正在由装逼模式更新至牛逼模式……"); builder.setProgress(100, 5, false); final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(N_ID3,builder.build()); new Thread(new Runnable() { public void run() { for(int progress=0;progress<=100;progress+=5){ builder.setProgress(100, progress, false); nm.notify(N_ID3, builder.build()); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } builder.setContentText("由于机主逼格不够,更新失败,返回逗逼模式"); nm.notify(N_ID3, builder.build()); } }).start(); }
5.Notifications_自定义视图通知
custom_layout.xml预览图
MainActivity
public void sendClick4(View v){ Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher); builder.setTicker("音乐播放器"); RemoteViews views = new RemoteViews(getPackageName(), R.layout.custom_layout); views.setTextViewText(R.id.button_play, "暂停"); views.setTextViewText(R.id.textView_song, "名为你的那个人"); builder.setContent(views); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(N_ID4, builder.build()); }
6.样式和主题_Style
如果需要重复使用相同属性的组件,一个一个配置显得效率太低,可以使用自定义样式来解决属性的重复配置,style的xml位于values目录下
style.xml
<style name="TextViewStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textSize">35sp</item> <item name="android:background">#ff0000</item> </style> <style name="TextViewStyle.Button"> <item name="android:alpha">100</item> </style>
activity_main.xml
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="35sp" android:background="#ff0000" android:text="@string/hello_world" /> <TextView style="@style/TextViewStyle" android:text="@string/hello_world"/> <Button style="@style/TextViewStyle.Button"/>
7.样式和主题_Theme
8.自定义组件_实现步骤
9.自定义组件_ScrollView嵌套ListView、GridView的冲突
ScrollView中只能包含一个组件,所以需要一个LinearLayout容纳里面需要的组件
在ScrollView中添加一个足够item的ListView和足够的Button,模拟器显示ListView的item就会有丢失,为了解决冲突,需要新建一个MyListView继承自ListView,重写构造方法,还要添加onMeasure()方法
arrays.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="name"> <item>安卓1</item> <item>安卓2</item> <item>安卓3</item> <item>安卓4</item> <item>安卓5</item> <item>安卓6</item> <item>安卓7</item> <item>安卓8</item> <item>安卓9</item> <item>安卓10</item> </string-array> </resources>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.scrollviewlistviewtest.MainActivity" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <com.example.scrollviewlistviewtest.MyListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="38dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:entries="@array/name"> </com.example.scrollviewlistviewtest.MyListView> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> </ScrollView> </LinearLayout>
MyListView.java
package com.example.scrollviewlistviewtest; import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; public class MyListView extends ListView { public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyListView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
相关文章推荐
- 看慕课网节日短信祝福UI自我总结实现过程
- 【UVA11538】Chess Queen——简单组合
- UIKit框架各个类的简介
- DuiLib介绍及其消息处理剖析
- Can you answer these queries?(线段树)
- codeforces 597C C. Subsequences(dp+树状数组)
- LeetCode: Longest Consecutive Sequence [128]
- Castle Windsor Fluent Registration API
- collection系列用法-deque双向队列
- android学习——res/values/contentDescription报错
- juery中循环遍历json数组
- UIKeyboardTypeNumberPad 数字键盘自定义按键
- 来段代码提提神-Java读取config.properties文件中的key=value
- requirejs模块化框架用法分享
- request.getparam()与request.getAttibute()的区别
- 获取 当前显示的 UIViewController
- 在Android studio中进行单元测试和ui测试
- WM_CLOSE、WM_DESTROY、WM_QUIT学习总结(点击关闭按钮会触发WM_CLOSE消息,DestroyWindow API会触发WM_DESTROY和WM_NCDESTROY消息,MSDN上写的很清楚)
- hierarchy viewer不能获取userbuild手机版本的UI布局
- UIAutomator遇到的坑