精华内容
下载资源
问答
  • Android widget桌面插件

    2015-03-25 13:36:26
    Android widget是桌面插件,在android系统应用开发层面有特殊用途。AppWidget是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法。悬浮窗的效果与Widget很类似,但是它比Widget要灵活的多。
  • android widget日历小插件,小例子
  • 公司做一个项目需要用到的功能就是安卓桌面插件,由于是第一次做安卓桌面插件,去找相关的资料,有去google官网看相关的API文档。官方文档的连接 http://www.android-doc.com/guide/topics/appwidgets/index.html...

    公司做一个项目需要用到的功能就是安卓桌面插件,由于是第一次做安卓桌面插件,去找相关的资料,有去google官网看相关的API文档。官方文档的连接 http://www.android-doc.com/guide/topics/appwidgets/index.html

    我们在使用android Studio 后面简称AS,做插件功能的时候,它其实有自动生成的,不需要我们再去自己配置插件的宽高尺寸了的,

    用AS新建一个测试项目,项目创建好后再按照如下图片去创建插件

    这里写图片描述

    点击App Widget 后就出现如下对话框

    这里写图片描述

    这里我们是可以选择它显示的单元格的,如果是1x1的插件的话 就按照上面图片所选择的,点击finish按钮
    如果不是这个尺寸的单元格,就在红色框里面做相应的选择即可,选着完成之后就点击finish按钮。

    之后就来到这个界面

    这里写图片描述

    生成是可能会报错,不用管它,点击红色框中的运行按钮或者编译按钮,报错就会消失
    我这里没有点击编译按钮,直接点击运行按钮之后错误就消失了,
    这里写图片描述

    它制动生成的插件这个类里面是没有onReciver这个方法的,所以我们这里要自己加上onReciver这个方法,因为后面需要用到这个onReciver这个方法,加上之后的效果图

    这里写图片描述

    上图红色框中的就是那个onReciver这个方法

    如果在桌面创建插件时,先要跳转到一个activity界面,还需要做如下的的处理,首先我们要在创建一个类以及在layout文件夹下创建对应的布局,创建之后的效果图如下

    这里写图片描述

    之后要在资源文件中的xml文件夹下 打开new_app_widget_info.xml文件做如下图的配置

    这里写图片描述

    配置好后如上图中红色框,这只是在资源文件夹下做相应的配置。接下来,还要在 androidManifest.xml中做配置,要不然是不会显示activity界面的 配置之后的效果图如下

    这里写图片描述

    配置的代码如下:

    <activity android:name=".WidgetActivity"
                android:configChanges="locale|layoutDirection"
                android:screenOrientation="portrait"
                android:windowSoftInputMode="adjustResize|stateHidden">
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
                </intent-filter>
            </activity>

    运行之后的效果就是该activity界面显示空白,因为我们没有在布局做相应的处理。点击手机或者模拟器上的返回按钮,最后插件是没有显示在桌面上的。

    如果想看官网的相关demo 点击上面此链接

    http://www.android-doc.com/guide/topics/appwidgets/index.html#UpdatingFromTheConfiguration

    点击下图中红色框中的内容即可跳转到demo

    这里写图片描述

    按照此demo 就可以完成上面创建插件的时候跳转到界面,再返回就可以生成插件了。

    最后插件它和应用里面的activity不同,它使用控件是用一些限制的。它支持的控件如下图所示

    这里写图片描述

    我也是一个菜鸟来的,喜欢大神们看到此博客不要笑话我这样的菜鸟,你们大神每给一次鼓励,就是我们这些菜鸟技术提升的动力。

    后续有时间我再写widget插件实现换页的功能。我看了很多资料,插件实现换页功能的demo 还是比较少的。

    展开全文
  • NULL 博文链接:https://hanllove001.iteye.com/blog/1185506
  • 主要介绍了Android桌面插件App Widget用法,结合实例形式分析了桌面插件App Widget的功能、布局、创建及使用方法,需要的朋友可以参考下
  • Android widget 桌面插件

    2013-01-17 09:53:26
    Android widget 桌面插件,详细源码, 详细注释
  • CalendarWidget日历控件.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android课程设计的widget电池插件,根据资源修改了UI界面,有点小瑕疵,可以自行更改界面和字体颜色。
  • 现在手上的项目有一个这样的需求,就是系统一开机的时候展示桌面指定的Widget (已经实现了,搞了好久),现在又有了新的需求,就是需要实现桌面Widget的大小与桌面同宽,求各位大神指点,拜托拜托
  • AndroidWidget电池插件

    2011-11-14 01:56:46
    AndroidWidget电池插件,可单击插件,查看信息详情
  • Androidwidget使用listview布局

    热门讨论 2013-04-19 17:04:55
    Androidwidget使用listview布局,快速上手,可以直接用在项目里面
  • 我正在尝试添加一个主屏幕小部件到我的应用程序,我的小部件不会出现在Android的小部件列表中.我已经尝试重新启动设备,重新安装应用程序,更改配置文件中的参数,确保SD卡上没有安装应用程序.没有任何工作.这是我现在的...

    我已经在stackoverflow上看过关于这个的几个问题,没有一个答案解决了我的问题.

    我正在尝试添加一个主屏幕小部件到我的应用程序,我的小部件不会出现在Android的小部件列表中.

    我已经尝试重新启动设备,重新安装应用程序,更改配置文件中的参数,确保SD卡上没有安装应用程序.没有任何工作.

    这是我现在的代码:

    AndroidManifest.xml的应用程式标签内

    android:name=".GulpWidgetProvider"

    android:icon="@mipmap/ic_launcher"

    android:label="Gulp">

    android:name="android.appwidget.provider"

    android:resource="@xml/gulp_widget_info" />

    里面的/res/xml/gulp_widget_info.xml:

    android:initialLayout="@layout/layout_widget"

    android:minHeight="150dip"

    android:minWidth="400dip"

    android:updatePeriodMillis="86400000"

    android:widgetCategory="home_screen"

    android:resizeMode="none"

    android:minResizeHeight="150dip"/>

    里面/res/layout/layout_widget.xml:

    android:layout_width="match_parent"

    android:layout_height="150dip"

    android:background="@drawable/gradient"

    android:gravity="center_horizontal|top">

    android:layout_width="170dip"

    android:layout_height="150dip"

    android:gravity="center">

    android:id="@+id/widget_consumption_progress_bar"

    style="?android:attr/progressBarStyleHorizontal"

    android:layout_width="150dip"

    android:layout_height="150dip"

    android:layout_centerInParent="true"

    android:indeterminate="false"

    android:max="100"

    android:progress="0"

    android:progressDrawable="@drawable/progressbar"

    android:secondaryProgress="100" />

    android:id="@+id/widget_time_progress_bar"

    style="?android:attr/progressBarStyleHorizontal"

    android:layout_width="150dip"

    android:layout_height="150dip"

    android:layout_centerInParent="true"

    android:indeterminate="false"

    android:max="100"

    android:progress="0"

    android:progressDrawable="@drawable/progressbar2"

    android:secondaryProgress="100" />

    android:id="@+id/widget_water_consumed"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_centerInParent="true"

    android:fontFamily="sans-serif-light"

    android:gravity="center"

    android:maxLines="1"

    android:textColor="@color/white"

    android:textSize="30sp" />

    android:id="@+id/widget_unit"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_below="@id/water_consumed"

    android:layout_centerInParent="true"

    android:fontFamily="sans-serif-light"

    android:gravity="center"

    android:maxLines="1"

    android:text="@string/milliliters_abbrev"

    android:textColor="@color/white"

    android:textSize="12sp" />

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:layout_weight="1"

    android:gravity="center"

    android:orientation="horizontal"

    android:paddingLeft="10dip"

    android:paddingRight="10dip">

    android:id="@+id/widget_add"

    style="@style/GulpButton"

    android:layout_width="60dip"

    android:layout_height="60dip"

    android:background="@drawable/whitecirclebutton"

    android:gravity="center"

    android:text="@string/add_abbrev" />

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_weight="1"

    android:gravity="center"

    android:orientation="vertical">

    android:id="@+id/widget_goal"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:fontFamily="sans-serif-light"

    android:textColor="@color/white"

    android:textSize="22sp" />

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:fontFamily="sans-serif-light"

    android:text="@string/target"

    android:textColor="@color/white_semi_translucent"

    android:textSize="14sp" />

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_weight="1"

    android:gravity="center"

    android:orientation="vertical">

    android:id="@+id/widget_remaining"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:fontFamily="sans-serif-light"

    android:textColor="@color/white"

    android:textSize="22sp" />

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:fontFamily="sans-serif-light"

    android:text="@string/remaining"

    android:textColor="@color/white_semi_translucent"

    android:textSize="14sp" />

    里面/java/info/andrewdahm/gulp/GulpWidgetProvider.java:

    public class GulpWidgetProvider extends AppWidgetProvider {

    @Override

    public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) {

    final int N = appWidgetIds.length;

    // Perform this loop procedure for each App Widget that belongs to this provider

    for (int i=0; i

    int appWidgetId = appWidgetIds[i];

    // Create an Intent to launch ExampleActivity

    Intent intent = new Intent(context,Main.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(context,intent,0);

    // Get the layout for the App Widget and attach an on-click listener

    // to the button

    RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.layout_widget);

    views.setOnClickPendingIntent(R.id.widget_add,pendingIntent);

    // Tell the AppWidgetManager to perform an update on the current app widget

    appWidgetManager.updateAppWidget(appWidgetId,views);

    }

    }

    }

    任何想法为什么我的窗口小部件不会出现在窗口小部件列表中?

    展开全文
  • 最近需要编写一个日期时间的桌面Widget用来关联日历程序,以前很少写桌面Widget。对这方面技术不是很熟悉,今天花时间重新整理了一下,顺便把编写一个简单时间日期程序过程记录下来。桌面Widget其实就是一个显示一些...

    最近需要编写一个日期时间的桌面Widget用来关联日历程序,以前很少写桌面Widget。对这方面技术不是很熟悉,今天花时间重新整理了一下,顺便把编写一个简单时间日期程序过程记录下来。

    桌面Widget其实就是一个显示一些信息的工具(现在也有人开发了一些有实际操作功能的widget。例如相机widget,可以直接桌面拍照)。不过总的来说,widget主要功能就是显示一些信息。我们今天编写一个很简单的作为widget,显示时间、日期、星期几等信息。需要显示时间信息,那就需要实时更新,一秒或者一分钟更新一次。

    这个时间Widget我是参考(Android应用开发揭秘)书里面的一个demo例子做的,只是把功能和界面完善了一下。下面是这次的效果图:

    024a90f10893a7e035f5548052455c41.png

    1、继承AppWidgetProvider我们编写的桌面Widget需要提供数据更新,这里就需用用到AppWidgetProvider,它里面有一些系统回调函数。提供更新数据的操作。AppWidgetProvider是BrocastReceiver的之类,也就是说它其实本质是一个广播接收器。下面我们看看AppWidgetProvider的几个重要的回调方法:

    class WidgetProvider extends AppWidgetProvider

    {

    private static final String TAG="mythou_Widget_Tag";

    // 没接收一次广播消息就调用一次,使用频繁

    public void onReceive(Context context, Intent intent)

    {

    Log.d(TAG, "mythou--------->onReceive");

    super.onReceive(context, intent);

    }

    // 每次更新都调用一次该方法,使用频繁

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

    {

    Log.d(TAG, "mythou--------->onUpdate");

    super.onUpdate(context, appWidgetManager, appWidgetIds);

    }

    // 没删除一个就调用一次

    public void onDeleted(Context context, int[] appWidgetIds)

    {

    Log.d(TAG, "mythou--------->onDeleted");

    super.onDeleted(context, appWidgetIds);

    }

    // 当该Widget第一次添加到桌面是调用该方法,可添加多次但只第一次调用

    public void onEnabled(Context context)

    {

    Log.d(TAG, "mythou--------->onEnabled");

    super.onEnabled(context);

    }

    // 当最后一个该Widget删除是调用该方法,注意是最后一个

    public void onDisabled(Context context)

    {

    Log.d(TAG, "mythou--------->onDisabled");

    super.onDisabled(context);

    }

    }

    其中我们比较常用的是onUpdate和onDelete方法。我这里刷新时间使用了一个Service,因为要定时刷新服务,还需要一个Alarm定时器服务。下面给出我的onUpdate方法:

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

    {

    super.onUpdate(context, appWidgetManager, appWidgetIds);

    Time time = new Time();

    time.setToNow();

    //使用Service更新时间

    Intent intent = new Intent(context, UpdateService.class);

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

    //使用Alarm定时更新界面数据

    AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    alarm.setRepeating(AlarmManager.RTC, time.toMillis(true), 60*1000, pendingIntent);

    }

    2、AndroidManifest.xml配置

    android:icon="@drawable/icon"

    android:label="@string/app_name">

    android:label="@string/app_name_timewidget"

    android:name="com.owl.mythou.TimeWidget">

    android:name="android.appwidget.provider"

    android:resource="@xml/time_widget_config">

    AndroidManifest主要是配置一个receiver,因为AppWidgetProvider就是一个广播接收器。另外需要注意的是,里面需要提供一个action,这个是系统的更新widget的action。还有meta-data里面需要指定widget的配置文件。这个配置文件,需要放到res\xml目录下面,下面我们看看time_widget_config.xml的配置

    3、appWidget配置:

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:initialLayout="@layout/time_widget_layout"

    android:minWidth="286dip"

    android:minHeight="142dip"

    android:updatePeriodMillis="0">

    •android:initialLayout 指定界面布局的Layout文件,和activity的Layout一样

    •android:minWidth 你的widget的最小宽度。根据Layout的单元格计算(72*格子数-2)

    •android:minHeigh 你的widget的最小高度。计算方式和minwidth一样。(对这个不了解可以看我Launcher分析文章)

    •android:updatePerioMillis 使用系统定时更新服务,单位毫秒。

    这里需要说明android:updatePerioMillis的问题,系统为了省电,默认是30分钟更新一次,如果你设置的值比30分钟小,系统也是30分钟才会更新一次。对于我们做时间Widget来说,显然不靠谱。所以只能自己编写一个Alarm定时服务更新。

    4、更新Widget的Service服务

    class UpdateService extends Service

    {

    @Override

    public void onStart(Intent intent, int startId)

    {

    super.onStart(intent, startId);

    UpdateWidget(this);

    }

    private void UpdateWidget(Context context)

    {

    //不用Calendar,Time对cpu负荷较小

    Time time = new Time();

    time.setToNow();

    int hour = time.hour;

    int min = time.minute;

    int second = time.second;

    int year = time.year;

    int month = time.month+1;

    int day = time.monthDay;

    String strTime = String.format("%02d:%02d:%02d %04d-%02d-%02d", hour, min, second,year,month,day);

    RemoteViews updateView = new RemoteViews(context.getPackageName(),

    R.layout.time_widget_layout);

    //时间图像更新

    String packageString="org.owl.mythou";

    String timePic="time";

    int hourHbit = hour/10;

    updateView.setImageViewResource(R.id.hourHPic, getResources().getIdentifier(timePic+hourHbit, "drawable", packageString));

    int hourLbit = hour%10;

    updateView.setImageViewResource(R.id.hourLPic, getResources().getIdentifier(timePic+hourLbit, "drawable", packageString));

    int minHbit = min/10;

    updateView.setImageViewResource(R.id.MinuteHPic, getResources().getIdentifier(timePic+minHbit, "drawable", packageString));

    int minLbit = min%10;

    updateView.setImageViewResource(R.id.MinuteLPic, getResources().getIdentifier(timePic+minLbit, "drawable", packageString));

    //星期几

    updateView.setTextViewText(R.id.weekInfo, getWeekString(time.weekDay+1));

    //日期更新,根据日期,计算使用的图片

    String datePic="date";

    int year1bit = year/1000;

    updateView.setImageViewResource(R.id.Year1BitPic, getResources().getIdentifier(datePic+year1bit, "drawable", packageString));

    int year2bit = (year%1000)/100;

    updateView.setImageViewResource(R.id.Year2BitPic, getResources().getIdentifier(datePic+year2bit, "drawable", packageString));

    int year3bit = (year%100)/10;

    updateView.setImageViewResource(R.id.Year3BitPic, getResources().getIdentifier(datePic+year3bit, "drawable", packageString));

    int year4bit = year%10;

    updateView.setImageViewResource(R.id.Year4BitPic, getResources().getIdentifier(datePic+year4bit, "drawable", packageString));

    //月

    int mouth1bit = month/10;

    updateView.setImageViewResource(R.id.mouth1BitPic, getResources().getIdentifier(datePic+mouth1bit, "drawable", packageString));

    int mouth2bit = month%10;

    updateView.setImageViewResource(R.id.mouth2BitPic, getResources().getIdentifier(datePic+mouth2bit, "drawable", packageString));

    //日

    int day1bit = day/10;

    updateView.setImageViewResource(R.id.day1BitPic, getResources().getIdentifier(datePic+day1bit, "drawable", packageString));

    int day2bit = day%10;

    updateView.setImageViewResource(R.id.day2BitPic, getResources().getIdentifier(datePic+day2bit, "drawable", packageString));

    //点击widget,启动日历

    Intent launchIntent = new Intent();

    launchIntent.setComponent(new ComponentName("com.mythou.mycalendar",

    "com.mythou.mycalendar.calendarMainActivity"));

    launchIntent.setAction(Intent.ACTION_MAIN);

    launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK

    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    PendingIntent intentAction = PendingIntent.getActivity(context, 0,

    launchIntent, 0);

    updateView.setOnClickPendingIntent(R.id.SmallBase, intentAction);

    AppWidgetManager awg = AppWidgetManager.getInstance(context);

    awg.updateAppWidget(new ComponentName(context, TimeWidgetSmall.class),

    updateView);

    }

    }

    上面就是我的Service,因为我的界面时间和日期都是使用图片做的(纯属为了好看点)。所以多了很多根据时间日期计算使用的图片名字的代码,这些就是个人实际处理,这里不多说。

    有一点需要说明的是RemoteViews

    RemoteViews updateView = new RemoteViews(context.getPackageName(), R.layout.time_widget_layout);

    从我们的界面配置文件生成一个远程Views更新的对象,这个可以在不同进程中操作别的进程的View。因为Widget是运行在Launcher的进程里面的,而不是一个独立的进程。这也是一种远程访问机制。最后就是加了一个点击桌面Widget启动一个程序的功能,也是使用了PendingIntent的方法。

    编写一个桌面Widget主要就是这些步骤,最后补充一点,桌面Widget的界面布局只支持一部分android的标准控件,如果需要做复杂widget界面,需要自定义控件。这部分后面有时间再说~

    展开全文
  • Android机器人电池插件,点击可以查看电池信息详情。 修改了耗电量大的BUG,背景图片的透明度和颜色也略做了调整,显示效果更好。
  • 先利用AS创建一个ListWidget,系统会自动帮你生成一个AppWidgetProvider,以及布局文件 /xml中的list_widget_info.xml和/layout中的list_widget.xml这里就不具体介绍了。开始我们的小例子叭 list_widget.xml中添加...

    环境:win10
    编译软件 : AS
    这里只讲listview的基础用法,建议先查询widget相关知识后再来
    先利用AS创建一个ListWidget,系统会自动帮你生成一个AppWidgetProvider,以及布局文件 /xml中的list_widget_info.xml和/layout中的list_widget.xml这里就不具体介绍了。开始我们的小例子叭

    list_widget.xml中添加listview控件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#603BA3"
        android:padding="@dimen/widget_margin"
        android:orientation="vertical"
        android:theme="@style/ThemeOverlay.WidgetListTest.AppWidgetContainer">
      <TextView
            android:id="@+id/testText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="20sp"
            android:text="课表"/>
    <ListView
        android:id="@+id/listTest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    </LinearLayout>
    

    创建listview的子view :list_widget_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="horizontal"
        android:layout_margin="5dp"
    
        >
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <TextView
            android:id="@+id/class_mc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_marginBottom="5dp"
            android:textSize="18dp"
            />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
    <ImageView
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:src="@drawable/teacher"
        android:layout_marginRight="5dp"/>
    
            <TextView
                android:id="@+id/class_js"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="15dp"
                android:text="***"/>
            <ImageView
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:src="@drawable/place"
                android:layout_marginRight="5dp"/>
            <TextView
                android:id="@+id/class_dd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:text="***512"/>
    
        </LinearLayout>
    </LinearLayout>
        <TextView
            android:id="@+id/class_sj"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="17:00-18:40"
            android:textColor="@color/cardview_light_background"
            android:gravity="center"
       />
    </LinearLayout>
    

    创建一个list的服务适配器ListviewService

    class ListViewService : RemoteViewsService() {
        override fun onGetViewFactory(intent: Intent?): RemoteViewsFactory? {
            return ListRemoteViewsFactory(this.applicationContext, intent)
        }
    private class ListRemoteViewsFactory (context: Context, intent: Intent?): RemoteViewsFactory{
        private var mContext: Context? = context
        var appWidgetId = Integer.valueOf(intent?.getData()?.getSchemeSpecificPart())- ListWidget().m //得到原来的widgetId
    
        private val mList = ArrayList<String>()
    
    
        override fun onCreate() {
            mList.add(Date().toString())//获取系统的时间 相当于检测该适配器是否正常运行
            mList.add("计算机操作系统")
            mList.add("计算机操作系统")
            mList.add("计算机操作系统")
           mList.add("计算机操作系统")
    
    
        }
        override fun onDataSetChanged() {
            mList.clear()
            mList.add(Date().toString())//获取系统的时间 相当于检测该适配器是否正常运行
            mList.add("计算机操作系统")
            mList.add("计算机操作系统")
            mList.add("计算机操作系统")
            mList.add("计算机操作系统")
        }
        override fun onDestroy() {
            mList.clear()
        }
    
        override fun getCount(): Int {
            return mList.size
        }
    
        override fun getViewAt(position: Int): RemoteViews? {
            val views = RemoteViews(mContext!!.packageName, R.layout.list_widget_item)
    views.setTextViewText(R.id.class_mc,mList[position])
            Log.d("momo",mList[position])
            return views
        }
    
        /* 在更新界面的时候如果耗时就会显示 正在加载... 的默认字样,但是你可以更改这个界面
             * 如果返回null 显示默认界面
             * 否则 加载自定义的,返回RemoteViews
             */
        override fun getLoadingView(): RemoteViews? {
            return null
        }
    
        override fun getViewTypeCount(): Int {
            return 1
        }
    
        override fun getItemId(position: Int): Long {
            return position.toLong()
        }
    
        override fun hasStableIds(): Boolean {
            return false
        }
    }
    
    
    
    }
    
    • RemoteViewsService : 是一个远程的服务适配器 可以请求RemoteViews,管理RemoteViews的服务.
    • RemoteViewsFactory : 提供了RemoteViewsFactory用于填充远程集合视图。
    • onDataSetChanged():是用于更新listview中的数据的
    • getViewAt(position: Int):用于填充子view

    在AppWidgetProvider的update()中设置adapter

    class ListWidget : AppWidgetProvider() {
        var m=(0..1000).random() //随机数
        override fun onUpdate(
            context: Context,
            appWidgetManager: AppWidgetManager,
            appWidgetIds: IntArray
        ) {
            for (i in appWidgetIds){
    
    
            // There may be multiple widgets active, so update all of them
            val views = RemoteViews(context.packageName, R.layout.list_widget)
            views.setTextViewText(R.id.testText, "课表")
            val adapter = Intent(context, ListViewService::class.java)//创建适配器
            adapter.setData(Uri.fromParts("content",i.toString()+m.toString(),null))//加上一个随机数让RemoteViewsFactory认为是一个新的widgetid而重新创建新工厂RemoteViewsFactory
            views.setRemoteAdapter(R.id.listTest, adapter) //为list绑定adapter
            views.setEmptyView(R.id.listTest,android.R.id.empty)
            val mComponentName = ComponentName(context, ListWidget::class.java)
            appWidgetManager.updateAppWidget(mComponentName, views)
            }
        }
    
        override fun onEnabled(context: Context) {
            // Enter relevant functionality for when the first widget is created
        }
    
        override fun onDisabled(context: Context) {
            // Enter relevant functionality for when the last widget is disabled
        }
    }
    
    internal fun updateAppWidget(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetId: Int
    ) {
        val widgetText = context.getString(R.string.appwidget_text)
        // Construct the RemoteViews object
        val views = RemoteViews(context.packageName, R.layout.list_widget)
    
    
        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views)
    }
    

    为什么需要重新创建工厂: 是因为远程服务适配器会缓存所有widgetid的工厂,所以当你需要更新listview内容而发送请求时,服务适配器并不会为你重新创建工厂从而更新内容。这里还有一种方案:就是调用notifyAppWidgetViewDataChanged()方法,但是有时会没有效果,我也不知道为什么。
    m是一个公开的随机数

    效果图(内容有删减)大概差不多,懒得再运行一次了

    在这里插入图片描述

    展开全文
  • 接上两篇,如果想要实时更新widget的话,可以通过service去操作。 一、先新建一个AppwidgetService服务类继承Service public class AppWidgetService extends Service { private List strLists = new ArrayList()...
  • 目录(?)[+]二 添加 AppWidgetProviderInfo 三 AppWidgetProvider 五 widget工作原理   转载请标明出处:...  Widget安卓的一应用程序组件,学名窗口小部件,它是微型应用程序视图, 可以嵌入到其他
  • Android列表小部件(Widget)开发详解

    万次阅读 多人点赞 2018-06-21 13:35:28
    WidgetAndroid应用小部件,它可以作为一个微型视图嵌套在其他应用程序中(比如可以放置在桌面),并接收周期性更新。通常来说,小部件可以通过与App交互更方便的将App的内容展示给用户,同时它也是App的一个便捷...
  • Android桌面插件-时钟widget

    热门讨论 2012-11-14 00:03:25
    Android桌面插件-时钟widget 插入桌面widget时钟,可以选择多个时区,也可以自己添加代码进行改编和学习。
  • 主要事件方法:/*** Implementation of App Widget functionality.*/public class NewAppWidget extends AppWidgetProvider{/*** 到达指定的更新时间或者当用户向桌面添加AppWidget时被调用* */@Overridepublic void ...
  • Android6.0添加桌面插件Widget

    千次阅读 2017-04-05 13:53:15
    分析了AppWidget源码,那么如何添加自己定义的组件呢?先把效果图附上一、步骤:1、设计组件UI:widget_music.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wid
  • 科尔多瓦插件今天天气安卓小工具 科尔多瓦插件今天天气安卓小工具 如何制作来源清单 查找./src/android/res -type f | ./makeSources.sh ...科尔多瓦插件添加--link ../../cordova-plugin-todayweather-android-widget
  • 安卓系统将音量分为了多种,包括铃声通知音量、闹钟、通话、多媒体等多种音量,这种设计让用户在使用的时候更加自由,可有时候也会因为设置项过多而感觉麻烦。不妨试试Slider Widget,或许它会让音量调节变的...
  • 通过以上的步骤我们简单的实现了一个widget的开发步骤,用于初学者学习和交流,比较复杂的widget逻辑我们会加入网络访问,一些sevice进行数据交互,如果想要widget实现自动加入到桌面,或者widget支持自定义控件的话...
  • 由于自己桌面控件需要实现圆角+裁剪的图片显示,必须获取准确的AppWidget桌面控件宽高。查了百度一大堆资料都是不全的,然后上了下StackOverFlow终于找到答案并解决问题。class WidgetSizeProvider(private val ...
  • android时钟widget小部件源代码
  • android studio创建桌面插件widget

    千次阅读 2016-01-29 10:18:53
    试了一次,感觉还不如ecilipse好用,后来还是一直用的ecilipse,知道最近用起了android studio才发现真的很强大,支持各种功能,扯远了,在ecilipse中制作桌面插件,又要配置这个又要配置那个,而在android studio中...
  • 前言实习需要最近在研究AndroidWidget,看了很多帖子个人觉得比较零散,特地在此总结一下,写的不好大家见谅哈^_^本博客全套源码稍后会提供下载什么是Widgetwidget安卓较苹果特有的桌面小控件,Widget可以让我们...
  • 在上周,华为鸿蒙系统被曝在华为Mate 30系列手机上开启测试,并对该操作系统进行改进,不过测试的结果究竟如何呢?直到7月9日,一位不愿透露姓名的内测人员向外媒huawei...支持息屏显示,可添加Widget插件、消息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,230
精华内容 6,492
关键字:

安卓widget插件