Android 案頭組件【app widget】 進階項目–心情記錄器

來源:互聯網
上載者:User

http://www.cnblogs.com/TerryBlog/archive/2010/08/10/1796896.html    

之前有一篇是初探 Android App Widget 的文章,今天繼續對上一例子進行擴充,並完成了一個小項目,直接可以拿來使用。上篇文章地址:Android 案頭組件【widget】初探 ,未接觸過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);
    }
}

 

 

 

Tip:上面所有知識點,之前所有文章都有提到,有不懂的地方可以自行做參考。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.