2013-05-20 4 views
4

После this урока я быстро создал простой виджет, который отображает текущее время на главном экране:Как запустить активность после нажатия кнопки виджета?

enter image description here

Я изменил код таким образом, что виджет также поставляется с кнопкой. Моя цель - запустить действие после нажатия кнопки. К сожалению, я действительно не понимаю, где прослушать нажатие кнопки. Должно ли это попасть в секцию широковещательного приемника файла манифеста?

<!-- Broadcast Receiver --> 
<receiver android:name=".WifiSSIDWidget" android:label="@string/app_name"> 
    <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/wifi_ssid_widget_provider" /> 
</receiver>  

Или код скорее перейдет в onUpdate? Вот код класса виджета:

public class HelloWidget extends AppWidgetProvider { 

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

     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000); 
    } 

    private class MyTime extends TimerTask { 
     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 
     DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault()); 

    public MyTime(Context context, AppWidgetManager appWidgetManager) { 
     this.appWidgetManager = appWidgetManager; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
     thisWidget = new ComponentName(context, HelloWidget.class); 
    } 

    @Override 
    public void run() { 
     remoteViews.setTextViewText(R.id.widget_textview, "TIME = " +format.format(new Date())); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
    } 

    } 
} 

Вот код, который я хочу назвать после того, как кнопка нажата:

public void openWifiSettings() { 
    final Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.wifi.WifiSettings"); 
    intent.setComponent(cn); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

ответ

7
import android.app.PendingIntent; 
... 
public static final String ACTION_BUTTON1_CLICKED = "com.example.myapp.BUTTON1_CLICKED"; 

в onUpdate добавить следующее к кнопке:

Intent intent = new Intent(ACTION_BUTTON1_CLICKED); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
remoteViews.setOnClickPendingIntent(R.id.button_1, pendingIntent); 

и в onReceive вашего AppWidget

@Override 
public void onReceive(Context context, Intent intent) 
{ 
Log.d(TAG, "onReceive() " + intent.getAction()); 
super.onReceive(context, intent); 
... 
if (ACTION_BUTTON1_CLICKED.equals(intent.getAction())) 
{ 
// your code 
} 

добавить свое намерение манифеста

<intent-filter> 
    <action android:name="com.example.myapp.BUTTON1_CLICKED" /> 
    .... 
+0

, где я должен определить 'ACTION_BUTTON1_CLICKED'? 'PendingIntent' также не может быть разрешен. Не могли бы вы немного подробнее остановиться на своем решении? – memyself

+0

Я отредактировал мой ответ –

+0

'remoteViews.setOnClickPendingIntent (R.id.button_1, pendingIntent);' дает мне ошибку в методе 'onUpdate':' не может быть разрешен'. – memyself

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