Android 开发教程 & 笔记 1
多式样 ProgressBar 撰写 : 地狱怒兽 联系 :zyf19870302@126.com 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了 <ProgressBar android:id="@+id/widget43" android:layout_width="wrap_content" android:layout_gravity="center_vertical"> </ProgressBar> 此时, 没有设置它的风格, 那么它就是圆形的, 一直会旋转的进度条 各大小样式圆形 ProgressBar 超大号圆形 ProgressBar 此时, 给设置一个 style 风格属性后, 该 ProgressBar 就有了一个风格, 这里大号 ProgressBar 的风格是 : style="?android:attr/progressbarstylelarge" 2
完整 XML 定义是 : <ProgressBar android:id="@+id/widget196" android:layout_width="wrap_content" style="?android:attr/progressbarstylelarge"> </ProgressBar> 小号圆形 ProgressBar 小号 ProgressBar 对应的风格是 : style="?android:attr/progressbarstylesmall" 完整 XML 定义是 : <ProgressBar android:id="@+id/widget108" android:layout_width="wrap_content" style="?android:attr/progressbarstylesmall"> </ProgressBar> 标题型圆形 ProgressBar 标题型 ProgressBar 对应的风格是 : style="?android:attr/progressbarstylesmalltitle" 完整 XML 定义是 : <ProgressBar android:id="@+id/widget110" android:layout_width="wrap_content" style="?android:attr/progressbarstylesmalltitle"> </ProgressBar> 3
代码中实现 : @Override protected void oncreate(bundle savedinstancestate) { // TODO Auto-generated method stub super.oncreate(savedinstancestate); requestwindowfeature(window.feature_indeterminate_progress); // 请求窗口特色风格, 这里设置成不明确的进度风格 setcontentview(r.layout.second); setprogressbarindeterminatevisibility(true); // 设置标题栏中的不明确的进度条是否可以显示 长形进度条 布局中的长形进度条 1 首先在 XML 进行布局 <ProgressBar android:id="@+id/progressbar_updown" android:layout_width="200dp" style="?android:attr/progressbarstylehorizontal" android:layout_gravity="center_vertical" android:max="100" android:progress="50" android:secondaryprogress="70" > 讲解 : style="?android:attr/progressbarstylehorizontal" 设置风格为长形 android:max="100" 最大进度值为 100 android:progress="50" 初始化的进度值 android:secondaryprogress="70" 初始化的底层第二个进度值 android:layout_gravity="center_vertical" 垂直居中 2 代码中运用 private ProgressBar myprogressbar; // 定义 ProgressBar myprogressbar = (ProgressBar) findviewbyid(r.id.progressbar_updown); 4
//ProgressBar 通过 ID 来从 XML 中获取 myprogressbar.incrementprogressby(5); //ProgressBar 进度值增加 5 myprogressbar.incrementprogressby(-5); //ProgressBar 进度值减少 5 myprogressbar.incrementsecondaryprogressby(5); //ProgressBar 背后的第二个进度条进度值增加 5 myprogressbar.incrementsecondaryprogressby(-5); //ProgressBar 背后的第二个进度条进度值减少 5 页面标题中的长形进度条 代码实现 : 1 先设置一下窗口风格特性 requestwindowfeature(window.feature_progress); // 请求一个窗口进度条特性风格 setcontentview(r.layout.main); setprogressbarvisibility(true); // 设置进度条可视 2 然后设置进度值 setprogress(myprogressbar.getprogress() * 100); // 设置标题栏中前景的一个进度条进度值 setsecondaryprogress(myprogressbar.getsecondaryprogress() * 100); // 设置标题栏中后面的一个进度条进度值 //ProgressBar.getSecondaryProgress() 是用来获取其他进度条的进度值 5
ProgressDialog ProgressDialog 中的圆形进度条 ProgressDialog 一般用来表示一个系统任务或是开启任务时候的进度, 有一种稍等的意思 代码实现 : ProgressDialog mypdialog=new ProgressDialog(this); // 实例化 mypdialog.setprogressstyle(progressdialog.style_spinner); // 设置进度条风格, 风格为圆形, 旋转的 mypdialog.settitle("google"); // 设置 ProgressDialog 标题 mypdialog.setmessage(getresources().getstring(r.string.second)); // 设置 ProgressDialog 提示信息 mypdialog.seticon(r.drawable.android); // 设置 ProgressDialog 标题图标 mypdialog.setbutton("google",this); // 设置 ProgressDialog 的一个 Button mypdialog.setindeterminate(false); // 设置 ProgressDialog 的进度条是否不明确 mypdialog.setcancelable(true); // 设置 ProgressDialog 是否可以按退回按键取消 mypdialog.show(); // 让 ProgressDialog 显示 6
ProgressDialog 中的长形进度条 代码实现 : ProgressDialog mypdialog=new ProgressDialog(this); // 实例化 mypdialog.setprogressstyle(progressdialog.style_horizontal); // 设置进度条风格, 风格为长形, 有刻度的 mypdialog.settitle(" 地狱怒兽 "); // 设置 ProgressDialog 标题 mypdialog.setmessage(getresources().getstring(r.string.second)); // 设置 ProgressDialog 提示信息 mypdialog.seticon(r.drawable.android); // 设置 ProgressDialog 标题图标 mypdialog.setprogress(59); // 设置 ProgressDialog 进度条进度 mypdialog.setbutton(" 地狱曙光 ",this); // 设置 ProgressDialog 的一个 Button mypdialog.setindeterminate(false); // 设置 ProgressDialog 的进度条是否不明确 mypdialog.setcancelable(true); // 设置 ProgressDialog 是否可以按退回按键取消 mypdialog.show(); // 让 ProgressDialog 显示 7
AlertDialog.Builder AlertDialog 中的圆形 ProgressBar 1 先来设计一个 Layout, 待会儿作为一个 View, 加入 AlertDialog.Builder <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" > <LinearLayout android:id="@+id/linearlayout01" android:layout_width="wrap_content" > </LinearLayout> <ProgressBar android:layout_gravity="center_vertical center_horizontal" android:progress="57" android:id="@+id/myview_progressbar2" android:layout_width="wrap_content"> 8
</ProgressBar> </LinearLayout> 2 代码罗 private AlertDialog.Builder AlterD,AlterD2; // 定义提示对话框 private LayoutInflater layoutinflater; // 定义布局过滤器 private LinearLayout mylayout; // 定义布局 layoutinflater2=(layoutinflater) getsystemservice(this.layout_inflater_service); // 获得系统的布局过滤服务 mylayout2=(linearlayout) layoutinflater2.inflate(r.layout.roundprogress, null); // 得到事先设计好的布局 AlterD2.setTitle(getResources().getString(R.string.RoundO)); // 设置对话框标题 AlterD2.setIcon(R.drawable.ma); // 设置对话框图标 AlterD2.setMessage(getResources().getString(R.string.ADDView)); // 设置对话框提示信息 AlterD2.setView(myLayout2); // 设置对话框中的 View AlterD2.show(); // 让对话框显示 9
AlertDialog 中的长形 ProgressBar( 可控制 ) 1 先来设计一个 Layout, 待会儿作为一个 View, 加入 AlertDialog.Builder <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" > <Button android:text="-" android:layout_width="50dp" android:id="@+id/myview_bt_down"> </Button> <ProgressBar android:layout_gravity="center_vertical" style="?android:attr/progressbarstylehorizontal" 10
android:id="@+id/myview_progressbar" android:progress="57" android:layout_width="178dp"> </ProgressBar> <Button android:text="+" android:layout_width="50dp" android:id="@+id/myview_bt_up"> </Button> </LinearLayout> 2 代码罗 private AlertDialog.Builder AlterD,AlterD2; // 定义提示对话框 private LayoutInflater layoutinflater; // 定义布局过滤器 private LinearLayout mylayout; // 定义布局 layoutinflater=(layoutinflater) getsystemservice(this.layout_inflater_service); // 获得系统的布局过滤服务 mylayout=(linearlayout) layoutinflater.inflate(r.layout.myview, null); // 得到事先设计好的布局 myup=(button) mylayout.findviewbyid(r.id.myview_bt_up); mydown=(button) mylayout.findviewbyid(r.id.myview_bt_down); mypro=(progressbar)mylayout.findviewbyid(r.id.myview_progressbar); // 通过 mylayout.findviewbyid 来获取自定义 View 中的 Widget 控件元素 myup.setonclicklistener(this); // 设置对话框 View 中的按钮监听器 mydown.setonclicklistener(this); // 设置对话框 View 中的按钮监听器 mypro.setprogress(tag); // 设置一个 Tag 作为进度值 AlterD.setTitle(getResources().getString(R.string.RectO)); // 设置对话框标题 AlterD.setIcon(R.drawable.mb); // 设置对话框图标 AlterD.setMessage(getResources().getString(R.string.ADDView)); // 设置对话框提示信息 AlterD.setView(myLayout); // 设置对话框添加的 View AlterD.setPositiveButton("OK", new DialogInterface.OnClickListener(){ 11
@Override public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub MyProgressBar.Tag=mypro.getProgress(); ); // 设置对话框按钮, 以及按钮的事件监听器 AlterD.show(); // 让对话框显示 3 进度条进度值的按钮事件 myup.setonclicklistener(this); // 设置对话框 View 中的按钮监听器 mydown.setonclicklistener(this); // 设置对话框 View 中的按钮监听器对应的代码 : @Override public void onclick(view button) { // TODO Auto-generated method stub SwitchUPorDown(button); private void SwitchUPorDown(View button) { switch (button.getid()) { case R.id.myView_BT_Up: { mypro.incrementprogressby(1); break; case R.id.myView_BT_Down: { mypro.incrementprogressby(-1); default: break; break; 12
App Widget 中的进度条 Widget 中的圆形 ProgressBar 这个很简单, 在 Widget 中没有多大意思, 不再敷述 Widget 中的长形 ProgressBar( 可控制 ) Widget 的实现就不再重复, 假设您已经把 Widget 布局, 相应设置已经设置好了 也可以在 桌面加入类似上面图中的样式 现在我们来实现一下按钮事件, 与进度条的交互 下面还是简单讲解一下 Widget 的设计与部署 13
1 设计 Widget 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/widget" android:layout_height="74dp" android:layout_width="296dp"> <Button android:text="-" android:layout_gravity="center_vertical" android:layout_width="50dp" android:id="@+id/widget_bt_down" android:layout_marginleft="10dp"> </Button> <ProgressBar android:layout_gravity="center_vertical" style="?android:attr/progressbarstylehorizontal" android:layout_width="178dp" android:id="@+id/widget_progressbar"> </ProgressBar> <Button android:text="+" android:layout_gravity="center_vertical" android:layout_width="50dp" android:id="@+id/widget_bt_up"> </Button> </LinearLayout> 2 新增一个.res/xml 目录, 加入 appwidget-provider <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initiallayout="@layout/widgetlayout" android:updateperiodmillis="8660000" android:minwidth="296dp" android:minheight="74dp"> </appwidget-provider> 14
3 实现一个 AppWidgetProvider 子类 package zyf.test.progressbar; import android.appwidget.appwidgetmanager; import android.appwidget.appwidgetprovider; import android.content.context; import android.content.intent; public class App extends AppWidgetProvider { @Override public void onenabled(context context) { // TODO Auto-generated method stub super.onenabled(context); @Override public void onreceive(context context, Intent intent) { // TODO Auto-generated method stub super.onreceive(context, intent); @Override public void onupdate(context context, AppWidgetManager appwidgetmanager, int[] appwidgetids) { // TODO Auto-generated method stub super.onupdate(context, appwidgetmanager, appwidgetids); 4 配置 Manifest, 进行注册 <receiver android:name="appwidget"> <intent-filter> <action android:name="android.appwidget.action.appwidget_update"></action> </intent-filter> <meta-data </meta-data> </receiver> android:resource="@xml/appwidget" android:name="android.appwidget.provider"> 15
这里实现按钮与进度条的交互 (Widget 自己广播发送与接收 ) 1 按钮的消息发送 @Override public void onupdate(context context, AppWidgetManager appwidgetmanager, int[] appwidgetids) { // TODO Auto-generated method stub final int N = appwidgetids.length; // Perform this loop procedure for each App Widget that belongs to this provider for (int i=0; i<n; i++) { int appwidgetid = appwidgetids[i]; RemoteViews views= new RemoteViews(context.getPackageName(), R.layout.widgetlayout); Intent UPintent=new Intent("zyf.test.widget.UP"); Intent DOWNintent=new Intent("zyf.test.widget.DOWN"); // 实例化两个带有 Action 的 Intent PendingIntent pendingintentup =PendingIntent.getBroadcast(context, 0, UPintent, 0); PendingIntent pendingintentdown =PendingIntent.getBroadcast(context, 0, DOWNintent, 0); // 实例化两个以 Intent 来构造的 PendingIntent views.setonclickpendingintent(r.id.widget_bt_up, pendingintentup); views.setonclickpendingintent(r.id.widget_bt_down, pendingintentdown); // 给 View 上的两个按钮绑定事件, 这里是广播消息的发送 appwidgetmanager.updateappwidget(appwidgetid, views); 2 Widget 自身消息接收, 使用 intent.getaction() 来获取 Action @Override public void onreceive(context context, Intent intent) { // TODO Auto-generated method stub super.onreceive(context, intent); if(intent.getaction().equals("zyf.test.widget.up")){ Tag+=5; if(tag>100){ Tag=100; views.setprogressbar(r.id.widget_progressbar, 100, Tag, false); appmanager.updateappwidget(thiswidget, views); 16
if(intent.getaction().equals("zyf.test.widget.down")){ Tag-=5; if(tag<0){ Tag=0; views.setprogressbar(r.id.widget_progressbar, 100, Tag, false); appmanager.updateappwidget(thiswidget, views); 3 进度条的进度值设置 views.setprogressbar(r.id.widget_progressbar, 100, Tag, false); // 设置 Widget 上的进度条的进度值 // 第一个参数,Widget 上进度条 ID // 第二个参数, 进度条最大值 // 第三个参数 Tag, 一个 int 值, 就是设置的进度值 // 第四个参数, 是否是要进度条不确定 注意了,Widget 自身的 onreceive() 方法如果要接收其他的 Action 广播 那就必须在 Manifest 中, 在 Intent-filter 中添加 Action: <receiver android:name="appwidget"> <intent-filter> <action android:name="android.appwidget.action.appwidget_update"></action> <action android:name="zyf.test.widget.up"></action> <action android:name="zyf.test.widget.down"></action> </intent-filter> <meta-data </meta-data> </receiver> android:resource="@xml/appwidget" android:name="android.appwidget.provider"> 如有什么问题和不对地方, 请联系我 :zyf19870302@126.com ( 地狱怒兽 ) 17
18