android widget开发点滴

AndroidWidget其实是mini版的apk程序,只是功能上进行了封装同时也受到了更多的约束。

以下是开发过程中碰到几点问题,记录一下:

一、关于EditText以及一些无法使用的组件问题

Widget是不允许放置EditView组件的,要实现EditText的效果,只能是在点击后跳转到另外的Activity,有几种方式:

1.直接采用Image方式,可以使用ImageView、ImageButton等

2.设置TextView的style属性,如:style="@android:style/Widget.EditText"

具体哪些View可以使用,可以参考官方文档(http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout)

二、独立Widget多个按钮问题

开发中碰到一个诡异的问题,场景是这样的:

创建了一个独立的widget程序,没有mainActivity,widget上面有多个按钮(每个按钮唤起一个Activity),点击第一个按钮后唤起activity1再按HOME键,然后按第二个按钮唤起activity2再按HOME键,当再次点击第一个按钮时唤起的却是activity2,当再按第三个按钮时又正常唤起activity3。

多次尝试,最后的结果是:只要是首次打开的activity被HOME键onPause后就永远无法再次打开。

暂时想到的办法是在onPause方法中先调用super.onPause();再调用一下super.finish();把当前actiity销毁掉。

其实原因据猜测应该是,独立widget没有mainActivity导致的,系统把第一个打开的activity1当成了主程序进程,所以当再次点击按钮一以后,只是简单的唤醒了上一个activity。

这个应该时android系统设计上的问题,具体原理就得了解android系统了。

三、关于透明图片事件点击区域问题

可以采用ImageButton组件,设置一下两个属性

android:src="@drawable/image1"//图片源

android:background="#00000000"//透明背景

android:layout_width="100dp"

android:layout_height="50dp"

这样图片也不会被拉升,点击图片以外区域以及图片的透明区域也会有事件反应,只要设置一下ImageButton的长宽就可以了

四、关于的widget界面的刷新(update)

Widget是通过RemoteView来通讯更新界面UI的,也就是说在初始化以后(OnEnbled和首次onUpdate),只要原元素(组件)没有主动变更,就会一直存在,RemoteView只是一个通讯工具,

每次在onUpdate方法中RemoteViewsrv=newRemoteViews(context.getPackageName(),R.layout.widget_layout);

这个新建的RemoteView不是一个初始化界面UI的过程,而只是把它绑定到了对应的widget上面。

另外,记录一下:

1.输入法事件:android:imeOptions="actionSearch"并实现方法editText.setOnEditorActionListener

2.传递Intent:

finalPendingIntentintent1=PendingIntent.getActivity(context,0,newIntent(XXX),appWidgetId),0);

rv.setOnClickPendingIntent(R.id.first_btn,intent1);

如果有多个PendingIntent,每次newIntent(XXX),最好设置不同的action,或者不同的Data。

3.widget主线程无法进行联网操作,可以新建一个Thread,或者在Handle中处理。

相关推荐