2011-03-09 58 views
0

我試圖創建窗口小部件,我已經得到了以下錯誤在我的窗口小部件,如果我取消(按back)在我的配置活動:失靈部件配置活動提供結果

03-09 12:34:47.650: ERROR/AndroidRuntime(837): FATAL EXCEPTION: main 
03-09 12:34:47.650: ERROR/AndroidRuntime(837): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=5, result=-1, data=Intent { act=CANCELED (has extras) }} to activity {com.android.launcher/com.android.launcher2.Launcher}: java.lang.NullPointerException 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread.access$2800(ActivityThread.java:125) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.os.Looper.loop(Looper.java:123) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at dalvik.system.NativeStart.main(Native Method) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837): Caused by: java.lang.NullPointerException 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at com.android.launcher2.Launcher.completeAddAppWidget(Launcher.java:889) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at com.android.launcher2.Launcher.onActivityResult(Launcher.java:542) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.Activity.dispatchActivityResult(Activity.java:3890) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 
03-09 12:34:47.650: ERROR/AndroidRuntime(837):  ... 11 more 

我不知道它是什麼原因造成的。

這裏我AndroidManifest.xml中,我做了一切都像在Android Widget教程描述:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="eu.scilled.rss" 
    android:versionCode="1" 
    android:versionName="1.0" 
> 
    <application 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:debuggable="true"> 
     <receiver android:name=".RSSWidgetProvider"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" 
       ></action> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" 
       android:resource="@xml/widget_provider_metadata" 
      ></meta-data> 
     </receiver> 
     <activity android:name=".activity.ConfigActivity"> 
      <intent-filter> 
       <action yndroid:name="android.appwidget.action.APPWIDGET_CONFIGURE"></action> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

和我widget_provider_metadata.xml:

<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:updatePeriodMillis="86400000" 
    android:minHeight="72dp" 
    android:initialLayout="@layout/widget_layout" 
    android:minWidth="146dp" android:configure="eu.scilled.rss.activity.ConfigActivity"> 
</appwidget-provider> 

的問題是,爲什麼這個錯誤是顯示以及爲什麼我的widget提供者無法對配置活動觸發的ResultIntent做出反應。

活動來源:

public class ConfigActivity extends Activity implements OnClickListener { 
    private static final String TAG = (ConfigActivity.class).getCanonicalName(); 
    private int THIS_WIDGET_ID = AppWidgetManager.INVALID_APPWIDGET_ID; 
    private Intent resultIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v(TAG, "starting configuration activity"); 
     setContentView(R.layout.config_activity_layout); 
     Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      THIS_WIDGET_ID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 
        AppWidgetManager.INVALID_APPWIDGET_ID); 
     } 
     resultIntent = new Intent(); 
     resultIntent.putExtra("EXTRA_APPWIDGET_ID", THIS_WIDGET_ID); 
     createResultIntent(false); 
     Button b = (Button) findViewById(R.id.button1); 
     b.setOnClickListener(this); 
    } 

    private void createResultIntent(boolean finished) { 
     if (!finished) { 
      resultIntent.setAction("CANCELED"); 
      setResult(RESULT_OK, resultIntent); 
     } else { 
      resultIntent.setAction("CONFIG_DONE"); 
      setResult(RESULT_CANCELED, resultIntent); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     createResultIntent(true); 
     finish(); 

    } 

    @Override 
    public void onBackPressed() { 

     createResultIntent(false); 
     finish(); 

    } 
} 

回答

1

至少,你在createResultIntent()亂七八糟的東西:它返回RESULT_OK當BACK按鈕按下時,不RESULT_CANCELED。我想你應該根據this SDK example刪除resultIntent.setAction("XXX")

+0

2 Marcus Wolschon:我認爲這是錯誤的,因爲至少他在同一個if分支中有'resultIntent.setAction(「CANCELED」)'和'setResult(RESULT_OK,resultIntent)'。 'CANCELED'與'RESULT_OK'不匹配,不是?但是,實際問題是,意圖不應該有任何行動。 – borisstr 2011-07-18 13:57:02

0

在onBackPressed()中這樣做有什麼問題? 對於AppWidgetConfig活動來說自然適合的是一個PreferencesActivity,並且剩下一個就是使用後退按鈕。

相關問題