2013-03-04 5 views
0

Я хочу загрузить изображение с URL-адреса, а также текстовое шоу ниже изображения. Подобно этому,Android - создать виджет на главном экране

Widget Example

  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. Как загрузить изображение из Интернета и отображения на макете в 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. Что такое работа для службы и AppWidgetProvider?

    • Загрузить изображение из URL является работа службы или AppWidgetProvider?
    • Посмотреть установку следует положить в сервис или AppWidgetProvider?
  4. Как я могу перенаправить пользователя на воспроизведение магазина, когда пользователь нажал на виджет?

Спасибо в продвинутом виде. Я новичок, извиняюсь, если я задам глупый вопрос.

ответ

0

Привет, вы можете проверить это tutorial для загрузки изображения с помощью 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(); 
    } 
    } 
+0

загрузить изображение из URL он должен работать в потоке? –

+0

Можете ли вы четко рассказать, что вы спрашиваете ... – androidgeek

+0

О, извините. Теперь проблема в том, что я не могу загрузить изображение с URL-адреса и отображать его в ImageView. 'remoteViews.setImageViewBitmap (R.id.widget_background, getBitmapFromUrl (« https://www.getchopink.com/assets/default/images/for-your-business-6.png »)); это метод, который вы предоставлен мне –

2

Доступные представления виджетов & Layout

виджет ограничен в Список классов можно использовать. В качестве макетов вы можете использовать классы FrameLayout, LinearLayout и RelativeLayout. В качестве представлений вы можете использовать AnalogClock, Button, Chromometer, ImageButton, ImageView, ProgressBar и TextView.

Начиная с Android 3.0 доступно больше видов: GridView, ListView, StackView, ViewFlipper и AdapterViewFlipper. Этот адаптер Views требует, чтобы вы определили виджет коллекционного вида, который описан ниже в этом уроке.

Единственное взаимодействие, которое возможно в представлениях виджета, осуществляется через OnClickListener. Этот OnClickListener может быть зарегистрирован в виджетах и ​​запускается пользователем.

AppWidgetProvider

Ваш BroadcastReceiver обычно расширяет AppWidgetProvider класс.

Класс AppWidgetProvider реализует метод onReceive(), извлекает необходимую информацию и вызывает следующие методы жизненного цикла виджета.

Как вы можете добавить несколько экземпляров виджета на рабочий стол, у вас есть методы жизненного цикла, которые вызывается только для первого экземпляра, добавленного/удаляемого на главный экран, и других, которые вызывают для каждого экземпляра вашего виджета.

Жизненный цикл Widget

onEnabled() -Called в первый раз экземпляр виджета добавляется в рабочий стол

onDisabled() -Called раз последний экземпляр вашего виджет удаляется с рабочего стола.

onUpdate() -Всего для каждого обновления виджета. Содержит идентификаторы appWidgetIds, для которых требуется обновление. Обратите внимание, что это могут быть все экземпляры AppWidget для этого провайдера или просто их подмножество, как указано в методах JavaDoc. Например, если к главному экрану добавлено более одного виджета, изменяется только последний (до повторной установки).

onDeleted() -Widget экземпляр удаляется из столе

Все длительные операции в этих методах должны быть выполнены в службе, поскольку время выполнения для вещательного приемника ограничена. Использование асинхронной обработки в методе onReceive() не помогает, поскольку система может убить широковещательный процесс после его метода onReceive().

Для получения более подробной информации о проверке виджета How to create widget in Android?

Tutorial1
Tutorial2

+0

Являются ли hu отвечать apu j 6u, но я думаю, что чистая проблема yar – Piyush

+0

evu na chale yar ... – Piyush

+0

@PiYusHGuPtA Na chale to dodavoooo ..... Chalo bye .. – GrIsHu

Смежные вопросы