java - Intent.putExtra() 不更新其值

标签 java android widget

我的主屏幕小部件中有 3 个按钮。单击后,我想使用一些参数启动我的 Activity (这取决于单击的按钮)。 问题是该值始终为 0(应该是 0、1 或 2,具体取决于单击的按钮)。 我的代码如下所示:

for (int appWidgetId : appWidgetIds) {
   RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.simple_app_widget); 

   for(int z=0;z<widget_buttons.length;z++) {
      int id = Integer.valueOf(widget_buttons[z]);
      if(z<accounts_array.length) {
          String[] data_array = accounts_array[z].split("\\,");

          Intent intent = new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
          Log.e(APP_TAG, "## ACCOUNT_ID: "+ data_array[0]);
          intent.putExtra("accountID", data_array[0]);
          PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
          views.setOnClickPendingIntent(id, pendingIntent);
          views.setTextViewText(id, data_array[1]);
       } else {
          views.setViewVisibility(id,View.INVISIBLE); //hide button
       }
    }

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

第一个循环用于更新每个小部件,第二个循环用于注册 3 个按钮上的单击事件。

这就是我在 MainActivity.java 中检索数据的方式

@Override
public void onCreate(Bundle savedInstanceState)
{
    // Log.e(APP_TAG, getExtra("accountID"));

    super.onCreate(savedInstanceState);

    Bundle extras = getIntent().getExtras();

    String accountParam = "";
    if (extras != null) {
        Log.e(APP_TAG, "AccountID in MainActivity: "+extras.getInt("accountID"));
        accountParam = "?accountID="+extras.getInt("accountID"); //<---
    }

    if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
        moveTaskToBack(true);
    }

    // Set by <content src="index.html" /> in config.xml
    loadUrl("file:///android_asset/www/index.html"+accountParam);
}

你能告诉我为什么每个按钮点击后都会从 extras.getInt() 中得到 0 吗?

最佳答案

您将帐户 ID 作为 String 传递(因为 data 的类型为 String[]),但在 Activity 中 您尝试使用 getInt() 从 extras Bundle 中检索它。

我设置了一个小型示例应用程序,并在 Logcat 中发现了以下几行:

01-21 18:24:02.525 4081-4081/com.example.todolist W/Bundle: Key accountID expected Integer but value was a java.lang.String. The default value 0 was returned.

01-21 18:24:02.525 4081-4081/com.example.todolist W/Bundle: Attempt to cast generated internal exception:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at android.os.BaseBundle.getInt(BaseBundle.java:801) at android.os.BaseBundle.getInt(BaseBundle.java:783) at com.example.todolist.OtherActivity.onCreate(OtherActivity.java:24) at android.app.Activity.performCreate(Activity.java:6237)

因此,在这种情况下,应用程序不会崩溃,但您也将无法检索正确的值。

为了修复您的代码,您应该使用 getString("accountID")

另一件事:您的 PendingIntent 都具有相同的请求代码 (0)。因此,它们将被视为“相同的 PendingIntent”。您必须使用不同的请求代码,否则所有三个 Button 将触发相同的行为。

关于java - Intent.putExtra() 不更新其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59811432/

相关文章:

android - 哪个Android开发博客的演练和教程最多?

Android Genymotion 音频失真

java - 尝试替换 editText 字符串开始时出错

安卓小部件 : Service vs Async Task

java - 假客户端单元测试

java - 从正在运行的程序中获取变量

java - 设置 SearchView 时出现错误

java - 无法导入 com.google.android.maps.MapView (Eclipse)

Python QtGui 日历小部件调用按钮

c++ - 创建一个QPushButtons列表