`

Android 桌面组件【app widget】 进阶项目--心情记录器

阅读更多

本篇完成项目名称为:【心情记录器】

  可将你的心情讯录并用桌面组件的形式展示于桌面上,并有丰富的表情可供选择并加载在桌面上,此功能类似于QQ上的各性签名,虽然手机是自己的但我们用的是Android 手机,难免会有朋友拿来把玩,此时可以看到手机主人的心情状况不是很好吗?或许可以自己把一些不满的想法偷偷用心情记录下来也可以。注:此功能并不提供多个心情保存,只能保存一个,如果需要的朋友可以在后文为我提建议,当然我觉得多个心情保存个人不想要这个功能。。如果要的话请留言。

好了,废话了好多,先让大家看下图:

 

Tip:这个小东西完全 是App widget 桌面组件,所以必须通过长按桌面或者点击menu调出来。

 

上篇app Widget 的DEMO 只是为TextView 添加点击事件,本篇将换另外的做法。通过点击布局弹出一个Activity 的操作界面,之后在这个操作界面进行表情的选择和心情的保存,那么如何通过点击打开一个Activity 界面呢?

 

方法一:
在我们组件的updateAppWidget 中注册一个广播,为 TextView 添加 一个点击的广播,之后在onReceive  接收广播 中如下代码:

Intent intn=new Intent(context, update.class);
        intn.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intn);

通过为Intent 重新设置一个新的任务来打开Activity 此法即可启动一个Activity ,当然这种做法我是不建议的,因为重复了一个动作,具体怎么重复下文会具体告知大家。为TextView 注册广播可参考上面给出的链接,上文有介绍,在此就不多做介绍。

方法二:
此方法正是想告知大家如何重复的,即然我们可以为其注册广播那我们为什么不索性就为其做广播点击跳转?参考代码如下:

Intent intentClick = new Intent(context, update.class);
        PendingIntent pendingIntent 
= PendingIntent.getActivity(context, 0,
                intentClick, 
0);
        rv.setOnClickPendingIntent(R.id.layout, pendingIntent);

通过这里的设置,上文将不用再去接收广播也可以达到想要的效果。

 

 

下面是通过点击打开 Activity 操作界面的效果图,在这里有点不好意思啦,因为即兴画的很丑,大家就将就着看吧,主要是理解App widget 的写法

 

如何通过点击保存的与app Widget 做动态交互呢?来看下面这段代码

RemoteViews views = new RemoteViews(update.this
                        .getPackageName(), R.layout.main);
                views.setTextViewText(R.id.TextView01, text);
                views.setImageViewResource(R.id.ImageView01, util.image[index]);
                ComponentName widget 
= new ComponentName(update.this,
                        widgetProvider.
class);
                AppWidgetManager manager 
= AppWidgetManager
                        .getInstance(update.
this);
                manager.updateAppWidget(widget, views);

这里同样还是用到发RemoteViews 来接收值的变化,然后通过AppWidgetManager 这个桌面组件管理器去改新RemoteViews 。由于我们要时时刻保存用户记录的数据,这里只是用到了键值对保存。

下面贴出代码:

 

package com.terry;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;

public class update extends Activity {

    private EditText mEditText;
    private Button mButton;

    private Spinner mSpinner;

    private int index = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.update);

        mEditText = (EditText) findViewById(R.id.EditText01);
        mButton = (Button) findViewById(R.id.Button01);
        mSpinner = (Spinner) findViewById(R.id.Spinner01);
        final ImageView iv = (ImageView) findViewById(R.id.ImageView01);
        ArrayAdapter<String> adpter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_dropdown_item, util.text);
        adpter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(adpter);

        SharedPreferences settings = getSharedPreferences("settinginfo",
                Activity.MODE_PRIVATE);
        index = settings.getInt("imageState", 0);
        mEditText.setText(settings.getString("heart", ""));
        iv.setImageResource(util.image[index]);
        mSpinner.setSelection(index);
        mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub
                index = arg2;

                iv.setImageResource(util.image[index]);

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String text = mEditText.getText().toString();
                if (text.equals("")) {
                    return;
                }
                SharedPreferences shared = getSharedPreferences("settinginfo",
                        Activity.MODE_PRIVATE);
                SharedPreferences.Editor editor = shared.edit();
                editor.putInt("imageState", index);
                editor.putString("heart", text);
                editor.commit();
                RemoteViews views = new RemoteViews(update.this
                        .getPackageName(), R.layout.main);
                views.setTextViewText(R.id.TextView01, text);
                views.setImageViewResource(R.id.ImageView01, util.image[index]);
                ComponentName widget = new ComponentName(update.this,
                        widgetProvider.class);
                AppWidgetManager manager = AppWidgetManager
                        .getInstance(update.this);
                manager.updateAppWidget(widget, views);
                update.this.finish();

            }
        });

    }
}

 

由于组件每创建一次都调用了一次updateAppWidget 这个方法,故此方法也必须去获取键值对

package com.terry;

import android.app.Activity;
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.content.SharedPreferences;
import android.widget.RemoteViews;
import android.widget.Toast;

public class widgetProvider extends AppWidgetProvider {

    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);

        
        
    }

    public static void updateAppWidget(Context context,
            AppWidgetManager appWidgeManger, int appWidgetId) {
        rv = new RemoteViews(context.getPackageName(), R.layout.main);

        SharedPreferences shared = context.getSharedPreferences("settinginfo",
                Activity.MODE_PRIVATE);
        // util.index = settings.getInt("imageState", 0);
        // mEditText.setText(settings.getString("heart", ""));
        rv.setTextViewText(R.id.TextView01, shared.getString("heart", context
                .getResources().getString(R.string.load)));
        rv.setImageViewResource(R.id.ImageView01, util.image[shared.getInt(
                "imageState", 0)]);

        Intent intentClick = new Intent(context, update.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                intentClick, 0);
        rv.setOnClickPendingIntent(R.id.layout, pendingIntent);
        appWidgeManger.updateAppWidget(appWidgetId, rv);
    }
}

 

 

 

 

分享到:
评论
3 楼 285985787 2012-05-22  
谢谢了哈哈
2 楼 04023129 2010-10-11  
多谢,正在找这方面的资料呢
1 楼 xihuan&java 2010-09-21  
请教一个问题:在activity里怎么添加widget到桌面?
比如我在浏览listview里的内容,想把某条信息添加到桌面,楼主要什么好的方法没?

相关推荐

    Android开发教程之桌面组件【widget】初探--千锋培训

    在Android开发中,桌面组件(Widget)是一种可以让用户在手机或平板电脑的主屏幕上直接查看和操作的应用小部件。本文将深入探讨如何在Android中创建和使用Widget,以及相关的框架类和方法。 首先,我们来看App...

    android 桌面组件 App widget的使用 AppWidgetProvider

    Android 桌面组件,又称为 App Widget,是 Android 系统中一种独特且实用的功能。它允许开发者创建小型的应用程序界面,用户可以直接在主屏幕上进行交互,无需打开完整的应用程序。App Widget 提供了一种快捷的方式...

    android 桌面控件appwidget

    Android 桌面控件(AppWidget)是Android操作系统提供的一种独特功能,允许开发者创建可以在用户主屏幕上显示的小型应用程序组件。这些控件通常提供快速访问应用的核心功能或展示实时信息,如天气预报、日历事件或...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...

    Android桌面组件App Widget完整案例

    本文实例讲述了Android桌面组件App Widget用法。分享给大家供大家参考。具体如下: 这里模拟一个案例:把AppWidget添加到桌面后,点击AppWidget后AppWidget文本会轮回改变 main.xml布局文件: &lt;?xml version=1.0...

    Android应用源码之Android小部件AppWidget-IT计算机-毕业设计.zip

    在Android平台上,AppWidget是Android小部件,它们是桌面组件,允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用程序。本项目是针对Android应用源码的学习与毕业设计,旨在帮助开发者理解如何创建和集成...

    Android桌面小组件(AppWidget)

    在Android系统中,桌面小组件(AppWidget)是一种允许用户在主屏幕上与应用程序进行交互的UI元素。它们提供了一种快捷的方式,使用户无需打开应用就能获取信息或执行某些操作。"Android桌面小组件(AppWidget)"这个...

    calculatorpp-android-app-widget-1.6.0-sources.jar

    jar包,亲测可用

    Android心情记录器(App widget 桌面组件)应用例子.rar

    可将你的心情讯录并用桌面组件的形式展示于桌面上,并有丰富的表情可供选择并加载在桌面上,此功能类似于QQ上的各性签名,可以看到手机主人的心情状况不是很好,注:因为这个小程序完全是App widget 桌面组件,所以...

    安卓app开发项目-LumaQQ-Android qq 代码(源码).zip

    安卓app开发项目-LumaQQ-Android qq 代码(源码).zip安卓app开发项目-LumaQQ-Android qq 代码(源码).zip安卓app开发项目-LumaQQ-Android qq 代码(源码).zip安卓app开发项目-LumaQQ-Android qq 代码(源码).zip安卓app...

    Android -- AppWidget源码.zip

    在Android系统中,AppWidget是桌面小部件的实现,它允许开发者将应用程序的功能和信息集成到用户的主屏幕上,用户无需打开应用即可与之交互。这个压缩包“Android -- AppWidget源码.zip”很可能是包含了Android App...

    android之appwidget(一)简单appwidget

    在Android平台上,AppWidget是系统桌面的一个组成部分,它允许开发者创建小型、静态或动态的应用程序组件,用户可以直接在主屏幕上与这些组件互动,无需打开完整的应用程序。本篇将深入探讨如何开发一个简单的App...

    Android小部件AppWidget

    Android小部件AppWidget是Android操作系统中的一个重要特性,它允许用户在主屏幕上放置应用程序的轻量级视图,提供快速访问或交互的功能。AppWidget并非完整的应用程序,而是应用程序的一个部分,通常展示简化的UI和...

    Android应用源码之android Widget小组件开发-IT计算机-毕业设计.zip

    本项目是针对Android Widget小组件开发的一个毕业设计示例,适合学习和理解Android应用的源码实现。在这个压缩包中,包含了一个完整的Android应用源码,可以作为深入理解Android Widget开发的参考资料。 1. **...

    android 桌面小窗口 widget demo

    Android 桌面小窗口,通常被称为Widget,是Android操作系统提供的一种特性,允许开发者创建可以在用户主屏幕上的小应用程序。这些小窗口可以显示实时信息,如天气、新闻、日历事件,甚至提供简单的交互功能。在本篇...

    Android-Android桌面小部件widget日签Or日历可作为桌面日历

    在Android平台上,开发者可以利用Android桌面小部件(Widget)功能为用户提供便捷的桌面服务,比如“Android桌面小部件widget日签Or日历可作为桌面日历”就是一个很好的例子。这个应用设计巧妙,不仅展示了日期,还...

    安卓Widget小组件相关-Android小部件AppWidget.rar

    这个压缩包“Android小部件AppWidget.rar”似乎包含了一些关于创建和实现Android Widget小组件的资源,可能是源代码、文档或者示例项目。 在Android开发中,AppWidget是Widget小组件的主要实现类。它是由Android ...

    Android小部件AppWidget-IT计算机-毕业设计.zip

    【Android小部件AppWidget】是Android操作系统中的一种特殊组件,它允许用户在主屏幕上放置小型的应用程序界面元素,提供快捷的操作或显示实时信息。在Android应用开发中,AppWidget是扩展应用程序功能的一种方式,...

Global site tag (gtag.js) - Google Analytics