- 浏览: 63107 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
u014549257:
...
Apache Mina: StreamIoHandler传输文件处理 -
至尊包:
想问一下,这个官网的列子如果要兼容3.0以下的版本要怎么处理? ...
Swipe Views (水平分页)
首先,我们来说说基本概念。通常来说, 一个widget具备以下3个基本要素:
1. 一个AppWidgetProviderInfo对象
这个对象通常是在 res/xml目录里设置的
2. 一个AppWidgetProvider类的实现
通常是需要创建一个AppWidgetProvider类的子类,来实现自定义小应用update, enabled, disabled和删除时触发的方法。
3. 一个布局
这个布局是widget初始启动时出现的布局。
举一个最最简单的例子:
1. 先在AndroidManifest.xml中定义桌面小应用
2. 在 res / xml 目录下设置应用的基本信息
xml/widget_note_info.xml
3. 在 res / layout 目录下设置应用启动的初始布局
layout/widget_note.xml
4. java源码实现AppWidgetProvider类中的自定义update, enable, disable, delete方法
5. 如果要点击 widget 启动一个 activity, 需要修改4中的代码如下:
6. NoteEditActivity的布局
7. 点击 NoteEditActivity 的按钮,返回widget页面的方法
8. 在WIDGET里输入点内容,使用最简单的方法保存起来,然后更新WIDGET时显示被修改的内容。
1. 一个AppWidgetProviderInfo对象
这个对象通常是在 res/xml目录里设置的
2. 一个AppWidgetProvider类的实现
通常是需要创建一个AppWidgetProvider类的子类,来实现自定义小应用update, enabled, disabled和删除时触发的方法。
3. 一个布局
这个布局是widget初始启动时出现的布局。
举一个最最简单的例子:
1. 先在AndroidManifest.xml中定义桌面小应用
<receiver android:name=".android.widget.NoteWidgetProvider" android:label="@string/app_widget_notes" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_note_info" /> </receiver>
2. 在 res / xml 目录下设置应用的基本信息
xml/widget_note_info.xml
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_note" android:minWidth="294dip" android:minHeight="294dip"> </appwidget-provider>
3. 在 res / layout 目录下设置应用启动的初始布局
layout/widget_note.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="294dip" android:layout_height="294dip"> <ImageView android:id="@+id/widget_bg_image" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@+id/widget_text" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="40dip" android:paddingLeft="15dip" android:paddingRight="15dip" android:textSize="14sp" android:textColor="#FF663300" android:maxLines="12" android:lineSpacingMultiplier="1.2" /> </FrameLayout>
4. java源码实现AppWidgetProvider类中的自定义update, enable, disable, delete方法
public class NoteWidgetProvider extends AppWidgetProvider { private static final String TAG = NoteWidgetProvider.class.getSimpleName(); @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { ComponentName thisWidget = new ComponentName(context, NoteWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int i = 0; i < allWidgetIds.length; i++) { int widgetId = allWidgetIds[i]; RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_note); remoteViews.setImageViewResource(R.id.widget_bg_image, R.drawable.empty_sketchy); Intent intent = new Intent(context, NoteWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } }
5. 如果要点击 widget 启动一个 activity, 需要修改4中的代码如下:
@Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { ComponentName thisWidget = new ComponentName(context, NoteWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int i = 0; i < allWidgetIds.length; i++) { int widgetId = allWidgetIds[i]; Intent intent = new Intent(context, NoteEditActivity.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_note); remoteViews.setImageViewResource(R.id.widget_bg_image, R.drawable.empty_sketchy); remoteViews.setOnClickPendingIntent(R.id.widget_text, pendingIntent); appWidgetManager.updateAppWidget(widgetId, remoteViews); } }
6. NoteEditActivity的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/widget83" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:id="@+id/layout_notes" android:layout_width="fill_parent" android:layout_height="388dp" android:orientation="vertical"> <EditText android:id="@+id/edit_notes" android:layout_width="fill_parent" android:layout_height="fill_parent" android:hint="Please input!" android:textSize="18sp" /> </LinearLayout> <Button android:id="@+id/button_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Save" android:gravity="center" android:layout_gravity="right" /> </LinearLayout>
7. 点击 NoteEditActivity 的按钮,返回widget页面的方法
public class NoteNote extends Activity { private static final String TAG = NoteNote.class.getSimpleName(); private int mAppWidgetId; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); Intent t = getIntent(); mAppWidgetId = t.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); Log.i(TAG,"mAppWidgetId=" + mAppWidgetId); Button b = (Button) this.findViewById(R.id.button_save); b.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_note); views.setImageViewResource(R.id.widget_bg_image, R.drawable.empty_sketchy); //设置完成后需要获取AppWidgetManager,对指定的widget进行更新,才能使设置生效。 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); appWidgetManager.updateAppWidget(mAppWidgetId, views); finish(); } }); }
8. 在WIDGET里输入点内容,使用最简单的方法保存起来,然后更新WIDGET时显示被修改的内容。
public class NoteWidgetProvider extends AppWidgetProvider { public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int i = 0; i < allWidgetIds.length; i++) { int widgetId = allWidgetIds[i]; // 显示保存的输入内容 SharedPreferences settings = context.getSharedPreferences("MyPrefsFile", Context.MODE_PRIVATE); String notes = settings.getString("my_abcdefg", ""); Log.i(TAG,"NOTES=" + notes); Intent intent = new Intent(context, NoteNote.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_note); remoteViews.setImageViewResource(R.id.widget_bg_image, R.drawable.empty_sketchy); // 将保存的输入内容显示在WIDGET的TEXTVIEW里。 remoteViews.setTextViewText(R.id.widget_text, notes); remoteViews.setOnClickPendingIntent(R.id.widget_text, pendingIntent); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } } // 将输入的信息保存起来 public class NoteNote extends Activity { ....... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); Intent t = getIntent(); mAppWidgetId = t.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); // 将保存的信息显示在输入框内 SharedPreferences settings = getSharedPreferences("MyPrefsFile", Context.MODE_PRIVATE); notes = settings.getString("my_abcdefg", ""); Log.i(TAG,"NOTES=" + notes); et = (EditText) findViewById(R.id.edit_notes); et.setText(notes); Button b = (Button) this.findViewById(R.id.button_save); b.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if(et!=null) notes = et.getText().toString(); Log.i(TAG,"after onclick, text is =" + notes); // 将修改后的输入信息保存起来 SharedPreferences.Editor editor = getSharedPreferences("MyPrefsFile", Context.MODE_PRIVATE).edit(); editor.putString("my_abcdefg", notes); editor.commit(); // 调用widget页面,并将修改后的内容显示在widget内。 RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_note); views.setImageViewResource(R.id.widget_bg_image, R.drawable.empty_sketchy); views.setTextViewText(R.id.widget_text, notes); //设置完成后需要获取AppWidgetManager,对指定的widget进行更新,才能使设置生效。 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); appWidgetManager.updateAppWidget(mAppWidgetId, views); finish(); } }); } }
发表评论
-
android RSS reader
2013-09-26 15:04 13091. AndroidManifest.xml中的activit ... -
自定义ThreadPoolExecutor
2013-09-12 13:18 2182仍旧沿用ExecutorService的例子, 修改了Asyn ... -
关于ExecutorService的使用
2013-09-11 10:18 687ExecutorService: 线程池, 顾名思义是一个调度 ... -
使用后台服务下载文件的例子
2013-09-02 11:55 2184最近做了一个DEMO, 是通过httpURLConnectio ... -
Nofitication的使用
2013-05-22 15:16 1042Notification的例子,请参考附件。 1. 创建N ... -
Contextual Action Mode
2013-05-13 16:05 2079我在网上查了N多文章, 结果发现,在ANDROID自带 ... -
GridView显示ICON和TEXT
2013-05-08 12:00 10301. 设置GridView的布局 <?xml ver ... -
Swipe Views (水平分页)
2013-05-07 13:36 16231. 创建activity public class Co ... -
ExpandableListFragment及其使用
2013-04-17 16:33 0xxxxxxxxxxxxxxx xxxxxxxxxxxx xx ... -
动态ActionBar
2013-04-17 16:32 1597首先介绍一下该应用的主要操作界面 1. ProvinceLay ... -
在DialogFragment中使用ExpandableList
2013-04-15 16:39 1528我本来想在ListFragment中使用Expanda ... -
Fragment开发实例
2013-03-15 12:15 1866SVN源码下载地址: https://svn.codespot ...
相关推荐
实践是检验理论的最好方式,你可以参考《Widget开发:一个简单的例子》和《App Widget学习笔记》来动手编写自己的第一个 App Widget。通过实际操作,你会更加熟悉这个功能强大的桌面扩展机制,从而在你的应用程序中...
总的来说,"LoveNote"是一个实用的Android便签Widget示例,它涵盖了BroadcastReceiver、Widget布局、数据存储、用户交互和后台更新等多个核心概念,对初学者理解Android Widget开发具有很高的参考价值。通过学习这个...
这个例子特别适合那些正在学习BREW界面开发的初学者,它将通过一个具体的实例帮助你理解和掌握TitleWidget的运用。 在Visual Studio 2008(VS2008)中,开发者可以使用Microsoft的集成开发环境(IDE)来编写、调试...
例如,我们可以创建一个简单的布局文件`app_widget_layout.xml`,用于展示AppWidget的UI元素,比如TextView或Button。 ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android...
在这个“ViewPager简单例子”中,我们将深入探讨如何创建并使用ViewPager来展示三个不同的页面。 首先,我们需要了解ViewPager的基本概念。ViewPager是一个可以容纳多个Fragment或View的容器,它会根据用户的滑动...
标题"android简单控件例子"和描述"就是最基本、最简单的android例子的写法。一些规范,还有最基础的如何建工程等。"表明,本节将介绍Android中最简单的UI组件以及工程的建立流程。以下将详细说明这些知识点: 1. ...
在本文中,我们将深入探讨如何使用Qt库来创建一个简单的放大镜功能,正如"Qt放大镜例子"这个标题所描述的。Qt是一个跨平台的应用程序开发框架,它提供了丰富的图形用户界面(GUI)工具和功能,使开发者能够构建高效...
下面通过一个具体的案例——一个用于记录用户每日饮水量的应用程序,来具体展示 Swift 在 iOS 开发中的实际应用。 ##### 应用程序功能概览 1. **用户界面**:包含输入框和按钮,用于输入和记录用户每日饮水量。 2. ...
要开始开发一个 Android 小部件,首先需要在 AndroidManifest.xml 文件中声明一个 `<appwidget-provider>`。这一步骤是必须的,因为它告诉 Android 系统你的应用程序提供了可被用户添加到主屏幕的小部件。 ```xml ...
本教程将详细讲解如何在Android中实现一个最简单的图片切换引导页面功能。 首先,理解引导页面的基本构成。引导页面一般包括一个或多个静态图片,这些图片会按照设定的顺序依次展示,有的还会添加简单的动画效果,...
SWT的设计目标是提供一个高效、本地化的GUI工具包,能够充分利用操作系统提供的功能,使得Java应用程序的GUI性能和外观与本机应用更为接近。 在"SWT使用例子"这个主题中,我们涵盖了多个核心组件和布局管理器的用法...
Fyne是一个轻量级且跨平台的用户界面库,它使得用Go语言编写美观且功能丰富的应用程序变得更加简单。我们将主要围绕以下几个知识点进行讲解: 1. **Golang与GUI编程** Go语言(Golang)以其简洁的语法、高效的性能...
- **示例应用**:通过具体的例子来讲解如何开发一个简单的Android应用。例如,创建一个包含基本UI组件(如按钮、文本框等)的应用程序,演示如何响应用户输入、处理Intent等操作。 - **实践技巧**:分享一些在实际...
- **选取父构件**:基于新构件的功能需求,选择一个功能最接近且最精简的现有构件作为“父构件”。这有助于减少重复劳动,同时保持代码简洁高效。 2. **编写头文件**: - 头文件通常包含了构件的基本定义和接口,...
让我们通过一个简单的项目来了解如何利用FLTK库进行开发。 首先,我们需要了解FLTK库的基本结构。FLTK库提供了大量的窗口、控件和布局管理类,用于构建GUI应用。其核心组件包括窗口(Window)、按钮(Button)、...
总结,创建一个简单的Android AppWidget涉及定义其配置文件、布局文件以及处理事件的类。通过BroadcastReceiver和Intent,AppWidget可以与客户端应用程序进行通信,实现更丰富的功能。在实际开发中,AppWidget可以...
也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...
PyGObject是一个强大的Python模块,它为开发人员提供了一个接口,可以方便地在Python中使用基于GObject的C库。GObject是GNOME桌面环境下的基础组件系统,它定义了一种面向对象的编程模型,广泛用于创建跨平台的图形...
在这个例子中,我们将创建一个显示数字时钟的布局,可能包括两个`TextView`:一个用于小时,另一个用于分钟。这些视图可以通过`RemoteViews`类进行操作,`RemoteViews`允许你在App Widget中动态地设置视图内容。 在...
总的来说,Android的App Widget和Web App分别代表了两种不同的开发模式:一个是原生的、集成到系统级别的桌面小工具;另一个是基于Web标准、跨平台的轻量级应用。理解这两种技术,可以帮助开发者根据项目需求选择最...