widget窗口小部件

 Appwidget就是手机应用中常常放在桌面(即home)上的一些应用程序,比如说闹钟等。这种应用程序的特点是它上面显示的内容能够根据系统内部的数据进行更新,不需要我们进入到程序的内部去,比如说闹钟指针的摆动等。


1、widget类的定义


首先,在res目录下新建一个名为xml的文件夹,在该文件夹下新建一个xml文件,例如example_appwidget_info.xml,该xml文件的根标签为appwidget-provider. 该xml文件主要是对所建立的appwidget的一个属性设置,其中比较常见的属性有appwidget更新的时间,其初始的布局文件等等。

res/xml/example_appwidget_info下内容如:

<appwidget-providerxmlns:android="http://schemas.android.com/apk/res/android"

    android:minWidth="40dp"                    <!-- 最小宽度 -->
    android:minHeight="40dp"                   <!-- 最小高度 -->
    android:updatePeriodMillis="86400000"              <!-- 更新间隔时间,最短也得设置半个小时 -->
    android:previewImage="@drawable/preview"   <!-- 预览的样子图片,可以不需要,默认为应用logo -->
    android:initialLayout="@layout/example_appwidget"  <!-- 布局文件 -->
    android:configure="com.example.android.ExampleAppWidgetConfigure" <!-- 配置页面是一个Activity,有些应用在添加widget后需要跳转页面进行配置 -->
    android:resizeMode="horizontal|vertical"  <!-- 缩放模式,水平方向竖直方向都支持缩放 -->

    android:widgetCategory="home_screen|keyguard">  <!-- 4.2+以上支持锁屏页展示widget, home_screen普通类型-->

    <!-- 4.2+系统的锁屏页添加widget:  android:widgetCategory="keyguard|home_screen"-->

</appwidget-provider>

系统自带的更新设置最短也得半个小时才会更新一次,而如果我们需要更短时间更新时,可以把android:updatePeriodMillis="0"置为0,然后自定义一个Service在onCreate方法中定义一个定时器Timer去实现更新;而在自定义的widget的AppWidgetProvider类型java类中的onEnabled和onUpdate方法中开启Service,在onDisabled方法中结束Service。

其次, 定义一个类,例如ExampleAppWidgetProvider.java继承AppWidgetProvider,同时要在清单文件AndroidManifest.xml中进行配置。配置如下所示

<receiver android:name="ExampleAppWidgetProvider" >
    <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>
android:resource - 详述AppWidgetProviderInfo资源的位置,在res目录下新建一个文件xml,在xml文件夹下自定义一个widget属性集的xml文件,

该类能实现所建立的widget的全部功能,其中比较重要的功能是接收广播消息来更新widget的内容。该类能复写父类的所有方法,例如onReceive方法,但widget还具备自身的方法,例如onEnabled,onUpdate,onDeleted,onDisabled等方法。

其中onDeleted()方法是当appwidget删除时被执行,

onDisabled()是当最后一个appwidget被删除时执行,

onEnabled()为当第一个appwidget被建立时执行,

onReceive()为当接收到了相应的广播信息后被执行(在每次添加或者删除widget时都会执行,且在其它方法执行的前面该方法也会被执行,其实本质上该方法不是AppWidgetProvider这个类的生命周期函数),

onUpdate()为到达了appwidget的更新时间或者一个appwidget被建立时执行。

appwidget中本身里面就有程序(有activity),但是在桌面上添加一个appwidget后也相当于一个程序,这2个程序本身不是在同一个进程当中,而是在各自单独的进程中。


widget本质上是一个BroadcastReceiver,所以Receiver有的方法widget都有例如OnReceiver方,widget还有自身具备的方法:

    //第一次添加widget时调用此方法
    @Override
    public void onEnabled(Context context) {
        // TODO Auto-generated method stub
        super.onEnabled(context);
    }
    
    //widget被更新时调用此方法
    //更新的情况有两种:
    //1、桌面新增widget,例如:桌面原来没有widget,现在增加一个
    //2、widget间隔一定时间更新,xml文件中配置的
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
    
    //widget被移除时调用此方法,例如桌面原来有两个widget,现在删除一个
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onDeleted(context, appWidgetIds);
    }
    
    //最后一个widget被移除的时候调用此方法
    @Override
    public void onDisabled(Context context) {
        // TODO Auto-generated method stub
        super.onDisabled(context);
    }


2、widget生命周期及相关实验


例一:

  实验说明:

  这个例子实现一个最简单的appwidget,即我们的appwidget只有一个按钮,按钮上面写着“我的常用密码字样”,没有其它功能,呵呵。然后我们在appwidget的java类的程序中,每个生命周期函数都在后台打印出一句话,内容是与该生命周期函数名相对应的。

  实验结果:

  往桌面添加自己创建的一个appwidget效果如下所示:

  

 

  该实验室先后在桌面上放2个appwidget,然后依次删除2个appwidget,则程序后台的输出结果如下所示:

  

 

  实验主要代码及注释(附录有实验工程code下载链接):

  MainActivity.java不用更改任何代码,采用默认的就行了,这里就不贴出来了。

my_passward_provider.java(Appwidget功能实现):

复制代码
package com.example.appwidget1;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class my_password_provider extends AppWidgetProvider {

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        // TODO Auto-generated method stub
        System.out.println("appwidget--->onDeleted()");
        super.onDeleted(context, appWidgetIds);
    }

    @Override
    public 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个基于Python语言的图形用户界面(GUI)开发工具包,它使用Qt库来创建丰富和交互式的用户界面。在PyQt5中,widget是指GUI应用程序中的窗口组件,可以理解为构成整个界面的各个部分。 widget内的所有部件可以分为以下几类: 1. 基本部件:包括QWidget、QLabel、QLineEdit、QPushButton、QCheckBox、QRadioButton等。它们是GUI应用的基础组件,用于显示文本、接受用户输入和执行各种操作。 2. 容器部件:包括QGroupBox、QFrame、QTabWidget等。它们用于将其他部件组织在一起,形成整体。例如,QGroupBox可以用于创建一个分组框,QTabWidget可以创建一个选项卡式的界面。 3. 布局部件:包括QHBoxLayout、QVBoxLayout、QGridLayout等。它们用于管理部件的位置和大小。QHBoxLayout和QVBoxLayout可以分别创建水平和垂直布局,QGridLayout可以创建网格布局。 4. 容器控制部件:包括QScrollArea、QSplitter、QStackedWidget等。它们用于管理大量部件的显示和交互。例如,QScrollArea可以创建一个可滚动的容器,QSplitter可以创建一个可调整大小的分割窗口。 5. 数据展示部件:包括QListView、QTreeView、QTableView等。它们用于展示大量数据,并提供一些常用的操作功能,例如排序、过滤等。 6. 图形部件:包括QPainter、QPixmap、QGraphicsView等。它们用于绘制和显示图形元素,例如线条、矩形、图像等。 总之,PyQt5的widget内的所有部件都能够实现丰富的用户界面功能和交互。开发者可以根据需要选择和组合这些部件,从而创建出符合自己需求的GUI应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值