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 介面呢?
下面是通過點擊開啟 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:上面所有知識點,之前所有文章都有提到,有不懂的地方可以自行做參考。