1. 程式人生 > >Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity

Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity

map onclick widgets info xtra ces extends height appwidget

文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingflying/以及作者@愷風Wei。

通過widget定義。我們在widget列表中看到了我們的TestWidget。當我們拖拽widget到主頁時。假設在appwidet-provider中定義了android:configure的java類,在widget實例創建後會立即喚起配置activity。這個activity主要完畢兩個任務:1、配置初始化數據;2、將配置數據適配到widget實例中。

利用preference中存貯配置數據

widget數據能夠保持在文件、Share preference,或者SQLite3中。

widget作為小工具配置數據量小,通常能夠方便地存貯在preference中。

preference中數據存貯和讀取使用BirthDayStoreData類來處理。

我們在Pro Android學習筆記(六三):Preferences(7):代碼控制首選項中的“利用preference保存狀態”已經介紹過怎樣實現,在此,復習一下。

我們須要存貯的內容有widgetID。名字。生日,Preference是以鍵值對的方式保存,我們以name_widgetID作為key。生日作為value來進行信息存貯。

public class BirthDayStoreData {
private final static String BIRTHDAY_WIDGET_PROVIDER_NAME = "cn.wei.flowingflying.testwidget.provider";


//保存配置數據:創建widget實例,通過configure activity進行配置時,保存相關配置數據
public static void storeData(Context context,int widgetId, String name,String value){
String key = getKey(widgetId,name);
//第一個參數是preferences文件,假設不存在則創建之。詳細為/data/data/cn.wei.flowingflying.testwidget/shared_prefs/cn.wei.flowingflying.testwidget.provider.xml,能夠在DDMS中查看。

Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.putString(key, value);
editor.commit();

}

//刪除配置數據:刪除widget實例的同一時候。須要刪除該實例的相關數據
public static void removeData(Context context, int widgetId){
String key = getKeyById(context, widgetId);
if(key == null)
return;
Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.remove(key);
editor.commit();
}
//清空所有的配置數據
public static void removeAllData(Context context){
Editor editor = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
}

//顯示配置數據:用於我們在LogCat中進行跟蹤,在此。我們也演示了怎樣通過輪詢方式。顯示所有的數據,通過類似的方式,我們能夠同widgetId查得相應的名字和生日,通過類似的方法,可依據widgetId查詢key。名字,生日。相關代碼從略。
public static void showData(Context context){
SharedPreferences prefs = context.getSharedPreferences(BIRTHDAY_WIDGET_PROVIDER_NAME, Context.MODE_PRIVATE);
Map<String,?

> pairs = prefs.getAll();
Log.d("DATA","Total " + pairs.size() + " widgets:");
for(String key:pairs.keySet()){
String value = (String)pairs.get(key);

Log.d("DATA",key + " - " + value);
}
}

public static String getNameById(Context context, int widgetId){
… …
}

public static String getDateById(Context context ,int widgetId){
… …
}

private static String getKey(int widgetId, String name){
return name + "_" + widgetId;
}

private static String getKeyById(Context context,int widgetId){
… …
}

}

配置初始化數據

配置configure activity的代碼例如以下:

public class ConfigBirthDayWidgetActivity extends Activity{
private static String tag = "ConfigActivity";
private int myWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;

@Override //配置activity的操作和普通activity的一樣。但在被AppWidgetManage喚起時,intent是攜帶widgetId的信息。我們在onCreate()中獲取Widget ID。
protected void onCreate(Bundle savedInstanceState) {
… …
Intent intent = getIntent();
Bundle b = intent.getExtras();
if(b != null){
myWidgetId = b.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
}

if(myWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){
Toast.makeText(this, "Widget Error : 無有效widget ID", Toast.LENGTH_LONG).show();
finish();
}

}

.. ….

//點擊配置button後調用的方法
private void getAndStoreConfigInfo(){
… … String name為用戶輸入名字,String date為用戶輸入的有效日期
//【1】在preference中保持數據,並顯示全部數據
BirthDayStoreData.storeData(this, myWidgetId, name, date);
BirthDayStoreData.showData(this);
//【2】將配置數據與詳細的widget實例相關聯,詳細實現見後面
BirthDayStoreData.updateAppWidget(this, myWidgetId,name, date);

//【3】將結果返回給AppWidget Manager。以通知它Configurator已經完畢。

作用如同startActivityForResult()給出返回值。通知AppWidgetManager某個widgetId已經完畢配置,能夠在主頁上顯示創建的widget實例
Intent resultIntent = new Intent();
resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, myWidgetId);
setResult(RESULT_OK, resultIntent);

//【4】關閉activity
finish();
}
}

配置數據適配到widget實例中

Widget實例的view要通過RemoteViews進行控制,小樣例採用靜態方法的方式。代碼片段例如以下:

public class BirthDayStoreData {
... ...

public static void updateAppWidget(Context context,int widgetId,String name, String date){
//【1】設置Remote view的信息
// 1.1)、獲得remote view對象
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.birday_widget);
// 1.2)、對remote view進行setText()設置
views.setTextViewText(R.id.bd_name, widgetId + ":" + name);
views.setTextViewText(R.id.bd_date, date);
views.setTextViewText
(R.id.bd_days, Long.toString(Utils.howFarInDays(Utils.getDate(date))));//Utils是處理日期的類
// 1.3)、通過PendingIntent設置某個view的點擊處理,採用intent方式,能夠打開activity,service。receiver等等。

本小樣例將打開某個網頁
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.taobao.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.bd_buy, pi);


//【2】通過AppWidgetManger,詳細實施到widgetId實例上。


AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(widgetId,views);

}

public static void updateAppWidget(Context context,int widgetId){
… …
}

}

小樣例代碼在:Pro Android學習:widget小樣例

相關鏈接:我的Android開發相關文章

Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity