[Android API学习]AppWidget
- 格式:doc
- 大小:50.50 KB
- 文档页数:6
一、实验目的通过本次实验,掌握安卓常用控件的基本属性、方法和事件处理,熟悉这些控件在实际应用中的使用方法,提高对安卓界面设计的理解和应用能力。
二、实验环境1. 操作系统:Windows 102. 开发工具:Android Studio3.5.33. 手机型号:华为Mate 20三、实验内容本次实验主要涉及以下安卓常用控件:1. TextView2. EditText3. Button4. ImageView5. RadioButton6. CheckBox7. Spinner8. ListView四、实验步骤1. 创建一个新的Android项目,命名为“ControlOperation”。
2. 在布局文件activity_main.xml中添加以下控件:```xml<TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="Hello World!"android:layout_marginTop="20dp" /><EditTextandroid:id="@+id/editText1"android:layout_width="match_parent"android:layout_height="wrap_content" android:hint="Enter your name" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="Click Me!" /><ImageViewandroid:id="@+id/imageView1"android:layout_width="wrap_content"android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <RadioButtonandroid:id="@+id/radioButton1"android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="Male" /><CheckBoxandroid:id="@+id/checkbox1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Subscribe to newsletter" /><Spinnerandroid:id="@+id/spinner1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:entries="@array/countries" /><ListViewandroid:id="@+id/listView1"android:layout_width="match_parent"android:layout_height="wrap_content" />```3. 在strings.xml文件中添加以下字符串资源:```xml<string name="app_name">Control Operation</string> <string name="enter_name">Enter your name</string> <string name="click_me">Click Me!</string><string-array name="countries"><item>China</item><item>USA</item><item>Japan</item></string-array>```4. 在MainActivity.java文件中添加以下代码:```javaimport android.os.Bundle;import android.view.View;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.ScrollView;import android.widget.TextView;import android.widget.CheckBox;import android.widget.Spinner;import android.widget.ListView;import android.widget.ArrayAdapter;import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private TextView textView1;private EditText editText1;private Button button1;private ImageView imageView1;private RadioButton radioButton1;private CheckBox checkBox1;private Spinner spinner1;private ListView listView1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);textView1 = findViewById(R.id.textView1);editText1 = findViewById(R.id.editText1);button1 = findViewById(R.id.button1);imageView1 = findViewById(R.id.imageView1);radioButton1 = findViewById(R.id.radioButton1);checkBox1 = findViewById(R.id.checkbox1);spinner1 = findViewById(R.id.spinner1);listView1 = findViewById(R.id.listView1);ArrayAdapter<CharSequence> adapter =ArrayAdapter.createFromResource(this,R.array.countries, yout.simple_spinner_item);adapter.setDropDownViewResource(yout.simple_spinner_dropdown _item);spinner1.setAdapter(adapter);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String name = editText1.getText().toString();Toast.makeText(MainActivity.this, "Hello " + name, Toast.LENGTH_SHORT).show();}});radioButton1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "You selected Male", Toast.LENGTH_SHORT).show();}});checkBox1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (checkBox1.isChecked()) {Toast.makeText(MainActivity.this, "You subscribed to the newsletter", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "You unsubscribed from the newsletter", Toast.LENGTH_SHORT).show();}}});}}```5. 运行程序,观察效果。
Android开发⾃学笔记(AndroidStudio)—4.1布局组件⼀、引⾔Android的界⾯是有布局和组件协同完成的,布局好⽐是建筑⾥的框架,⽽组件则相当于建筑⾥的砖⽡。
组件按照布局的要求依次排列,就组成了⽤户所看见的界⾯。
在Android4.0之前,我们通常说Android开发五⼤布局和四⼤组件,这五⼤布局就是:1. LinearLayout 线性布局2. FrameLayout 单帧布局,也有中⽂翻译为帧布局、框架布局。
3. RelativeLayout 相对布局4. AbsoluteLayout 绝对布局5. TableLayout 表格布局⽽在Android4.0之后⼜新增了⼀种GridLayout⽹格布局。
⼆、LinearLayout线性布局线性布局是Android开发中最常见的⼀种布局⽅式,它是按照垂直或者⽔平⽅向来布局,通过“android:orientation”属性可以设置线性布局的⽅向。
属性值有垂直(vertical)和⽔平(horizontal)两种。
线性布局的排列在某⾏或者某列并不会⾃动换⾏或换列,就是说如果采⽤⽔平布局,控件宽度超过屏幕显⽰的话,后⾯的控件都将被隐藏,不会⾃动换⾏。
常⽤的属性有:1. android:orientation:可以设置布局的⽅向2. android:id - 为控件指定相应的ID3. android:text - 指定控件当中显⽰的⽂字,需要注意的是,这⾥尽量使⽤string.xml4. android:gravity - 指定控件的基本位置,⽐如说居中,居右等位置5. android:textSize - 指定控件当中字体的⼤⼩6. android:background - 指定控件所⽤的背景⾊,RGB命名法7. android:layout_width - 指定控件的宽度8. android:layout_height - 指定控件的⾼度9. android:layout_weight - 指定控件的占⽤⽐例10. android:padding - 指定控件的内边距,也就是说控件当中的内容11. android:sigleLine - 如果设置为真的话,则将控件的内容显⽰在⼀⾏当中layout_weight属性以控制各个控件在布局中的相对⼤⼩。
Android开发基础(习题卷1)第1部分:单项选择题,共71题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]关于res/raw目录说法正确的是( )A)这里的文件是原封不动的存储到设备上不会转变为二进制的格式B)这里的文件是原封不动的存储到设备上会转变为二进制的格式C)这里的文件最终以二进制的格式存储到指定的包中D)这里的文件最终不会已二进制的格式存储到指定的包中答案:A解析:2.[单选题]下列代码输出的结果是:( )int i = 0;i = ++i + 8;Console.WriteLine(i++);A)8B)9C)10D)编译出现语法错误,不能运行答案:B解析:i = ++i + 8; 结果为9i++是先输出后加,所以为93.[单选题]查询手机系统短信时,内容提供者对应的 Uri 为( )。
A)Contacts.Photos.CONTENT_URIB)Contacts.People.CONTENT_URIC)"content://sms/"D)Media.EXTERNAL_CONTENT_URI答案:C解析:4.[单选题]在多个应用中读取共享存储数据时,需要用到的query 方法,是哪个对象的方法( )A)ContentResolverB)ContentProviderC)CursorD)SQLiteHelper答案:A解析:5.[单选题]以下哪个不是应用间交互常用的方法? ()A)接收Broadcast 的消息B)文件共享访问C)通过Content Resolver 接口访问D)Activity 的调用6.[单选题]下面关于广播叙述错误的是( )A)广播是Android 四大组件之一B)BroadcastReceiver 有两种注册方式,静态注册和动态注册C)静态注册需要在Mainfest.xml 中配置D)动态注册需要在应用退出时候接触广播的注册。
答案:A解析:7.[单选题]若要实现对系统联系人的增删改查,需要使用的系统ContentProvider的Uri为( )。
Android控件AppWidgetProvider使⽤⽅法详解介绍AppWidgetProvider是Android中提供的⽤于实现桌⾯⼩⼯具的类,其本质是⼀个⼴播,即BroadcastReceiver,在实际的使⽤中,把AppWidgetProvider当成⼀个BroadcastReceiver即可1. 为AppWidget提供⼀个⽂件定义⼩控件的基本配置信息在资源⽂件夹res⽬录下新建xml⽂件夹,添加app_widget_provider_info.xml⽂件内容为:<?xml version="1.0" encoding="utf-8"?><!--⼩控件宽⾼--><!--android:minWidth="40dp"--><!--android:minHeight="40dp"--><!--更新时间--><!--android:updatePeriodMillis="86400000"--><!--⽤于指定预览图⽚。
即搜索到widget时,查看到的图⽚。
若没有设置的话,系统为指定⼀张默认图⽚。
--><!--android:previewImage="@drawable/widget_flashlight"--><!--widget 添加到⼿机主屏幕中的layout--><!--android:initialLayout="@layout/flash_light_widget"--><!--android:resizeMode : widget可以被拉伸的⽅向。
horizontal表⽰可以⽔平拉伸,vertical表⽰可以竖直拉伸--><!--android:resizeMode="horizontal|vertical"--><appwidget-provider xmlns:android="/apk/res/android"android:minWidth="40dp"android:minHeight="40dp"android:updatePeriodMillis="86400000"android:previewImage="@drawable/ic_launcher"android:initialLayout="@layout/widget_layout"android:resizeMode="horizontal|vertical"></appwidget-provider>2. 创建⼀个WidgetProvider继承⾃AppWidgetProvider;public class MyAppWidgetProvider extends AppWidgetProvider {//没接收⼀次⼴播消息就调⽤⼀次,使⽤频繁public void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}//每次更新都调⽤⼀次该⽅法,使⽤频繁public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);}//没删除⼀个就调⽤⼀次public void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}//当该Widget第⼀次添加到桌⾯是调⽤该⽅法,可添加多次但只第⼀次调⽤public void onEnabled(Context context) {super.onEnabled(context);}//当最后⼀个该Widget删除是调⽤该⽅法,注意是最后⼀个public void onDisabled(Context context) {super.onDisabled(context);}}3. 为 WidgetProvider创建⼀个布局⽂件布局为常见布局<RelativeLayout xmlns:android="/apk/res/android"android:layout_width="64dp"android:layout_height="64dp"><ImageButtonandroid:id="@+id/widget_led"android:layout_margin="2dp"android:background="@drawable/widget_led"android:src="@drawable/ic_launcher"android:scaleType="center"android:layout_width="64.0dip"android:layout_height="64.0dip" /></RelativeLayout>4. 注册Manifest.xml配置基本和⼴播⼀样,使⽤receiver 节点,meta-data 节点的name 为固定格式,resource为第⼀步定义的配置信息,intent-filter 节点第三个action必须提供<receiver android:name=".jf.jfclean.widget.FlashLightWidget"><intent-filter><action android:name="action_led_on" /><action android:name="action_led_off" /><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/flash_light_widget_info" /></receiver>5. 使⽤PendingIntent和RemoteViews对AppWidget绑定监听器,使⽤RemoteViews在MyAppWidgetProvider的onUpdate()⽅法中为Botton绑定监听器以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
自测试卷1一、选择题1.Google于()正式发布的Android平台。
A.2007年11月5日B.2008年11月5日C.2007年1月10日D.2009年4月30日2.下面关于Android SDK描述错误的是()。
A.Android SDK是Android开发工具包B.包含了模拟器、API文档、示例代码等内容C.在Android的官方网站中可以下载到D.包含了Java程序开发所需要的编译、调试工具3.创建Android项目时,下面的包名错误的是()。
A.com.minrisoft B.com.mingrisoft.01 C. D.com.mr_014.输出错误日志信息使用Log类的()方法。
A.d B.e C.w D.i5.在XML布局文件中,定义网格布局管理器可以使用()标记。
A.<GridView> B.<TableLayout> C.<GridLayout> D.<TableRow>6.()对象用于保存要携带的数据包。
A.Bundle B.Map C.Intent D.Activity7.下列关于线程描述错误的是()。
A.在一个线程中,可以有多个HandlerB.在一个线程中,只能有一个MessageQueueC.在一个线程中,只能有一个LooperD.在一个线程中,只能有一个Looper、MessageQueue和Handle8.Cursor类提供的()方法用于将指针移动到下一条记录上。
A.moveToPosition() B.moveToPrevious() C.moveToFirst() D.moveToNext()9.在配置Widget时,通过调用setResult()方法可以实现设置Activity的返回码。
当返回码为()表示Widget设置成功。
A.200 B.RESULT_SUCCESS C.RESULT_OK D.RESULT_CANCELED10.下面的代码用于实现创建绘图画布功能,请问空白处应该填入()。
Android —— TextView一、TextView的API 1.1 结构 ng.Object ↳ android.view.View ↳android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextView, CheckBox, CompoundButton, ExtractEditText,MultiAutoCompleteTextView, RadioButton, ToggleButton 1.2 API属性名称描述android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。
可选值(none/web/email/phone/map/all)android:autoText 如果设置,将自动执行输入值的拼写纠正。
此处无效果,在显示输入法并输入的时候起作用。
android:bufferType 指定getText()方式取得的文本类别。
选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。
spannable 则可在给定的字符区域使用样式,参见这里1、这里2。
android:capitalize 设置英文字母大写类型。
此处无效果,需要弹出输入法才能看得到,参见EditText此属性说明。
android:cursorVisible设定光标为显示/隐藏,默认显示。
android:digits设置允许输入哪些字符。
如“1234567890.+-*/%\n()”android:drawableBottom 在text的下方输出一个drawable,如图片。
如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。
App Widget的更新方法介绍Widget是一种小巧但是功能强大的程序,使用户能够方便快捷的获取信息,在PC上被广泛的使用,现在随着OPhone的推出,widget也进入到了手机领域,为用户带来了方便的同时也为开发者实现更多很酷想法的可能。
在OPhone中有两种 widget开发方式,一种是以HTML+CSS+JavaScript的开发方式,另一种是沿用Android平台的开发方式,本文介绍的是后面一种,在OPhone平台上开发App widget。
widget一般开发方式介绍下面以编写一个时钟的小程序来介绍如何编写widget。
(1)创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider类中有许多的方法,例如 onDelete(Context, int[]),onEnable(Context)等等,一般情况下我们纸需要重写onUpdate(Context, AppWidgetManager, int[])这个方法就可以了,这个方法是当触发器更新widget时候执行的操作。
(2)在项目的AndroidMenifest.xml文件中添加一个receiver标签,让其指向前面创建的AppWidgetProvider子类,内容如下:1.<receiver android:name="widget"2. android:label="@string/app_name"3. android:icon="@drawable/icon">4. <intent-filter>5. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />6. </intent-filter>7. <meta-data android:name="android.appwidget.provider"8. android:resource="@xml/widget_setting" />9. </receiver>intent-filter中过滤了APPWIDGET_UPDATE事件,这个事件是由系统触发的更新事件,每个widget必须包含这个事件;meta-data标签描述的是widget的配置文件指向,该文件描述了widget的一些基本信息。
学习安卓心得体会Android学习心得这学期,我们新开了一门课程——android的研发。
在老师们的介绍下,我们了解android的开发环境以及控件的功能。
刚开始接触Android觉得既陌生又亲切,陌生在于没有学过具体的开发软件,亲切在于它在界面开发上和web也可以形成了相通的架构,更加方便。
一、Android简介Android一词的本义指“机器人“,同时也是Google 于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。
目前,最新版本为Android 2.4 Gingerbread和Android 3.0 Honeycomb。
Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
Android 早期由原名为Android的公司开发,谷歌在2005年收购Android.Inc后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。
底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。
2011年初数据显示,仅正式上市两年的操作系统Android 已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。
现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。
采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。
二、Androi前景市场上:现在2.2技术应该已经成型了,但是目前产品是2.2的貌似不是很多,在嵌入式的角度来说,前景应该不错,手机领域就不用说了,汽车导航,电子消耗品,它的界面我认为远比塞班要好,而且,开放软件是个趋势,这样,系统的市场占有率才能高,支持的软件多,自然生命周期,效益比率都高。
其实Android API开发指南中的App Widgets章节已经说得很清楚了,下面只是对自己的理解进行一次梳理。
--
AppWidget就是HomeScreen上显示的小部件,提供直观的交互操作。
通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。
同一个Widget部件可以同时创建多个。
AppWidget的实现主要涉及到以下类:
AppWidgetProvider
RemoteViews
AppWidgetManager
1.
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。
PS:这就导致有一些功能或样式无法实现,如很基本的list或文本编辑框都是无法直接实现的。
如果想自定义Widget中的View的话只能通过修改framework来提供相应组件的支持。
2.
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。
如果使用的是Eclipse可按如下操作:
1) 在res/目录下创建xml/目录
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider
3)在弹出的便捷界面进行参数设置
主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)
*Widget大小的计算:(单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白
一个完整的样例:
Xml代码
3.
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个BroadcastReceiver,里面提供了以下函数:
onReceive(Context, Intent)
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)
onEnabled(Context)
onDeleted(Context, int[] appWidgetIds)
onDisabled(Context)
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。
以上函数具体调用情况归纳如下:
[启动- 无confiure Activity]
onReceive
onEnabled ——第一个widget被显示
onReceive
onUpdate ——刷新界面
[启动- 带confiuration Activity]
onReceive
onUpdate
[拖动]
<无状态变化>
[周期更新]
onReceive
onUpdate
[删除]
onReceive
onDeleted —— widget被删除
onReceive
onDisabled ——最后一个widget被移除
[启动时位置不够]
onReceive
onEnabled
onReceive
onUpdate
onReceive
onDeleted
onReceive
onDisabled
*每次状态的变化会触发onReceive,一般该函数是不需要重写的。
简单了解AppWidgetProvider之后,我们来看具体实现。
这里创建一个MyAppWidgetProvider继承AppWidgetProvider: Java代码
其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。
具体实现如下:Java代码
其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。
具体可参考AppWidget RemoteViews 内存溢出。
其他函数的可以根据需要实现。
由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有:
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
setProgressBar(int viewId, int max, int progress, boolean indeterminate)
setTextViewText(int viewId, CharSequence text)
setViewVisibility(int viewId, int visibility)
详细函数列表可参考API中的RemoteViews类。
4.
最后,更新AndroidManifest.xml。
AppWidgetProvider对应一个receiver属性:
Xml代码
5.
提供Configuration Activity
Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。
在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE的IntenFilter。
需要注意的是,
如果设置了Configure属性,则必须在指定的Activity中进行如下处理:
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE),这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动;
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的Widget:
Java代码
否则会导致退出Activity后Widget不启动。
>> Widget创建步骤汇总:
1.定义Widget布局XML -> res/layout/...
2.定义Widget属性文件(xml) -> res/xml/...
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action 为android.appwidget.action.APPWIDGET_UPDATE的IntentFilter,并添加如下<meta- data>标识:Xml代码
4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest 中注册activity,添加一个action为android.appwidget.action.APPWIDGET_CONFIGURE的IntentFilter。