2014-12-17 5 views
0

Я узнал сегодня, как разработать AppWidget, и мой вопрос в том, как я могу запускать методы в виджетах приложения? пример: У меня есть кнопка в xml, и я хочу, чтобы кнопка вычислила что-то. - часть создания виджета отлично работает, и теперь я хочу добавить некоторые методы к кнопке. Как его работает в «Виджетах приложений»?Как я могу запускать методы в AppWidget?

вот мой код:

public class WorkClockWidget extends AppWidgetProvider { 

    MySharedPreferences shared; 
    RemoteViews views; 
    private Context context; 
    private String text; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 

     for (int i = 0; i < appWidgetIds.length; i++) { 

      views = new RemoteViews(context.getPackageName(), R.layout.clock_widget); 

      /// i have button in the "R.layout.clock_widget" . 
      //what i need to do if i want the button run the "someText()" method? 


      appWidgetManager.updateAppWidget(appWidgetIds[i], views); 

     } 
    } 


    //The method i want to run when i press on the button. 
    public String someText(){ 
     System.out.println("Works!!!"); 
     return "Test if this method works"; 
    } 



} 

Еще один вопрос: Если я хочу, чтобы мой виджет добавить данные в свою базу данных, я должен использовать ContentProvider?

ответ

0

Вы не можете вызвать метод напрямую, но вы можете запустить Intent. Одним из способов было бы это сделать, чтобы Intent отправил трансляцию, используя PendingIntent.getBroadcast. (Я не уверен, что вам нужна категория там, но это, как я делаю это в моем коде, так что я включаю его в этом примере.)

Intent intent = new Intent("com.myapp.button_press").addCategory("com.myapp"; 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
views.setOnClickPendingIntent(R.id.widget_button, pendingIntent); 

Далее вам нужно BroadcastReceiver получить, что вещания. Один подлый способ сделать это - использовать ваш класс AppWidgetProvider в качестве получателя, так как это действительно виджет приложения. Вы должны изменить манифеста запись для вашего приложения виджета, чтобы включить Intent, который вы создали в OnUpdate:

<receiver android:name=".widget.MintAppWidgetProvider"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
     <action android:name="com.myapp.button_press"/> 
     <category android:name="com.myapp"/> 
    </intent-filter> 

    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/my_provider_info"/> 
</receiver> 

Кроме того, при перекрытии OnReceive, не забудьте вызвать super.onReceive если Намерение не ваше особое намерение, так что базовый класс AppWidgetProvider может обработать нормальное намерение и вызвать onUpdate.

@Override 
public void onReceive(Context context, Intent intent) { 
    final String action = intent.getAction(); 
    if ("com.myapp.button_press".equals(action)) { 
     // First handle your special intent action 
     someText(); 
    } else { 
     // otherwise let Android call onUpdate 
     super.onReceive(context, intent); 
    } 
} 
+0

Спасибо, что это работает, но если я хочу больше кнопки, мне нужно сделать это каждый метод и кнопку? –

+0

Для получения дополнительных кнопок вы можете просто создать новые строки действий Intent, такие как «com.myapp.button1», «com.myapp.button2» и т. Д. Для каждой кнопки создайте новый Intent, новый PendingIntent, другой тег действия в манифест и предложение else-if в onReceive. – Bruce

+0

О, и я только что заметил ваш вопрос о базе данных и ContentProvider. Вы можете добавить свой виджет в базу данных, как и любой другой код. Вы можете использовать SQLiteDatabase напрямую или обернуть доступ к базе данных в ContentProvider. Но детали того, как это сделать, будут отдельным вопросом - тот факт, что вы делаете это изнутри виджета, не имеет значения. – Bruce

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