Android中widget编写注意事项——1(程序成功执行Done却没有widget)

大家都知道Android中的widget是个很有爱的东东啦~所以使用这个东东的people也一定很多!当然在使用过程中也就会出现不少“不正常”的地方喽~

不急,先来个实例代码,题中所述的问题的解决办法在实例后面再说哈~

首先,是Manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.widget"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">

		<receiver android:label="Hello,App Widget" android:name=".HelloWidgetProvider">
			<intent-filter>
				<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
			</intent-filter>
			
			<meta-data android:name="android.appwidget.provider" android:resource="@xml/provider_info" />
		</receiver>

    </application>
</manifest>

		

然后,是layout下的main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/p1">
    
	<TextView  
		android:id="@+id/textview"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="@string/hello"
	 	android:textSize="10px"
	    android:textColor="#ff0000"/>
</LinearLayout>
再然后,在res目录下新建一个xml文件夹,在此文件夹中新建一个provider_info.xml文件

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
	android:minWidth="50dip"
	android:minHeight="50dip"
	android:updatePeriodMillis="10000"
	android:initialLayout="@layout/main"/> 
最后最后,主角——java代码WidgetActivity.java

import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
//AppWidgetProvider 是 BroadcastReceiver 的子类,本质是个 广播接收器,它专门用来接收来 自Widget组件的各种请求(用Intent传递过来),所以如果让我给他起名的话 我会给他命名为AppWidgetReceiver,每一个Widget都要有一个AppWidgetProvider.
public class WidgetActivity extends AppWidgetProvider {
//每个请求都会传递给onReceive方法,该方法根据Intent参数中的action类型来决定自己处理还是分发给下面四个特殊的方法。
	@Override
	public void onReceive(Context context, Intent intent) {
Log.i("yao", "HelloWidgetProvider --> onReceive");
		super.onReceive(context, intent);
	}
//如果Widget自动更新时间到了、或者其他会导致Widget发生变化的事件发生,或者说Intent的值是android.appwidget.action.APPWIDGET_UPDATE,那么会调用onUpdate,下面三个方法类似
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//AppWidgetManager 顾名思义是AppWidget的管理器,appWidgetIds 桌面上所有的widget都会被分配一个唯一的ID标识,那么这个数组就是他们的列表
		Log.i("yao", "HelloWidgetProvider --> onUpdate");
		super.onUpdate(context, appWidgetManager, appWidgetIds);
	}
//当一个App Widget从桌面上删除时调用
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		Log.i("yao", "HelloWidgetProvider --> onDeleted");
		super.onDeleted(context, appWidgetIds);
	}
//当这个App Widget第一次被放在桌面上时调用(同一个App Widget可以被放在桌面上多次,所以会有这个说法)
	@Override
	public void onEnabled(Context context) {
		Log.i("yao", "HelloWidgetProvider --> onEnabled");
		super.onEnabled(context);
	}
//当这个App Widget的最后一个实例被从桌面上移除时会调用该方法。
	@Override
	public void onDisabled(Context context) {
		Log.i("yao", "HelloWidgetProvider --> onDisabled");
		super.onDisabled(context);
	}
OK,以上就是整个widget的小工程啦,当然这个只是实现基本的功能,并没有添加额外的什么哈~

回到题中说到的异常哈,其实这个问题在编译时一点问题都没有的,大家也看到啦,工程中并没有什么红色的叉叉的,而且运行的Log也提示运行成功,那到底为什么就找不到我们创建的widget呢?

其实很简单啦,关键就只是Manifest文件中的那个元数据!!!对,就是那个meta-data啦,以前的工程中可能会写成META-data,这样看没啥错的,但是运行出来的结果就是没有我们要的widget哈,这边只要把大写都改成小写,也就是写成meta-data就OK啦~~~大家再试试看看吧,出来了吧^_^         O(∩_∩)O哈哈~


AndroidWidget是指可以被放置在桌面或者其他应用的小部件,比如常见的时钟、天气、日历等等。在AndroidWidget的布局可以使用XML文件来进行定义,与普通的布局定义类似,可以使用各种属性来设置Widget的样式和行为。 在Widget的XML布局文件,可以使用View类定义的许多属性来控制Widget的样式和行为,比如: 1. android:id:设置Widget的ID,可以在代码通过findViewById()方法来获取对应的View对象。 2. android:layout_width、android:layout_height:设置Widget的宽度和高度,可以使用具体数值或者match_parent、wrap_content等特殊值。 3. android:layout_gravity:设置Widget在父布局的对齐方式,比如center、left、right等等。 4. android:padding、android:paddingLeft、android:paddingRight等:设置Widget的内边距,用于控制Widget内部内容的显示位置。 5. android:background:设置Widget的背景颜色或者背景图片。 6. android:clickable、android:longClickable:设置Widget是否可以被点击或者长按。 7. android:focusable、android:focusableInTouchMode:设置Widget是否可以获取焦点,用于控制Widget是否可以响应键盘事件等。 8. android:visibility:设置Widget是否可见,可以使用值为visible、invisible、gone。 除了以上列出的属性之外,还有许多其他的属性可以用于控制Widget的样式和行为,具体可以查看Android官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值