[英]Android: Stuck on ClassCastException using getApplication(), trying to integrate Facebook Friendpicker sample
我正在嘗試將Facebook Friendpicker示例集成到Parse.com快速入門代碼中。 這將創建一個通過Facebook登錄,連接到Parse.com並允許您選擇朋友的應用程序(當然,這是更大計划的全部內容)。 選擇Facebook朋友后,您可以單擊“完成”,此時應用程序會將選定的朋友存儲到應用程序中。 單擊“完成”時,它會崩潰(但只有在單擊“完成”后,選擇屏幕本身才能正常工作)。 您能否幫助我了解問題出在哪里(為什么以下行會引起問題)?
導致該問題的行是:GamePlannerFriendPickerApplication application =(GamePlannerFriendPickerApplication)getApplication();
LogCat:
06-02 15:25:02.176: W/dalvikvm(274): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-02 15:25:02.285: E/AndroidRuntime(274): FATAL EXCEPTION: main
06-02 15:25:02.285: E/AndroidRuntime(274): java.lang.ClassCastException: com.parse.integratingfacebooktutorial.IntegratingFacebookTutorialApplication
06-02 15:25:02.285: E/AndroidRuntime(274): at com.parse.integratingfacebooktutorial.GamePlannerPickFriendsActivity$2.onDoneButtonClicked(GamePlannerPickFriendsActivity.java:66)
06-02 15:25:02.285: E/AndroidRuntime(274): at com.facebook.widget.PickerFragment$6.onClick(PickerFragment.java:650)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.view.View.performClick(View.java:2408)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.view.View$PerformClick.run(View.java:8816)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.os.Handler.handleCallback(Handler.java:587)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.os.Handler.dispatchMessage(Handler.java:92)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.os.Looper.loop(Looper.java:123)
06-02 15:25:02.285: E/AndroidRuntime(274): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 15:25:02.285: E/AndroidRuntime(274): at java.lang.reflect.Method.invokeNative(Native Method)
06-02 15:25:02.285: E/AndroidRuntime(274): at java.lang.reflect.Method.invoke(Method.java:521)
06-02 15:25:02.285: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 15:25:02.285: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 15:25:02.285: E/AndroidRuntime(274): at dalvik.system.NativeStart.main(Native Method)
令人討厭的是,facebook示例使用完全相同的方法(第80行,PickFriendsActivity.java),只是使用了不同的變量名。
請參閱GamePlannerPickFriendsActivity.java中的friendPickerFragment.setOnDoneButtonClickedListener:
public class GamePlannerPickFriendsActivity extends FragmentActivity {
FriendPickerFragment friendPickerFragment;
// A helper to simplify life for callers who want to populate a Bundle with the necessary
// parameters. A more sophisticated Activity might define its own set of parameters; our needs
// are simple, so we just populate what we want to pass to the FriendPickerFragment.
public static void populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar) {
intent.putExtra(FriendPickerFragment.USER_ID_BUNDLE_KEY, userId);
intent.putExtra(FriendPickerFragment.MULTI_SELECT_BUNDLE_KEY, multiSelect);
intent.putExtra(FriendPickerFragment.SHOW_TITLE_BAR_BUNDLE_KEY, showTitleBar);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_planner_pick_friends_activity);
FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
// First time through, we create our fragment programmatically.
final Bundle args = getIntent().getExtras();
friendPickerFragment = new FriendPickerFragment(args);
fm.beginTransaction()
.add(R.id.friend_picker_fragment, friendPickerFragment)
.commit();
} else {
// Subsequent times, our fragment is recreated by the framework and already has saved and
// restored its state, so we don't need to specify args again. (In fact, this might be
// incorrect if the fragment was modified programmatically since it was created.)
friendPickerFragment = (FriendPickerFragment) fm.findFragmentById(R.id.friend_picker_fragment);
}
friendPickerFragment.setOnErrorListener(new PickerFragment.OnErrorListener() {
@Override
public void onError(PickerFragment<?> fragment, FacebookException error) {
GamePlannerPickFriendsActivity.this.onError(error);
}
});
friendPickerFragment.setOnDoneButtonClickedListener(new PickerFragment.OnDoneButtonClickedListener() {
@Override
public void onDoneButtonClicked(PickerFragment<?> fragment) {
// We just store our selection in the Application for other activities to look at.
GamePlannerFriendPickerApplication application = (GamePlannerFriendPickerApplication) getApplication();
application.setSelectedUsers(friendPickerFragment.getSelection());
setResult(RESULT_OK, null);
finish();
}
});
}
private void onError(Exception error) {
String text = getString(R.string.exception, error.getMessage());
Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
toast.show();
}
@Override
protected void onStart() {
super.onStart();
try {
GamePlannerFriendPickerApplication application = (GamePlannerFriendPickerApplication) getApplication();
List<GraphUser> selectedUsers = application.getSelectedUsers();
if (selectedUsers != null && !selectedUsers.isEmpty()) {
friendPickerFragment.setSelection(selectedUsers);
}
// Load data, unless a query has already taken place.
friendPickerFragment.loadData(false);
} catch (Exception ex) {
onError(ex);
}
}
}
我還將包括清單:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.parse.integratingfacebooktutorial"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name=".IntegratingFacebookTutorialApplication" >
<activity
android:name=".LoginActivity"
android:label="@string/app_name"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".UserDetailsActivity"
android:label="@string/app_name"/>
<activity android:name=".GamePlannerPickFriendsActivity"
android:label="Pick Friends">
</activity>
<activity android:name=".GamePlannerFriendPickerApplication"
android:label="@string/app_name"/>
<activity android:name=".GamePlannerPickFriendsMainCode"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize">
</activity>
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id"/>
</application>
而且,為了安全起見,GamePlannerFriendPickerApplication.java
public class GamePlannerFriendPickerApplication extends Application {
private List<GraphUser> selectedUsers;
public List<GraphUser> getSelectedUsers() {
return selectedUsers;
}
public void setSelectedUsers(List<GraphUser> selectedUsers) {
this.selectedUsers = selectedUsers;
}
}
我真的希望你能幫助我。 我不確定我在這里做錯了什么(仍在學習繩索),所以任何幫助將不勝感激!
您需要按以下方式更改應用程序清單標簽:
<application
android:name="full.package.name.GamePlannerFriendPickerApplication"
現在,您在清單中聲明了“ IntegratingFacebookTutorialApplication”類,因此,當您獲得應用程序引用並將其強制轉換為GamePlannerFriendPickerApplication時,會拋出異常,因為該實例的類型為“ IntegratingFacebookTutorialApplication”,只需確保設置正確的應用程序名稱(GamePlannerFriendPickerApplication)和您的類強制轉換異常應該消失了...
問候!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.