首页 > 代码库 > android中常用的小控件------Widgets的使用

android中常用的小控件------Widgets的使用

好久没有写博客了,都不知博客怎么写了,最近突然想写博客,以帮助更多的人,却又不知道写什么好呢?

好吧  我承认我有点懒惰了,可是程序猿是不应该懒惰的哦,俺要做个好孩子。

好了言归正传,开始介绍下今天的主要内容吧!


Widgets一个桌面的小控件    个人认为是很常用的,不知道大神们是不是这么觉得的呢?比如说你开发的一款音乐播放器的软件,可把基本的上一曲和下一曲、暂停的几个功能放在这个小控件里面将它显示在桌面上来,这样就很方便啦,你想要下一曲、上一曲、暂停播放的时候,就不用再打开播放器了,而是直接通过这个小控件就可以实现了,是不是很实用呢?好了下面就来介绍下这款精美的小控件是怎么使用吧!


首先我们来看一下官方的文档:

在官方文档的主页

如果大家想知道有关Widgets的详细信息的,可以到官方文档看一看,这里就不做详细的介绍啦,下面开始怎么写,才是最重要的。

第一步:写一个类继承AppWidgetProvider

public class MyWidgets extends AppWidgetProvider {

}

那大家又有疑问了AppWidgetProvider是什么啊?的确  我刚开始的时候也有这种疑问,下面将来说明;

我们来看一下AppWidgetProvider内的源码

public class AppWidgetProvider extends BroadcastReceiver {
    /**
     * Constructor to initialize AppWidgetProvider.
     */
    public AppWidgetProvider() {
    }

此处省略一部分源码   我们看关键的部分

大家看到了吗

AppWidgetProvider 是继承BroadcastReceiver的,而<pre name="code" class="java">BroadcastReceiver又是一个广播接收者,所以大家又想到了什么呢?

当然是清单文件AndroidManifest.xml啊

android中的四大组件都需要在清单文件AndroidManifest.xml中配置的啦   接下来的第二步就是配置清单文件啦

第二步:在清单文件中AndroidManifest.xml中配置继承AppWidgetProvider的类

  那具体怎么配置呢?android官方文档已经给我们示例代码了,我们来看一看

<receiver android:name="ExampleAppWidgetProvider" ><!-- 继承AppWidgetProvider类的完成的包名+类名-->
    <intent-filter><!--意图过滤器,告诉你这个类干什么-->
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /><!--意图过滤器的动作:简单的说就是让你这个类执行什么指令-->
    </intent-filter>
  <!--元数据    1.名字   2.引用的资源   -->
 <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />
</receiver>

好了到这里我们的清单文件也配置好了,需要注意的是:

是在清单文件中application节点下配置,因为是四大组件   所有需要在统一级别配置

上面的配置中包名+类名的位置可根据自己的包名和类名加以修改,其次是引用资源的时候我们要说一下了

回到我们的程序的结构的res文件夹下面新建一个xml文件,并在文件夹内新建一个xml文件  这里就用官方的文件名,读者可自己修改xml/example_appwidget_info.xml


可是呢?有一个问题来了,那这个xml文件具体怎么写呢?不用担心,android官方文档里面早已有“美女”在等着我们了,等着我们去猎取呢?  好吧  我想歪了    不过还得去看看   是吧   嘿嘿   走起。。。。。。。。


首先我们都应该知道既然是xml文件呢?就需要引入头文件

<?xml version="1.0" encoding="utf-8"?>
接下来就来找  “美女了”  想象一下那是个美女   你会不会很乐意去看呢?

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard"
    android:initialKeyguardLayout="@layout/example_keyguard">
</appwidget-provider>

好了,既然“美女”我们已经找到了,那我们就来好好研究下吧。

android:minWidth="40dp"   桌面控件默认的宽度
android:minHeight="40dp"  桌面控件默认的高度
<pre name="code" class="html"><span style="font-size:14px;"></span><pre name="code" class="html">android:updatePeriodMillis="86400000"  最短的更新时间   这里是毫秒值   默认是30分钟
android:previewImage="@drawable/preview"  预览的图片   如果不指定图片   就会默认使用应用程序的图片
<span style="font-size:14px;"></span><pre name="code" class="html">android:initialLayout="@layout/example_appwidget"桌面控件的布局   就是我们要显示的布局
<span style="font-size:14px;"></span><pre name="code" class="html">android:configure="com.example.android.ExampleAppWidgetConfigure" 如果你的应用程序没有界面就需要指定相应的参数  一般有界面的程序不用管哦
<span style="font-size:14px;"></span><pre name="code" class="html">android:resizeMode="horizontal|vertical" 压缩的方式  默认水平压缩和垂直压缩
android:widgetCategory="home_screen|keyguard"<span class="high-light-bg">声明你的应用是否控件可以显示在屏幕上</span><span>.</span>
<p class="ordinary-output target-output"><span class="high-light-bg"></span><pre name="code" class="html">android:initialKeyguardLayout="@layout/example_keyguard"  锁定屏幕时的组件布局

好了  到这里我们的资源文件也写完了,  需要提醒大家的是  在开发中  我们并不需要全部的写上  只需要根据我们需要写相应的属性即可

到这一步 我们基本的桌面小控件就已经搭建好了,如果大家还有更多的需求,请参照android提供的官方文档查看。

这里给大家提供一个简单demo


第一步:写一个类继承AppWidgetProvider

public class MyWidgets extends AppWidgetProvider {
	
	private static final String TAG = "MyWidgets";

	@Override
	public void onDisabled(Context context) {
		super.onDisabled(context);
		Log.i(TAG, "onDisabled");
		//桌面没有控件  就停止服务
		Intent service = new Intent(context, WidgetsUpdateService.class);
		context.stopService(service);
	}

	@Override
	public void onEnabled(Context context) {
		super.onEnabled(context);
		Log.i(TAG, "onEnabled");
		//桌面有控件   开启服务  更新
		Intent service = new Intent(context, WidgetsUpdateService.class);
		context.startService(service);
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		Log.i(TAG, "onUpdate");
		//开服务
		Intent service = new Intent(context, WidgetsUpdateService.class);
		context.startService(service);
	}

第二步:在清单文件中配置

example_appwidget_info

<receiver android:name="com.androidit.receiver.MyWidgets" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info" />
        </receiver>

在res资源文件夹下创建一个xml文件夹,新建一个xml文件(请注意 先创建xml文件夹在创建example_appwidget_info文件)

<pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><pre name="code" class="html"><span class="high-light-bg">example_appwidget_info.xml

</span><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="0"
    android:resizeMode="horizontal|vertical"
    android:initialLayout="@layout/process_widget">
</appwidget-provider>

布局文件这里就不附上了,给大家看个最终的图吧,至于什么样的布局 大家自己写吧


如果你对本博客感兴趣,请关注哦,不定期更新android方面的文章