2010-05-01 7 views
59

Документация разработчика, похоже, меня не подвела. Я могу создать статический виджет, не задумываясь, я даже могу создать виджет, похожий на виджет аналоговых часов, который будет обновляться, однако я не могу на всю жизнь понять, как создать виджет, на который реагирует, когда пользователь нажимает Это. Вот лучший пример кода, документация для разработчиков дает то, что виджет деятельность должна содержать (единственный другой намек будучи API демки, которые только создает статический виджет):Доступные виджеты для android

public class ExampleAppWidgetProvider extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     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]; 

      // Create an Intent to launch ExampleActivity 
      Intent intent = new Intent(context, ExampleActivity.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current App Widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 
} 

от: The Android Developer Documentation's Widget Page

Таким образом, похоже, что ожидающее намерение вызывается при щелчке виджета, который основан на намерении (я не совсем уверен, какая разница между намерением и ожидающим намерением), и цель заключается в классе ExampleActivity , Так что я сделал мой класс образец деятельности простую деятельность, которая при создании, будет создавать объект MediaPlayer, и запустить его (он не будет когда-либо освободить объект, так что в конечном счете крах, вот это код:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); 
    mp.start(); 
} 

Однако, когда я добавил виджет на главный экран и нажал на него, ничего не сыграло, по сути, ничего не сыграло, когда я установил таймер обновления всего на несколько сотен миллисекунд (в XML-файл поставщика приложения appwidget). Кроме того, я установил точки останова и выяснил, что он не только не доходил до активности, но и никаких точек останова, которые я установил, никогда не будет вызвано (я все еще не понял, почему это так), однако logcat, казалось, указывал, что класс активности файл был запущен.

Итак, есть ли что-нибудь, что я могу сделать, чтобы заставить appwidget ответить на клик? Поскольку метод onClickPendingIntent() является ближайшим, я нашел метод типа onClick.

спасибо.

+0

Hai Leif, вы решаете эту проблему с помощью Methode Brain515? У меня есть аналогичная проблема, но решение Brain не работает для меня, не могли бы вы мне помочь? –

ответ

124

Сначала добавьте статическую переменную с константой.

public static String YOUR_AWESOME_ACTION = "YourAwesomeAction"; 

Затем нужно добавить действие намерению, прежде чем добавить намерение ожидающего намерения:

Intent intent = new Intent(context, widget.class); 
intent.setAction(YOUR_AWESOME_ACTION); 

(Где widget.class класс вашего AppWidgetProvider, ваш текущий класс)

затем нужно создать PendingIntent с getBroadcast

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

Установите onClickPendingIntent для интерактивного зрения в виджете

remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent); 

Далее переопределить OnReceive метода в том же классе:

@Override 
public void onReceive(Context context, Intent intent) { 
super.onReceive(context, intent); 

А затем ответить на ваши нажатия кнопок, запрашивая намерение возвратить для ваших в рамках метода onReceive:

if (intent.getAction().equals(YOUR_AWESOME_ACTION)) { 
    //do some really cool stuff here 
} 

И это должно быть сделано!

+1

, где эта строка (намерение намерения = новое намерение (контекст, примерActivity.class);) есть место? Что делает виджет.класс содержит? Я предполагаю, что ExampleActivity - это то, что мы хотим запустить. – JustCurious

+1

Отредактировал ответ на метод дополнительных шагов, которые необходимы для этого. GetBroadcast важно для трансляции PendingIntent, а не getActivity из примера. – Guykun

+0

Почему PendingIntent.getBroadcast vs PendingIntent.getActivity? –

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