0

URLから画像をロードしたいだけでなく、画像の下に表示されるテキストも表示します。このような、

ウィジェットの例

  1. ImageView と TextView の配置、ここに私のコードがありますが、目的のレイアウトが表示されません

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00FFFF"
        android:padding="0.1dp">
    
    <TextView android:text="@string/widgetUrl"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.8"
    android:layout_gravity="center_vertical"
    android:textColor="#000000">
    </TextView>
    <TextView android:text="@string/widgetTitle"
    android:id="@+id/widgetTitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.8"
    android:layout_gravity="center_vertical"
            android:layout_alignParentBottom="true"  
            android:layout_centerHorizontal="true"
    android:textColor="#ffffff">
    </TextView>
    <ImageView android:id="@+id/widgetBackground"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="0.5"
    android:src="@drawable/ic_launcher"
    android:layout_gravity="center_vertical">
    </ImageView>
    
    </LinearLayout>
    
  2. Web から画像を読み込み、Java コードでレイアウトに表示するにはどうすればよいですか? 以下は私のウィジェットプロバイダーコードです:

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    
    Log.i(WIDGETTAG, "onUpdate");
    
    final int N = appWidgetIds.length;
    
    // Perform this loop procedure for each App Widget that belongs to this provider
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];
    
        Log.i(WIDGETTAG, "updating widget[id] " + appWidgetId);
    
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    
        /* View setup */
        views.setInt(R.id.widgetTitle, "setBackgroundColor", Color.argb(150, 0, 0, 0));
    
        Intent intent = new Intent(context, ChopInkService.class);
        intent.setAction(ChopInkService.UPDATE_IMAGE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
    
        views.setOnClickPendingIntent(R.id.widgetBackground, pendingIntent);
        Log.i(WIDGETTAG, "pending intent set");
    
        // Tell the AppWidgetManager to perform an update on the current App Widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
    
  3. ServiceAppWidgetProviderの仕事は何ですか?

    • URL からの画像の読み込みは、サービスまたはAppWidgetProviderの仕事ですか?
    • ビューのセットアップはサービスまたはAppWidgetProviderに配置する必要がありますか?
  4. ユーザーがウィジェットをタップしたときに、ユーザーを Play ストアにリダイレクトするにはどうすればよいですか?

ありがとうございます。初心者です、変な質問してたらすみません。

4

3 に答える 3

4

利用可能なウィジェット ビューとレイアウト

ウィジェットは、使用できるビュー クラスに制限されています。レイアウトとして、 FrameLayout、LinearLayout、およびRelativeLayoutクラスを使用できます。ビューとして、AnalogClock、Button、Chromometer、ImageButton、ImageView、ProgressBar、および TextView を使用できます。

Android 3.0 では、GridView、ListView、StackView、ViewFlipper、AdapterViewFlipper など、より多くのビューを利用できます。このアダプター ビューでは、このチュートリアルで後述するコレクション ビュー ウィジェットを定義する必要があります。

ウィジェットのビューで可能な唯一の対話は、OnClickListener を介したものです。この OnClickListener はウィジェットに登録でき、ユーザーによってトリガーされます。

AppWidgetProvider

通常、BroadcastReceiverはAppWidgetProviderクラスを拡張します。

AppWidgetProvider クラスはonReceive()メソッドを実装し、必要な情報を抽出して、次のウィジェット ライフサイクル メソッドを呼び出します。

ウィジェットの複数のインスタンスをホームスクリーンに追加できるため、ホームスクリーンに追加/削除された最初のインスタンスに対してのみ呼び出されるライフサイクル メソッドと、ウィジェットのすべてのインスタンスに対して呼び出されるその他のメソッドがあります。

ウィジェットのライフサイクル

onEnabled() -ウィジェットのインスタンスがホームスクリーンに初めて追加されたときに呼び出されます

onDisabled() - ウィジェットの最後のインスタンスがホーム画面から削除されると呼び出されます。

onUpdate() - ウィジェットが更新されるたびに呼び出されます。更新が必要な appWidgetIds の ID が含まれています。これは、メソッド JavaDoc に記載されているように、このプロバイダーの AppWidget インスタンスのすべて、またはそれらのサブセットである可能性があることに注意してください。たとえば、複数のウィジェットがホーム画面に追加された場合、最後の 1 つだけが変更されます (再インストールするまで)。

onDeleted() - ウィジェット インスタンスがホーム画面から削除されます

ブロードキャスト レシーバの実行時間は限られているため、これらのメソッドで長時間実行される操作はすべてサービスで実行する必要があります。onReceive() メソッドで非同期処理を使用しても、システムは onReceive() メソッドの後でブロードキャスト プロセスを強制終了できるため、役に立ちません。

ウィジェットの詳細については、Android でウィジェットを作成する方法を確認してください。

チュートリアル
1 チュートリアル2

于 2013-03-04T05:42:32.000 に答える
0

こんにちは、URL(Http)から画像を読み込むためのこのチュートリアルを確認できます。

次のコードを試してください。

URL画像ウィジェットプロバイダークラス

public class URLImageAppWidgetProvider extends AppWidgetProvider {
    public static String TAG = "URLImageWidget";

    public static class Size_1_1 extends URLImageAppWidgetProvider {}
    public static class Size_1_2 extends URLImageAppWidgetProvider {}
    public static class Size_1_4 extends URLImageAppWidgetProvider {}
    public static class Size_2_2 extends URLImageAppWidgetProvider {}

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                    int[] appWidgetIds) {
            super.onUpdate(context, appWidgetManager, appWidgetIds);

            SharedPreferences urls = context.getSharedPreferences("urls.conf", Context.MODE_PRIVATE);
            for (int id : appWidgetIds) {
                    String url = urls.getString("url_" + id, "");
                    update(context, appWidgetManager, id, url);
            }       

    }

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
    super.onDeleted(context, appWidgetIds);

    SharedPreferences urls = context.getSharedPreferences("urls.conf", Context.MODE_PRIVATE);
    SharedPreferences.Editor urls_editor = urls.edit();
            for (int id : appWidgetIds) {
                    urls_editor.remove("url_" + id);
            }

            urls_editor.commit();

}

    public static void update(final Context context, final AppWidgetManager appWidgetManager, final int id, final String url) {
            new Thread() {
                    public void run() {
                            Bitmap img = getBitmapFromUrl(url);
                            if (img != null) {
                                    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
                                    views.setImageViewBitmap(R.id.img, img);
                                    appWidgetManager.updateAppWidget(id, views);    
                            }
                    }
            }.start();
    }

private static Bitmap getBitmapFromUrl(final String url) {
    try {
            return BitmapFactory.decodeStream(((java.io.InputStream)new java.net.URL(url).getContent()));
    } catch (Exception e) {
            return null;
    }

   }
 }

これがURL画像ウィジェット構成クラスです

    public class URLImageAppWidgetConfiguration extends Activity {
    private int id;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.configuration);
        setResult(RESULT_CANCELED);

        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            id = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID, 
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        if (id == AppWidgetManager.INVALID_APPWIDGET_ID) {
        finish();
    }

    }

    public void addWidget(View v) {
            SharedPreferences urls = getSharedPreferences("urls.conf", Context.MODE_PRIVATE);
            SharedPreferences.Editor urls_editor = urls.edit();

            String url = ((TextView) findViewById(R.id.url)).getText().toString();
            if (!url.startsWith("http://")) url = "http://" + url;
            urls_editor.putString("url_" + id, url);
            urls_editor.commit();

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
            URLImageAppWidgetProvider.update(this, appWidgetManager, id, url);

    setResult(RESULT_OK, 
                      new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id)
    );
    finish();
    }
   }
于 2013-03-04T05:17:38.523 に答える
0

これを参照してください。

単一のアプリケーションでアプリウィジェットを使用してAndroidアプリを作成する方法

これは、問題が見つかった場合に役立ちますので、お知らせください。

于 2013-03-04T05:18:02.487 に答える