我有一个带有配置活动的小部件。当用户想将小部件放置在主屏幕上时,配置活动打开,用户选择小部件的内容、背景颜色和文本颜色,就可以了。当我重新安装应用程序时,小部件变得不可见。它仍然存在,但没有文字和颜色。见图片:
我将发布我所有的文件,最后,我会告诉你可能是什么问题。我不知道的是解决方案。
小部件配置.xml
这是配置活动的布局。我不会发布这个 xml。它在布局中有文本视图。
小部件布局.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, 0, GetDipsFromPixel(72), GetDipsFromPixel(72));
canvas.drawRoundRect(rect, 10, 10, p);
views.setImageViewBitmap(R.id.ImageView01, bitmap);
Intent in = new Intent(c, Notepad.class);
PendingIntent pi = PendingIntent.getActivity(c, 0, 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 和 TextView 的文本?我不认识它们,用户在添加小部件时设置它们。或者我应该怎么做?
编辑
我找到了这段代码并像这样修改了我的代码:
我
saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext);
在 WidgetConfig.java 中添加了 onClick 方法,因此当用户在配置活动中按下 OK 时,widgettext 将与 appwidgetid 一起保存(Idk 是什么 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;
}
}
它仍然不起作用,但越来越近了。我在主屏幕上放置了两个具有不同文本的小部件,然后我重新安装了该应用程序。现在两个小部件都有文本(当然,因为我设置了它),但它们具有相同的文本,即我为第二个小部件选择的文本。
请帮我。