Android推送通知实现问题:Notification.Builder的build()方法报错求助
问题:Notification.Builder的build()方法报错,无法构建推送通知
我正在尝试在Fragment中实现推送通知功能,但代码里的.build()方法一直报错,不清楚具体原因。以下是我的Java文件代码:
public class two extends Fragment { EditText ed1, ed2, ed3; public two() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two, container, false); ed1 = (EditText) view.findViewById(R.id.editText); ed2 = (EditText) view.findViewById(R.id.editText2); ed3 = (EditText) view.findViewById(R.id.editText3); // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_two, container, false); } public void sendNotification(View v){ String Name = ed1.getText().toString().trim(); String Tittle = ed2.getText().toString().trim(); String Question = ed3.getText().toString().trim(); NotificationManager notif = (NotificationManager)getActivity().getSystemService(Context.NOTIFICATION_SERVICE); Notification n = new Notification.Builder(getActivity().getApplicationContext()). setContentText(Question). setContentTitle(Tittle + "-" + Name). setSmallIcon(R.drawable.map).build(); notif.notify(0,n); } }
代码中倒数第二行的build()方法显示报错,请问我该如何解决?谢谢。
解决方案
我来帮你拆解问题并修复:
1. 定位build()报错的核心原因
在Android API 26(Android 8.0)及以上版本,通知必须关联一个通知渠道(Notification Channel),你当前的Notification.Builder没有指定渠道ID,这是build()报错的直接原因。另外代码里还有一个隐藏坑,会导致后续调用sendNotification时触发空指针异常,我一起帮你修复。
2. 分步修复代码
(1)修复onCreateView的返回值问题
你先初始化了view并绑定了EditText,但最后返回的是重新inflate的新布局,这会导致ed1、ed2、ed3的引用完全失效,调用getText()时必然抛出空指针。修改成返回之前初始化好的view:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two, container, false); ed1 = view.findViewById(R.id.editText); // 可去掉强制转换,Android Studio会自动处理类型匹配 ed2 = view.findViewById(R.id.editText2); ed3 = view.findViewById(R.id.editText3); return view; // 返回绑定好控件的view,而非重新inflate的新布局 }
(2)添加通知渠道创建逻辑
在构建通知前,先判断系统API版本,创建对应的通知渠道:
public void sendNotification(View v){ String Name = ed1.getText().toString().trim(); String Tittle = ed2.getText().toString().trim(); String Question = ed3.getText().toString().trim(); NotificationManager notif = (NotificationManager)getActivity().getSystemService(Context.NOTIFICATION_SERVICE); String channelId = "my_custom_notification_channel"; // 自定义渠道ID String channelName = "通用通知"; // 自定义渠道名称 // 针对API 26+创建通知渠道 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT); notif.createNotificationChannel(channel); } // 构建通知时指定渠道ID,解决build()报错问题 Notification n = new Notification.Builder(getActivity(), channelId) .setContentText(Question) .setContentTitle(Tittle + "-" + Name) .setSmallIcon(R.drawable.map) .build(); notif.notify(0, n); }
3. 额外优化建议
- 推荐使用
NotificationCompat.Builder(来自androidx库),它会自动处理版本兼容问题,写法更简洁:
NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity(), channelId) .setContentText(Question) .setContentTitle(Tittle + "-" + Name) .setSmallIcon(R.drawable.map) .setPriority(NotificationCompat.PRIORITY_DEFAULT); Notification n = builder.build();
- 确保
R.drawable.map资源存在,否则会因找不到图标导致通知无法正常显示。
这样修改后,build()的报错就能解决,同时也避免了后续的空指针问题。
内容的提问来源于stack exchange,提问作者collins sweet
相关产品推荐
相关产品推荐

