10

アクティビティを構成するウィジェットがあります。ユーザーがウィジェットをホーム画面に配置したい場合、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 番目のウィジェット用に選択したテキスト) が表示されます。

私を助けてください。

4

3 に答える 3

3

画像が SD カードに保存されている場合、この投稿に答えがあるかもしれません: http://www.technipages.com/android-icons-disappear-from-home-screen.html

于 2012-06-20T07:10:33.770 に答える
0

適切なアプローチは、各 Id を sharedPrefs にマッピング/保存することです。詳細はこちら: appwidget の複数インスタンスの処理 およびこちら: http://www.androidbook.com/akc/display?url=DisplayNoteIMPURL&reportId=3307&downerUserId=satya

于 2013-09-08T21:44:47.213 に答える
-1

ウィジェットのサイズを変更または移動すると、しばらくすると表示されます。これを修正するために、デフォルトの画像をイメージビューに入れましたが、うまくいきました。

于 2015-05-27T04:29:14.270 に答える