当前位置:  编程技术>移动开发
本页文章导读:
    ▪短信常用语-剔除,编辑,插入界面        短信常用语-删除,编辑,插入界面     插入      ......
    ▪ AppWidgetProvider 施用        AppWidgetProvider 应用 1、AppWidget 框架类 2、在 Android 如何使用 Widget 3、AppWidget 框架的主要类介绍 4、DEMO 讲解 1、AppWidget 框架类 1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、e.........
    ▪ 自定义弹出式对话框(与ListView的组合)       自定义弹出式对话框(与ListView的结合)    核心代码:   case R.id.button: LayoutInflater inflater = LayoutInflater.from(this);// 渲染器 View customdialog2view = inflater.inflate(R.layout.customdialog2, null); A.........

[1]短信常用语-剔除,编辑,插入界面
    来源: 互联网  发布时间: 2014-02-18
短信常用语-删除,编辑,插入界面

 

 

插入

  

 


    
[2] AppWidgetProvider 施用
    来源: 互联网  发布时间: 2014-02-18
AppWidgetProvider 应用

1、AppWidget 框架类
2、在 Android 如何使用 Widget
3、AppWidget 框架的主要类介绍
4、DEMO 讲解
1、AppWidget 框架类

1、AppWidgetProvider :继承自 BroadcastRecevier , 在AppWidget 应用 update、enable、disable 和 delete 时接收通知。其中,onUpdate、onReceive 是最常用到的方法,它们接收更新通知。
2、 AppWidgetProvderInfo:描述 AppWidget 的大小、更新频率和初始界面等信息,以XML 文件形式存在于应用的 res/xml/目录下。
3、AppWidgetManger :负责管理 AppWidget ,向 AppwidgetProvider 发送通知。
4、RemoteViews :一个可以在其他应用进程中运行的类,向 AppWidgetProvider 发送通知。
2、在 Android 如何使用 Widget

1、长按主界面

2、之后弹出一个对话框,里面就有android 内置的一些桌面组件



3、AppWidget 框架的主要类介绍

1) AppWidgetManger 类

bindAppWidgetId(int appWidgetId, ComponentName provider)
通过给定的ComponentName 绑定appWidgetId
getAppWidgetIds(ComponentName provider)
通过给定的ComponentName 获取AppWidgetId
getAppWidgetInfo(int appWidgetId)
通过AppWidgetId 获取 AppWidget 信息
getInstalledProviders()
返回一个List<AppWidgetProviderInfo>的信息
getInstance(Context context)
获取 AppWidgetManger 实例使用的上下文对象
updateAppWidget(int[] appWidgetIds, RemoteViews views)
通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件
updateAppWidget(ComponentName provider, RemoteViews views)
通过 ComponentName 对传进来的 RemoeteView 进行修改,并重新刷新AppWidget 组件
updateAppWidget(int appWidgetId, RemoteViews views)
通过appWidgetId 对传进来的 RemoteView 进行修改,并重新刷新AppWidget 组件
2) 继承自 AppWidgetProvider 可实现的方法为如下:

1、onDeleted(Context context, int[] appWidgetIds)
2、onDisabled(Context context)
3、onEnabled(Context context)
4、onReceive(Context context, Intent intent)
Tip:因为 AppWidgetProvider 是继承自BroadcastReceiver  所以可以重写onRecevie 方法,当然必须在后台注册Receiver
5、onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
4、Demo讲解

下面是我今天做的一个实例,提供给大家练习时做参考,效果如下:在布局中放一个 TextView 做桌面组件,然后设置TextView 的 Clickable="true" 使其有点击的功能,然后我们点击它时改变它的字体,再点击时变回来,详细操作如下流程:

1、新建AppWidgetProvderInfo
2、写一个类继承自AppWidgetProvider
3、后台注册Receiver
4、使 AppWidget 组件支持点击事件
5、如何使TextView 在两种文本间来回跳转
问题抛出来了,那么一起解决它吧。

1、新建AppWidgetProvderInfo

代码如下:




<?xml version="1.0" encoding="UTF-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="60dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    
    android:initialLayout="@layout/main">
</appwidget-provider>




Tip:上文说过AppWidgetProvderInfo 是在res/xml 的文件形式存在的,看参数不难理解,比较重要的是这里android:initialLayout="@layout/main" 此句为指定桌面组件的布局文件。

2、写一个类继承自AppWidgetProvider

主要代码如下:



public class widgetProvider extends AppWidgetProvider




并重写两个方法



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

@Override
    public void onReceive(Context context, Intent intent) {}




Tip:onUpdate 为组件在桌面上生成时调用,并更新组件UI,onReceiver 为接收广播时调用更新UI,一般这两个方法是比较常用的。

3、后台注册Receiver

后台配置文件代码如下:



<receiver android:name=".widgetProvider">
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/appwidget_provider"></meta-data>
            <intent-filter>
                <action android:name="com.terry.action.widget.click"></action>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                
            </intent-filter>
        </receiver>


Tip:因为是桌面组件,所以暂时不考虑使用Activity 界面,当然你在实现做项目时可能会需要点击时跳转到Activity 应用程序上做操作,典型的案例为Android  提供的音乐播放器。上面代码中比较重要的是这一句 <meta-data android:name="android.appwidget.provider"  android:resource="@xml/appwidget_provider"></meta-data>  大意为指定桌面应用程序的AppWidgetProvderInfo  文件,使其可作其管理文件。


4、使 AppWidget 组件支持点击事件

先看代码:



public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, int appWidgetId) {
        rv = new RemoteViews(context.getPackageName(), R.layout.main);
        Intent intentClick = new Intent(CLICK_NAME_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                intentClick, 0);
        rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }


此方法为创建组件时 onUpdate 调用的更新UI的方法,代码中使用RemoteView 找到组件的布局文件,同时为其设置广播接收器CLICK_NAME_ACTION并且通过RemoteView 的setOnClickPendingIntent 方法找到我想触发事件的TextView 为其设置广播。接着



@Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);

        if (rv == null) {
            rv = new RemoteViews(context.getPackageName(), R.layout.main);
        }
        if (intent.getAction().equals(CLICK_NAME_ACTION)) {
            if (uitil.isChange) {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.load));

            } else {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.change));

            }
            Toast.makeText(context, Boolean.toString(uitil.isChange),
                    Toast.LENGTH_LONG).show();
            uitil.isChange = !uitil.isChange;

        }
        AppWidgetManager appWidgetManger = AppWidgetManager
                .getInstance(context);
        int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
                context, widgetProvider.class));
        appWidgetManger.updateAppWidget(appIds, rv);
    }




在onReceiver 中通过判断传进来的广播来触发动作。



5、如何使TextView 在两种文本间来回跳转

如何 TextView 在来两种状态中来回呢?这也是我比较调试最久的一个难点,问题出在对 AppWidget 的理解不够深入。 如果我的设想没错的话AppWidget 的生命周期应该在每接收一次广播执行一次为一个生命周期结束,也就是说你在重写的 AppWidgetProvider 类里面声明全局变量做状态判断,每次状态改变AppWidgetProvider 再接收第二次广播时即为你重新初始化也就是说桌件为你重新实例化了一次AppWidgetProvider 。今天我因为在里面放了一个boolean 值初始化为true ,观察调试看到每次进入都为TRUE 故你在设置桌面组件时,全局变量把它声明在另外一个实体类用来判断是没问题的,切忌放在本类。代码参考onReceiver方法。

效果图如下:





代码:



package com.terry;

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;
import android.widget.Toast;

public class widgetProvider extends AppWidgetProvider {
    private static final String CLICK_NAME_ACTION = "com.terry.action.widget.click";

    private static RemoteViews rv;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);

        if (rv == null) {
            rv = new RemoteViews(context.getPackageName(), R.layout.main);
        }
        if (intent.getAction().equals(CLICK_NAME_ACTION)) {
            if (uitil.isChange) {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.load));

            } else {
                rv.setTextViewText(R.id.TextView01, context.getResources()
                        .getString(R.string.change));

            }
            Toast.makeText(context, Boolean.toString(uitil.isChange),
                    Toast.LENGTH_LONG).show();
            uitil.isChange = !uitil.isChange;

        }
        AppWidgetManager appWidgetManger = AppWidgetManager
                .getInstance(context);
        int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
                context, widgetProvider.class));
        appWidgetManger.updateAppWidget(appIds, rv);
    }

    public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, int appWidgetId) {
        rv = new RemoteViews(context.getPackageName(), R.layout.main);
        Intent intentClick = new Intent(CLICK_NAME_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                intentClick, 0);
        rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }
}


    
[3] 自定义弹出式对话框(与ListView的组合)
    来源: 互联网  发布时间: 2014-02-18
自定义弹出式对话框(与ListView的结合)

  

核心代码:

 

case R.id.button:
			LayoutInflater inflater = LayoutInflater.from(this);// 渲染器
			View customdialog2view = inflater.inflate(R.layout.customdialog2,
					null);

			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("自定义对话框");
			// builder.setTitle("意见模版");
			builder.setView(customdialog2view);
			builder.setPositiveButton("确定",
					new DialogInterface.OnClickListener() //
					{// 确定按钮的单击事件
						public void onClick(DialogInterface dialog, int which) {
							for (int i = 0; i < isSelect.length; i++) {
								if (isSelect[i]) { // 如果该选项被选中
									result = result + opition[i] + "、";
								}
							}
							try {
								etEditText.setText(result.substring(0, result
										.length() - 1));
							} catch (Exception e) {
							}
							result = "";
						}
					});
			builder.setNegativeButton("取消",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub

						}
					});

			ListView listView = (ListView) customdialog2view
					.findViewById(R.id.lv);
			listView.setAdapter(adapter);
			listView.setItemsCanFocus(false);
			listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
			listView.setOnItemClickListener(new OnItemClickListener() {
				@Override
				public void onItemClick(AdapterView<?> parent, View view,
						int position, long id) {
					ViewHolder vHollder = (ViewHolder) view.getTag();// 在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。
					vHollder.cBox.toggle();// 反转当前视图的选中状态
					if (vHollder.cBox.isChecked() == true) {
						isSelect[position] = true;

					} else {
						isSelect[position] = false;
					}
					MyAdapter.isSelected.put(position, vHollder.cBox
							.isChecked());
				}
			});

			opinionsDialog = builder.create();
			opinionsDialog.show();
			break;

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
编程语言 iis7站长之家
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3