加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

桌面组件Appwidget的应用实例以及导入第三方jar包的问题处理

发布时间:2021-12-15 10:59:02 所属栏目:教程 来源:互联网
导读:打开eclipse发现自己昨天做的天气预报有错,很诡异,在eclipse的工程前面有一个小错号,但是却没有报什么地方有错,于是,自己用傻类吧唧的重新再建一个工程,重新导入第三方的jar包sax2r2.jar的包,注意就是这个包的路径出现了错误,由于我把sax2r2.jar放在

打开eclipse发现自己昨天做的天气预报有错,很诡异,在eclipse的工程前面有一个小错号,但是却没有报什么地方有错,于是,自己用傻类吧唧的重新再建一个工程,重新导入第三方的jar包sax2r2.jar的包,注意就是这个包的路径出现了错误,由于我把sax2r2.jar放在桌面上,用完感觉到没什么用后就直接删了,然后重启一下eclipse后就发现了工程前面有错好,当时那个纠结加郁闷,于是上网上搜索了一下,再加上学长的提示,终于把这个问题解决了,
解决步骤如下:
 
首先,以后 在导入jar包的时候最好把jar包放入到自己建的工程里,这样当再次使用的时候,自己导入的jar包就不会因为丢失而郁闷路径path的问题了,
 
其次,如果不小心把jar包给删了,解决的方法如下:在自己的工程右键选择properties---Java Build Path ----Libraries----sax2r2.jar(选中导入的jar包)会出现错号,或者显示jar包miss丢失,如果出现这种情况,直接选中,然后Remove,然后再重新导入一下jar包(注意这次不要把它在从电脑中误删喽!!!),
 
导入jar步骤如下:在自己的工程右键选择properties---Java Build Path ----Libraries----Add External JARS--选择电脑中的jar包---然后同一个界面下的Order and Export 在自己导入的jar包前勾选,然后点击OK就可以了    
 
2,今天解决的第二个问题,在多个Xml文件进行布局调用多个Activity时候,由于导包错误,导致自己定义布局的mapview.XML找不到layout,既setContentView(R.layout.mapview);找不到在R.java文件中注册的id,解决方法是直接删除 import Android.R;从新导入自己包中的R.这样问题就可以解决了。
 
3.今天学习的内容是app widget  其中两个重要的东西,
 
AppWidgetProviderInfo对象    为App widget提供元数据(布局、更新频率等等)
AppWidgetProvider定义App Widget的基本生命周期函数
PendingIntent 类似锦囊的意思
创建方法有:1、getActivity(Context context,int requestCode,Intent intent ,int flags)  2、getBroadcast(Context context,int requestCode,Intent intent ,int flags)   3、getService(Context context,int requestCode,Intent intent ,int flags)
RemoteViews 表示一系列的View对象 表示对象运行在另外一个进程当中
4.注意AppWidget和主程序不在同一个进程当中,不能用普通的方法进行操作,但可以用一下方法,比如:RemoteView是中的一些方法,
 
好了废话不多说了,看看今天要实现的桌面组件AppWidget的过程
 
1.首先先看布局 一个简单的文本,图片、和按钮
 
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  
  
    <TextView  
        android:id="@+id/app"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="暑假第二十天下午好!!!"   
        android:textColor="#FF6130"  
        />  
  
    <ImageView  
        android:id="@+id/image"  
        android:layout_width="40dp"  
        android:layout_height="40dp"  
        android:src="@drawable/a" />  
  
    <Button  
        android:id="@+id/button"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="测试widget" />  
  
</LinearLayout>  
2.想要实现桌面组件,还需要在res的目录下建一个文件夹,里面包含一个XML文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>  
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
android:minHeight="80dp"  
android:minWidth="300dp"  
android:updatePeriodMillis="30000"  
android:initialLayout="@layout/appwidget">  
  
</appwidget-provider>  
3.看看主活动里面的内容:
package com.wang.provider;  
  
import com.wang.R;  
  
import android.app.PendingIntent;  
import android.appwidget.AppWidgetManager;  
import android.appwidget.AppWidgetProvider;  
import android.content.ComponentName;  
import android.content.Context;  
import android.content.Intent;  
import android.widget.RemoteViews;  
  
public class Appwidgetprovider extends AppWidgetProvider {  
    // 常量字符串用于命名Action   
    private static final String UPDATE_ACTION = "wang.UPDATE_APP_WIDGET";  
      
    //调用自身的方法   
    public void onDeleted(Context context, int[] appWidgetIds) {  
    }  
  
    @Override  
    public void onDisabled(Context context) {  
    }  
  
    @Override  
    public void onEnabled(Context context) {  
    }  
  
    @Override  
    public void onReceive(Context context, Intent intent) {  
         // 获取当前的意图动作   
        String action = intent.getAction();  
          
        if (UPDATE_ACTION.equals(action)) {  
           //描述了一个视图层次结构,可以显示在另一个进程   
            //创建一个新的RemoteViews对象将显示视图包含在指定的布局文件。   
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),  
                    R.layout.appwidget);  
            //设置图片资源   
            remoteViews.setImageViewResource(R.id.image, R.drawable.b);  
            //设置文本内容   
            remoteViews.setTextViewText(R.id.app, "今天都学到了什么???");  
            //获取AppWidgetManager实例用于提供的上下文对象   
            AppWidgetManager appWidgetManager = AppWidgetManager  
                    .getInstance(context);  
            /*****ComponentName为一个特定的应用程序组件的标识符(活动、服务,
             * 或ContentProvider BroadcastReceiver)可用。
             * 两条信息,封装在这里,都必须确定一个组件:这个包(一个字符串),
             *  它存在于,类(一个字符串)的名字里面的包
            ***/  
            ComponentName componentName = new ComponentName(context,  
                    AppWidgetProvider.class);  
            /***设置RemoteViews用于所有实例AppWidget为所提供AppWidget提供者。  
             * 调用这个方法既在一个ACTION_APPWIDGET_UPDATE广播、内外的处理程序。
             * 这种方法只会工作,当调用从uid,拥有AppWidget提供者。更新appwidget**/  
            appWidgetManager.updateAppWidget(componentName, remoteViews);  
  
        } else {  
            //实现接受上下文的的方法和意图   
            super.onReceive(context, intent);  
  
        }  
  
    }  
  
    @Override  
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
            int[] appWidgetIds) {  
        // for (int i = 0; i < appWidgetIds.length; i++) {   
        //             
        // System.out.println(appWidgetIds[i]);   
        // //创建一个intent的对象   
        // Intent intent =new Intent(context,Target.class);   
        // //创建一个pendingitent对象   
        // PendingIntent pendingIntent=PendingIntent.getActivity(context, 0,   
        // intent, 0);   
        // RemoteViews remoteViews=new   
        // RemoteViews(context.getPackageName(),R.layout.appwidget);   
        // //为按钮绑定事件处理器   
        // //,第一个参数用来指定被绑定的处理器的的ID   
        // //第二个参数是用来指定当事件发生时候,哪一个pendingintent会被执行   
        // remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);   
        // ///g更新Appwidget   
        // appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);   
        // }   
  
        Intent intent = new Intent();  
        // 为intent对象设置Action   
        intent.setAction(UPDATE_ACTION);  
        // 使用getBroadcast方法得到一个对象,当该对象执行时候,将发送一个广播   
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,  
                intent, 0);  
        //声明一个RemoteViews的对象   
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),  
                R.layout.appwidget);  
        //设置点击事件   
        remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);  
        // /g更新Appwidget   
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  
    }  
  
}  
4.亲、今天不是添加的权限,但是也是不能忘记添加的receiver
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.wang"  
    android:versionCode="1"  
    android:versionName="1.0" >  
  
    <uses-sdk android:minSdkVersion="10" />  
  
    <application  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name" >  
        <activity  
            android:name=".AppWidgetTestActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
  
        <receiver android:name="Appwidgetprovider" >  
              
            <intent-filter>  
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
            </intent-filter>  
              
            <intent-filter>  
                <action android:name="wang.UPDATE_APP_WIDGET" />  
            </intent-filter>  
            <!-- 元数据 -->  
            <meta-data  
                android:name="android.appwidget.provider"  
                android:resource="@xml/appwidgettest" />  
        </receiver>  
    </application>  
  
</manifest>  
5.运行结果如下:首先长按桌面--->窗口小部件----->appwidgetTest---->结果,点击按钮切换图片和文本

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读