アクティビティを構成するウィジェットがあります。ユーザーがウィジェットをホーム画面に配置したい場合、configure アクティビティが開き、ユーザーがウィジェットのコンテンツ、背景色、およびテキスト色を選択すると、ウィジェットが表示されます。アプリを再インストールすると、ウィジェットが非表示になります。まだそこにありますが、テキストと色はありません。画像を参照してください:
すべてのファイルを投稿します。最後に、何が問題なのかを説明します。私が知らないのは解決策です。
widgetconfigure.xml
これは構成アクティビティのレイアウトです。この 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, 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 メソッドにあると確信しています。// を追加した場合に表示する行を残しました。背景のないウィジェットが表示されますが、「何か」というテキストが表示されます。
このメソッドでウィジェットの背景色、ウィジェットのテキストカラー、および TextView のテキストを設定するにはどうすればよいですか? 私はそれらを知りません。ユーザーはウィジェットを追加するときにそれらを設定します。または、私は何をすべきですか?
編集
私はこのコードを見つけて、私のものを次のように修正しました:
WidgetConfig.java の onClick メソッドに追加
saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext);
したので、ユーザーが構成アクティビティで [OK] を押すと、ウィジェット テキストが appwidgetid と共に保存されます (コードは AppWidgetManager.INVALID_APPWIDGET_ID を使用するため、appwidgetid を確認します)。
これが機能するためには、これが必要でした:
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;
}
}
まだうまくいきませんが、近づいています。ホーム画面にテキストの異なる 2 つのウィジェットを配置し、アプリを再インストールします。これで、両方のウィジェットにテキストが表示されます (もちろん、設定したので) が、同じテキスト (2 番目のウィジェット用に選択したテキスト) が表示されます。
私を助けてください。