2012-02-10 102 views
0

我正在做一个有3个按钮的小部件。我需要为每个按钮调用一个函数。我这样做是这样的:android widget按钮崩溃

public class myWidget extends AppWidgetProvider { 


@Override 
public void onReceive(Context context, Intent intent) { 

    final String action = intent.getAction(); 
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
     final int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
     if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
      this.onDeleted(context, new int[] { appWidgetId }); 
     } 
    } else { 
    // check, if our Action was called 
     if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { 
       String msg = "null"; 
       try { 
        msg = intent.getStringExtra("msg"); 

        if(msg.equals("nextpage")) 
         callFunction1(); 

        if(msg.equals("prevpage")) 
             callFunction2(); 

        if(msg.equals("ref")) 
             callfunction3(); 
       } catch (NullPointerException e) { 

       } 
     } 

     super.onReceive(context, intent); 
    } 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 



    remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
    this.appWidgetManager = appWidgetManager; 
    thisWidget = new ComponentName(context, SteauaWidget.class); 

    Intent active = new Intent(context, MyWidget.class); 
    active.setAction(ACTION_WIDGET_RECEIVER); 
    active.putExtra("msg", "ref"); 

    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 1, active, 0); 

    remoteViews.setOnClickPendingIntent(R.id.button3, actionPendingIntent); 

    Intent nextPage = new Intent(context, MyWidget.class); 
    nextPage.setAction(ACTION_WIDGET_RECEIVER); 
    nextPage.putExtra("msg", "nextpage"); 

    PendingIntent pendingNextPage = PendingIntent.getBroadcast(context, 2, nextPage, 0); 

    remoteViews.setOnClickPendingIntent(R.id.button2, pendingNextPage); 

    Intent prevPage = new Intent(context, MyWidget.class); 
    prevPage.setAction(ACTION_WIDGET_RECEIVER); 
    prevPage.putExtra("msg", "prevpage"); 

    PendingIntent pendingPrevPage = PendingIntent.getBroadcast(context, 3, prevPage, 0); 

    remoteViews.setOnClickPendingIntent(R.id.button1, pendingPrevPage); 


} 

但我的插件崩溃,与此消息在logcat中:

了java.lang.RuntimeException:无法启动接收机my.widget.MyWidget:显示java.lang.NullPointerException

有什么问题?

+0

你能告诉我空行指针是什么行吗?发布实际的logcat。如果这里什么都没有,我会把LOG信息放进去,看看它在哪里崩溃。 – Kaediil 2012-02-10 20:57:03

回答

0

Kaediil是对的,你必须通过在代码中放置Log.d()语句来缩小故障点。我看到很多地方的指针可能仍然是空的,从而抛出错误。该行: thisWidget = new ComponentName(context,SteauaWidget.class); 看起来很奇怪。另外,由于错误特别提到了 my.widget.MyWidget,它有理由说MyWidget.class没有正确实例化,或者没有给出时间来完成加载,从而产生下面的NullPointerException。