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

Android-在主屏幕上创建小部件,android,android-layout,widget,android-imageview,Android,Android Layout,Widget,Android Imageview,我想从url加载图像,以及图像下方显示的文本。像这样, 在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:lay

我想从url加载图像,以及图像下方显示的文本。像这样,

  • 在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>
    
    
    
  • 如何从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);
    }
    
    @覆盖
    public void onUpdate(上下文上下文,AppWidgetManager AppWidgetManager,
    int[]appWidgetIds){
    onUpdate(上下文、appWidgetManager、AppWidgetId);
    Log.i(widgetag,“onUpdate”);
    final int N=appWidgetIds.length;
    //对属于此提供商的每个应用程序小部件执行此循环过程
    
    对于(inti=0;iHi),您可以检查此以从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();
        }
       }
    

    您好,您可以检查此以从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();
        }
       }
    
    看这个

    这对您很有帮助,如果您发现任何问题,请告诉我。

    请参阅此


    这对您很有帮助,如果您发现任何问题,请告诉我。

    可用的小部件视图和布局

    小部件在其可使用的视图类中受到限制。作为布局,您可以使用框架布局、线性布局相对布局类。作为视图,您可以使用模拟时钟、按钮、色度计、ImageButton、ImageView、ProgressBar和TextView

    从Android 3.0开始,还有更多视图可用:GridView、ListView、StackView、ViewFlipper和AdapterViewFlipper。此适配器视图要求您定义集合视图小部件,本教程稍后将对此进行描述

    小部件视图上唯一可能的交互是通过OnClickListener。此OnClickListener可以在小部件上注册,并由用户触发

    AppWidgetProvider

    您的BroadcastReceiver通常扩展AppWidgetProvider

    AppWidgetProvider类实现onReceive()方法,提取所需信息并调用以下小部件生命周期方法

    由于您可以将一个小部件的多个实例添加到主屏幕,因此您拥有仅为添加/删除到主屏幕的第一个实例调用的生命周期方法,以及为小部件的每个实例调用的其他方法

    小部件的生命周期

    onEnabled()-第一次将小部件的实例添加到主屏幕时调用

    onDisabled()-从主屏幕中删除小部件的最后一个实例后调用

    onUpdate()-为小部件的每次更新调用。包含需要更新的AppWidgetId的ID。请注意,这可能是此提供程序的所有AppWidget实例,或者只是其中的一个子集,如方法JavaDoc中所述。例如,如果在主屏幕中添加了多个小部件,则只有最后一个会更改(直到重新安装)

    onDeleted()-小部件实例从主屏幕中删除

    这些方法中的所有长时间运行的操作都应该在服务中执行,因为广播接收器的执行时间是有限的。在onReceive()方法中使用异步处理没有帮助,因为系统可以在其onReceive()方法之后终止广播进程

    有关小部件检查的更多详细信息



    可用小部件视图和布局

    小部件在其可使用的视图类中受到限制。作为布局,您可以使用框架布局、线性布局相对布局类。作为视图,您可以使用模拟时钟、按钮、色度计、ImageButton、ImageView、ProgressBar和TextView

    从Android 3.0开始,还有更多视图可用:GridView、ListView、StackView、ViewFlipper和AdapterViewFlipper。此适配器视图要求您定义集合视图小部件,本教程稍后将对此进行描述

    小部件视图上唯一可能的交互是通过OnClickListener。此OnClickListener可以在小部件上注册,并由用户触发

    AppWidgetProvider

    您的BroadcastReceiver通常扩展AppWidgetProvider

    AppWidgetProvider类实现onReceive()方法,提取所需信息并调用以下小部件生命周期方法

    由于您可以将一个小部件的多个实例添加到主屏幕,因此您拥有仅为添加/删除到主屏幕的第一个实例调用的生命周期方法,以及为小部件的每个实例调用的其他方法

    小部件的生命周期

    onEnabled()-第一次将小部件的实例添加到主屏幕时调用

    onDisabled()-从主屏幕中删除小部件的最后一个实例后调用

    onUpdate()-为小部件的每次更新调用。包含需要更新的AppWidgetId的ID。请注意,这可能是此提供程序的所有AppWidget实例,或者只是其中的一个子集,如方法JavaDoc中所述。例如,如果在主屏幕中添加了多个小部件,则只有最后一个会更改(直到重新安装)

    onDeleted()-小部件实例从主屏幕中删除

    这些方法中的所有长时间运行的操作都应该在服务中执行,因为广播接收器的执行时间是有限的