簡體   English   中英

Android-在主屏幕上創建小部件

[英]Android - create widget on home screen

我想從網址以及圖片下方顯示的文本中加載圖片。 像這樣,

小部件示例

  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. 當用戶點擊窗口小部件時,如何將用戶重定向到商店?

提前致謝。 我是新手,如果我問了一個愚蠢的問題,對不起。

可用的小部件視圖和布局

窗口小部件在可以使用的View類中受到限制。 作為布局,您可以使用FrameLayout,LinearLayoutRelativeLayout類。 作為視圖,您可以使用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。 請注意,這可能是此提供程序的所有AppWidget實例,或者只是其中一部分,如方法JavaDoc中所述。 例如,如果將多個窗口小部件添加到主屏幕,則僅最后一個窗口更改(直到重新安裝)。

onDeleted()-小部件實例從主屏幕刪除

這些方法中所有長時間運行的操作都應在服務中執行,因為廣播接收器的執行時間受到限制。 在onReceive()方法中使用異步處理無濟於事,因為系統可能會在其onReceive()方法之后終止廣播過程。

有關小部件的更多詳細信息,請參見如何在Android中創建小部件?

教程1
Tutorial2

嗨,您可以檢查本教程中的從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();
    }
   }

看到這個。

如何在單個應用程序中使用應用程序小部件創建Android應用程序

如果您發現任何問題,那么請告訴我,這對您很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM