我要发布我的所有文件,最后,我会告诉你可能是什么问题.我不知道的是解决方案.
widgetconfigure.xml
这是配置acitivty的布局.我不会发布这个xml.它在布局中有文字浏览.
widget_layout.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="72dip" android:layout_height="72dip" android:layout_gravity="center" android:id="@+id/widgetlayout"> <ImageView android:id="@+id/ImageView01" android:layout_width="72dip" android:layout_height="72dip" android:scaleType="fitXY"> </ImageView> <TextView android:id="@+id/tvConfigInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="left" android:textColor="#FFFFFF" android:layout_marginLeft="3dip" android:layout_marginRight="3dip" android:textSize="12dip" /> </RelativeLayout>
我注册我的配置活动和appwidgetprovider的清单的一部分:
<activity android:name=".WidgetConfig" android:label="@string/app_name" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> <receiver android:name=".MyWidgetProvider" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <Meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"></Meta-data> </receiver>
XML / widget_info.xml
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_layout" android:minHeight="72dp" android:minWidth="72dp" android:configure="com.b2creative.notepad.WidgetConfig"> </appwidget-provider>
WidgetConfig.java
这是配置活动.用户选择窗口小部件的背景和文本颜色,列表视图中的文本显示在窗口小部件上.我将只发布相关部分:
AppWidgetManager awm; int awID; Intent i = getIntent(); Bundle extras = i.getExtras(); if (extras != null) { awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID); } else { finish(); } awm = AppWidgetManager.getInstance(c); //the code from here is in a button onclicklistener that sets the widget. RemoteViews views = new RemoteViews(c.getPackageName(),R.layout.widget_layout); views.setTextViewText(R.id.tvConfigInput,widgettext); views.setTextColor(R.id.tvConfigInput,loadedtextcolor); views.setFloat(R.id.tvConfigInput,"setTextSize",int_widgetfontsize); Paint p = new Paint(); p.setAntiAlias(true); p.setStyle(Style.FILL); p.setColor(loadedbgcolor); Bitmap bitmap = Bitmap.createBitmap(GetDipsFromPixel(72),GetDipsFromPixel(72),Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); RectF rect = new RectF(0,GetDipsFromPixel(72)); canvas.drawRoundRect(rect,10,p); views.setImageViewBitmap(R.id.ImageView01,bitmap); Intent in = new Intent(c,Notepad.class); PendingIntent pi = PendingIntent.getActivity(c,in,0); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,awID); setResult(RESULT_OK,result); awm.updateAppWidget(awID,views); finish();
MyWidgetProvider.java
public class MyWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) { super.onUpdate(context,appWidgetManager,appWidgetIds); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(),R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput,"Something"); appWidgetManager.updateAppWidget(awID,v); } } @Override public void onDeleted(Context context,int[] appWidgetIds) { super.onDeleted(context,appWidgetIds); } }
所以我很确定问题出在onUpdate方法,因为我没有设置窗口小部件的布局.我留下了一行//显示如果我添加它,我得到一个没有背景的小部件,但文本“Something”.
在这个方法中,我应该如何设置背景颜色,小部件的textcolor和widget的TextView文本?我不认识它们,用户在添加窗口小部件时设置它们.或者我应该做什么?
编辑
我补充说
saveTitlePref(this,AppWidgetManager.INVALID_APPWIDGET_ID,widgettext);到WidgetConfig.java中的onClick方法,所以当用户在配置acitivty中按OK时,将使用appwidgetid保存widgettext(Idk what appwidgetid,因为代码使用AppWidgetManager.INVALID_APPWIDGET_ID).
为了这个工作,我需要这个:
static void saveTitlePref(Context context,int appWidgetId,String text) { SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME,0).edit(); prefs.putString(PREF_PREFIX_KEY + appWidgetId,text); prefs.commit(); }
在MyWidgetProvider类中,我修改了for循环,如下所示:
final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(),R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput,"Something"); v.setTextViewText(R.id.tvConfigInput,loadTitlePref(context,AppWidgetManager.INVALID_APPWIDGET_ID)); appWidgetManager.updateAppWidget(awID,v); }
我在哪里添加
static String loadTitlePref(Context context,int appWidgetId) { SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,0); String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId,null); String nothing = "empty"; if (prefix != null) { return prefix; } else { return nothing; } }
它仍然不起作用,但越来越近了.我在主屏幕上放置了两个带有不同文本的小部件,然后重新安装该应用程序.现在这两个小部件都有文本(当然,因为我设置了它),但是它们具有相同的文本,我为第二个小部件选择的文本.
请帮帮我.