Android 通过单击不同的按钮从主页小部件打开 2 个不同的活动

Posted

技术标签:

【中文标题】Android 通过单击不同的按钮从主页小部件打开 2 个不同的活动【英文标题】:Android Opening 2 different activity from home widget by clicking different button 【发布时间】:2017-07-22 04:58:28 【问题描述】:

在我的简单示例应用程序中,我有 2 个活动:

    MainActivity.java NewAppWidgetConfigureActivity.java

在我的应用程序中,我还有扩展 AppWidgetProvider

的类 NewAppWidget.java

我想要完成的是:

当我将主页小部件添加到屏幕时,我想先打开活动 NewAppWidgetConfigureActivity.java。到现在还可以,效果很好。

当我将主页小部件添加到屏幕时,我的小部件有 2 个按钮和一个 TextView。 我想要的是这个:

    当我点击第一个按钮时,我想打开 MainActivity.java 当我点击第二个按钮时,我想打开 NewAppWidgetConfigureActivity.java。

但是,它不起作用。通过单击按钮没有任何反应。我尝试实施其他问题的解决方案,但它不起作用。

代码如下:

清单文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.petar.mywidgetwitbuttons">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".NewAppWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

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

        <activity android:name=".NewAppWidgetConfigureActivity">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>
    </application>

这是 new_ap_widget_info.xml 的代码,我在其中添加了我的小部件的所有必要信息,包括我在添加时自动打开活动 NewAppWidgetConfigureActivity.java 的代码行小部件。

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.example.petar.mywidgetwitbuttons.NewAppWidgetConfigureActivity"
    android:initialKeyguardLayout="@layout/new_app_widget"
    android:initialLayout="@layout/new_app_widget"
    android:minHeight="110dp"
    android:minWidth="180dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen" />

这是 NewAppWidget.java 类的代码,该类扩展了 AppWidgetProvider

package com.example.petar.mywidgetwitbuttons;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;

/**
 * Implementation of App Widget functionality.
 * App Widget Configuration implemented in @link NewAppWidgetConfigureActivity NewAppWidgetConfigureActivity
 */
public class NewAppWidget extends AppWidgetProvider 

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) 

        CharSequence widgetText = NewAppWidgetConfigureActivity.loadTitlePref(context, appWidgetId);
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
        views.setTextViewText(R.id.appwidget_text, widgetText);

        Log.d("widget", "onUpdatePrvo: Widget testiramo");

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) 
            updateAppWidget(context, appWidgetManager, appWidgetId);

            Intent intent = new Intent(context, MainActivity.class);
            Intent intent2 = new Intent(context, NewAppWidgetConfigureActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
            PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, intent2, 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.new_app_widget);
            views.setOnClickPendingIntent(R.id.buttonCLICK, pendingIntent);
            views.setOnClickPendingIntent(R.id.buttonCLICK2, pendingIntent2);


            appWidgetManager.updateAppWidget(appWidgetId, views);
        
    

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) 
        // When the user deletes the widget, delete the preference associated with it.
        for (int appWidgetId : appWidgetIds) 
            NewAppWidgetConfigureActivity.deleteTitlePref(context, appWidgetId);
        
    

    @Override
    public void onEnabled(Context context) 
        // Enter relevant functionality for when the first widget is created
    

    @Override
    public void onDisabled(Context context) 
        // Enter relevant functionality for when the last widget is disabled
    

另外,当我从提供者信息中删除这行代码时,我可以在第一次单击按钮时打开 MainActivity.java,但仍然无法打开 NewAppWidgetConfigureActivity.java 单击第二个按钮。 android:configure="com.example.petar.mywidgetwitbuttons.NewAppWidgetConfigureActivity"

这里是完整的提供者信息代码,没有 android:configure=""

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.example.petar.mywidgetwitbuttons.NewAppWidgetConfigureActivity"
    android:initialKeyguardLayout="@layout/new_app_widget"
    android:initialLayout="@layout/new_app_widget"
    android:minHeight="110dp"
    android:minWidth="180dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen" />

【问题讨论】:

【参考方案1】:

这些简单的步骤可以帮助您解决问题。

    应用小部件允许某些 UI 控件而不是所有内容。所以检查什么是允许的,什么是不允许的。 https://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout

    不要扩展或创建自定义 UI 控件类。 Ex;- 类 CustomButton 扩展了 Button

    我确实看到您的 Intent 没有额外的参数。这可能会在内部混淆 PendingIntent 比较逻辑。因此,向意图添加自定义操作或一些额外参数。 前;-

    意图 a = new Intent("MainActivity"); Intent b = new Intent("ConfigureActivity");

【讨论】:

如我所见,我使用的一切都是允许的。我在我的家庭小部件 UI 中使用的只是 2 个按钮和相对布局。我使用 2 个不同的意图,如下所示: Intent intent = new Intent(context, MainActivity.class); Intent intent2 = new Intent(context, NewAppWidgetConfigureActivity.class);在 onUpdate() 方法中。那是正确的方法吗?当我从提供者信息 android:configure="" 中删除时,我实际上可以通过单击第一个按钮打开 MainActivity,但我无法通过单击第二个按钮打开第二个活动。 您是否尝试设置我上面所说的不同的意图操作? Intent a = new Intent("MainActivity-这是activity1的意图动作"); Intent b = new Intent("ConfigureActivity-这是activity2的意图动作"); 我尝试添加这 2 行代码,但仍然无法正常工作。 intent.setAction("MainActivity"); intent2.setAction("NewAppWidgetConfigureActivity");【参考方案2】:

这对我有用。

      public class widget_wordss extends AppWidgetProvider 

private static final String ACTION_SIMPLEAPPWIDGET = "ACTION_BROADCASTWIDGETSAMPLE";
private static final String ACTION_SIMPLEAPPWIDGET1 = "ACTION_BROADCASTWIDGETSAMPLE1";

public boolean widg = false;

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int 
appWidgetId) 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
R.layout.widget_main_words);
    Intent intent = new Intent(context, widget_wordss.class);
    Intent intent1 = new Intent(context, widget_wordss.class);
    intent.setAction(ACTION_SIMPLEAPPWIDGET);
    intent1.setAction(ACTION_SIMPLEAPPWIDGET1);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 
PendingIntent.FLAG_UPDATE_CURRENT);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, intent1, 
PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.btnOpen, pendingIntent);
    views.setOnClickPendingIntent(R.id.btnayar, pendingIntent1);
    appWidgetManager.updateAppWidget(appWidgetId, views);

【讨论】:

以上是关于Android 通过单击不同的按钮从主页小部件打开 2 个不同的活动的主要内容,如果未能解决你的问题,请参考以下文章

如何在android小部件中单击图像按钮显示吐司

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?

如何使用来自小部件的不同附加功能打开相同的活动

主页启动器强制停止后未收到Android AppWidget的按钮单击事件

Android:从小部件打开错误的活动

如何通过单击放置在同一页面上的小部件来显示不同的小部件