Android桌面Widget按钮传参异常:Intent.putExtra()值恒为0求助
问题分析与解决方案
你的问题根源在于两个核心错误:Intent Extra的类型不匹配,以及PendingIntent的requestCode重复导致的Intent复用覆盖,这两个问题共同导致你始终获取到0。
1. 核心问题拆解
问题一:Extra类型不匹配
你在Widget代码中往Intent里放入的是String类型的data_array[0](因为split()返回的是字符串数组),但在MainActivity中却用extras.getInt("accountID")去获取。当系统找不到对应int类型的extra时,会直接返回默认值0——这是你看到始终为0的直接原因。
问题二:PendingIntent的requestCode重复
循环创建PendingIntent时,你传入的requestCode都是固定值0。系统会把相同requestCode的PendingIntent视为同一个,后续创建的PendingIntent会覆盖前面的,最终所有按钮都会复用最后一个创建的Intent参数(就算类型正确也会出现点击所有按钮都传递同一个参数的问题)。
2. 具体修复步骤
修复一:统一Extra的类型
推荐提前将字符串类型的accountID转为int再放入Intent,避免后续类型错误:
// 在Widget的循环中修改 String[] data_array = accounts_array[z].split("\\,"); Intent intent = new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); try { // 将字符串转为int,同时处理可能的格式异常 int accountId = Integer.parseInt(data_array[0]); Log.e(APP_TAG, "## ACCOUNT_ID: "+ accountId); intent.putExtra("accountID", accountId); } catch (NumberFormatException e) { Log.e(APP_TAG, "无效的账号ID: " + data_array[0], e); views.setViewVisibility(id, View.INVISIBLE); // 异常时隐藏按钮 continue; }
如果需要保留String类型,MainActivity中要对应使用getString()获取:
// MainActivity中修改 String accountIdStr = extras.getString("accountID"); int accountId = Integer.parseInt(accountIdStr); // 按需转int
修复二:为每个PendingIntent设置唯一requestCode
将循环变量z作为requestCode传入,确保每个按钮的PendingIntent都是独立的,不会互相覆盖:
// 替换原PendingIntent创建代码 PendingIntent pendingIntent = PendingIntent.getActivity(context, z, intent, PendingIntent.FLAG_UPDATE_CURRENT);
3. 优化后的完整代码片段
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); try { int accountId = Integer.parseInt(data_array[0]); Log.e(APP_TAG, "## ACCOUNT_ID: "+ accountId); intent.putExtra("accountID", accountId); } catch (NumberFormatException e) { Log.e(APP_TAG, "按钮" + z + "的账号ID无效", e); views.setViewVisibility(id, View.INVISIBLE); continue; } // 使用z作为唯一requestCode PendingIntent pendingIntent = PendingIntent.getActivity(context, z, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(id, pendingIntent); views.setTextViewText(id, data_array[1]); } else { views.setViewVisibility(id,View.INVISIBLE); //hide button } }
MainActivity获取参数部分
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); String accountParam = ""; if (extras != null) { // 增加默认值-1,区分合法的0和未获取到的情况 int accountId = extras.getInt("accountID", -1); Log.e(APP_TAG, "AccountID in MainActivity: "+ accountId); if(accountId != -1) { accountParam = "?accountID="+ accountId; } } if (extras != null && extras.getBoolean("cdvStartInBackground", false)) { moveTaskToBack(true); } loadUrl("file:///android_asset/www/index.html"+accountParam); }
内容的提问来源于stack exchange,提问作者newBie here
相关产品推荐
相关产品推荐

