【问题标题】:how to launch activity after widget button is pressed?按下小部件按钮后如何启动活动?
【发布时间】:2013-05-20 14:10:17
【问题描述】:

按照this 教程,我快速创建了一个简单的小部件,它在主屏幕上显示当前时间:

我修改了代码,使小部件也带有一个按钮。我的目标是在按下按钮后启动一项活动。 不幸的是,我真的不明白在哪里听按钮点击。这是否必须进入清单文件的广播接收器部分?

<!--  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);
}   

【问题讨论】:

    标签: android android-widget android-activity


    【解决方案1】:
    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);
    

    在您的 AppWidget 的 onReceive

    @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" />
       ....
    

    【讨论】:

    • 我应该在哪里定义ACTION_BUTTON1_CLICKEDPendingIntent 也无法解决。您能否详细说明您的解决方案?
    • remoteViews.setOnClickPendingIntent(R.id.button_1, pendingIntent);onUpdate 方法中给我一个错误:cannot be resolved
    • 确切的错误信息是什么?例如。当然,您必须在小部件布局中添加一个 ID 为 button_1 的按钮。
    • remoteViews cannot be resolved。我想那是因为我在public MyTime 中创建了remoteViews。我应该如何更改我的代码以使其仍然有效?
    • 在调用appWidgetManager.updateAppWidget 之前尝试将这些行放入您的run 方法中。也许你必须让remoteViews final:final RemoteViews remoteViews
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多