无法使用FragmentActivity两次强制转换为android.app.Fragment
我目前正在使用Facebook的API,我试图将一个美味的应用程序部分添加到我的应用程序中 美味的部分:无法使用FragmentActivity两次强制转换为android.app.Fragment,android,fragment,android-fragmentactivity,Android,Fragment,Android Fragmentactivity,我目前正在使用Facebook的API,我试图将一个美味的应用程序部分添加到我的应用程序中 美味的部分: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; i
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.facebook.AppEventsLogger;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.google.android.gms.maps.SupportMapFragment;
public class MainActivity2 extends FragmentActivity {
private static final String USER_SKIPPED_LOGIN_KEY = "user_skipped_login";
private static final int SPLASH = 0;
private static final int SELECTION = 1;
private static final int SETTINGS = 2;
private static final int FRAGMENT_COUNT = SETTINGS +1;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
private MenuItem settings;
private boolean isResumed = false;
private boolean userSkippedLogin = false;
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
PackageInfo info = getPackageManager().getPackageInfo(
"info.androidhive.tabsswipe",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
if (savedInstanceState != null) {
userSkippedLogin = savedInstanceState.getBoolean(USER_SKIPPED_LOGIN_KEY);
}
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager fm = getSupportFragmentManager();
SplashFragment splashFragment = (SplashFragment) fm.findFragmentById(R.id.splashFragment);
fragments[SPLASH] = splashFragment;
fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment);
SupportMapFragment test = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mainActivity2);
fragments[SELECTION] = test;
FragmentTransaction transaction = fm.beginTransaction();
for(int i = 0; i < fragments.length; i++) {
transaction.hide(fragments[i]);
}
transaction.commit();
splashFragment.setSkipLoginCallback(new SplashFragment.SkipLoginCallback() {
@Override
public void onSkipLoginPressed() {
userSkippedLogin = true;
showFragment(SELECTION, false);
}
});
}
@Override
public void onResume() {
super.onResume();
uiHelper.onResume();
isResumed = true;
// Call the 'activateApp' method to log an app event for use in analytics and advertising reporting. Do so in
// the onResume methods of the primary Activities that an app may be launched into.
AppEventsLogger.activateApp(this);
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
isResumed = false;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
outState.putBoolean(USER_SKIPPED_LOGIN_KEY, userSkippedLogin);
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
// if the session is already open, try to show the selection fragment
showFragment(SELECTION, false);
userSkippedLogin = false;
} else if (userSkippedLogin) {
showFragment(SELECTION, false);
} else {
// otherwise present the splash screen and ask the user to login, unless the user explicitly skipped.
showFragment(SPLASH, false);
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// only add the menu when the selection fragment is showing
if (fragments[SELECTION].isVisible()) {
if (menu.size() == 0) {
settings = menu.add(R.string.settings);
}
return true;
} else {
menu.clear();
settings = null;
}
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.equals(settings)) {
showSettingsFragment();
return true;
}
return false;
}
public void showSettingsFragment() {
showFragment(SETTINGS, true);
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
int backStackSize = manager.getBackStackEntryCount();
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
// check for the OPENED state instead of session.isOpened() since for the
// OPENED_TOKEN_UPDATED state, the selection fragment should already be showing.
if (state.equals(SessionState.OPENED)) {
showFragment(SELECTION, false);
} else if (state.isClosed()) {
showFragment(SPLASH, false);
}
}
}
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.show(fragments[i]);
} else {
transaction.hide(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
}
下面是XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
class="info.androidhive.tabsswipe.MainActivity"
android:id="@+id/mainActivity2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="info.androidhive.tabsswipe.SplashFragment"
android:id="@+id/splashFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.facebook.widget.UserSettingsFragment"
android:id="@+id/userSettingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
知道是什么导致了这个问题吗?
提前谢谢大家 表示您尝试强制转换两种不同的内容(例如int
和字符串
)。在您的情况下,您尝试在布局中使用FragmentActivity
类作为片段,但事实并非如此,MainActivity
是一个FragmentActivity,而not是一个fragment
根据您的日志,这一行:
java.lang.ClassCastException: info.androidhive.tabsswipe.MainActivity cannot be cast to android.app.Fragment
你的问题是:
<fragment
class="info.androidhive.tabsswipe.MainActivity"
android:id="@+id/mainActivity2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
info.androidhive.tabsswipe.main活动
不是片段
,不能在版面中使用
更新:
在评论中,我建议你重新设计你的应用程序。您应该首先创建一个
活动
来显示您的登录FB,然后调用一个选项卡
来显示一个片段活动
,并显示您的面板。您还可以尝试其他方法:
- 创建一个
,其布局包含FragmentActivity
(例如id容器)并位于FrameLayout
选项卡和其他视图中李>
- 在FragmentActivity中,在第一次创建时,执行
,并在FrameLayout(容器)内显示一个显示登录FB的片段李>FragmentTransaction
- 然后,当用户登录时,该片段将显示出来,让用户使用
选项卡查看“背景”,并在其中显示您的面板李>
- 在FragmentActivity中,在第一次创建时,执行
希望这有帮助。谢谢您的回答!那我该怎么办?嗯,我真的不明白你想用这个做什么。。但是,您可以做出一些选择:创建另一个片段,或者在MainActivity而不是MainActivity2内托管片段。。你想用你的代码实现什么?Facebook提供的部分(MainActivity2)将被用作应用程序的实际主屏幕。它将包含用户未登录时的登录屏幕,或在登录时“重定向”到用户面板。它觉得代码是一个“准备就绪”的部分,但它看起来不是!我认为它“准备好了”,但你想快点。我知道您想要在
MainActivity2
中有一张地图?(我阅读了SupportMapFragment)将您的MainActivity布局片段
视图更改为SupportMapFragment类片段
,在这里您将看到:我的错,我不想要MainActivity2类上的任何映射。我只是想用任何可能的解决办法来解决它。。。这个类包含选项卡和其他内容。mAdapter=new TabsPagerAdapter(getSupportFragmentManager());
java.lang.ClassCastException: info.androidhive.tabsswipe.MainActivity cannot be cast to android.app.Fragment
<fragment
class="info.androidhive.tabsswipe.MainActivity"
android:id="@+id/mainActivity2"
android:layout_width="match_parent"
android:layout_height="match_parent" />