我想从网址加载图像,以及图像下方显示的文本。像这样,
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>
如何从网络加载图像并在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);
}
Service和AppWidgetProvider的工作是什么?
当用户点击小部件时,如何将用户重定向到 Play 商店?
提前致谢。我是新手,如果我问了一个愚蠢的问题,请原谅。
来自 Lars Vogel 的 Android(主屏幕)小部件 - 教程 (vogella.com):
可用的小部件视图和布局
widget 仅限于它可以使用的 View 类。作为布局 您可以使用 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() 方法, 提取所需的信息并调用以下小部件 生命周期方法。
由于您可以将小部件的多个实例添加到主屏幕,因此您可以 具有仅在第一个实例中调用的生命周期方法 添加/删除到主屏幕和其他需要的内容 您的小部件的每个实例。
Widget 的生命周期
onEnabled() - 首次将小部件实例添加到主屏幕时调用
onDisabled() - 从主屏幕中删除小部件的最后一个实例后调用。
onUpdate() - 每次更新小部件时调用。包含需要更新的appWidgetIds的id。请注意,这可能 是该提供程序的所有 AppWidget 实例,或者只是一个子集 其中,如 JavaDoc 方法中所述。例如,如果超过 主屏幕上添加了一个小部件,仅最后一个发生变化 (直到重新安装)。
onDeleted() -Widget 实例从主屏幕中删除
这些方法中所有长时间运行的操作都应该在一个 服务,因为广播接收器的执行时间是有限的。 在 onReceive() 方法中使用异步处理没有帮助 因为系统可以在 onReceive() 之后终止广播进程 方法。
有关小部件的更多详细信息请检查如何在Android中创建小部件?
嗨,您可以查看这个教程,了解从 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 Image 小部件配置类
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();
}
}