- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 API Facebook,我尝试将其中一个 Scrumptious 应用程序部分添加到我的应用程序中。
美味的部分:
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();
}
}
导致问题的类"is":
public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {
这是 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>
我试过使用“class=”、“android:name=”和“tag=”。
我正在用这两个类扩展 android.support.v4.app.FragmentActivity。
这是日志!
04-02 20:16:33.880: D/KeyHash:(8899): ooZ4+XVqPy+UAL2Sk1NrWojLcIU=
04-02 20:16:33.997: D/AndroidRuntime(8899): Shutting down VM
04-02 20:16:33.997: W/dalvikvm(8899): threadid=1: thread exiting with uncaught exception (group=0x41aaf930)
04-02 20:16:34.028: E/AndroidRuntime(8899): FATAL EXCEPTION: main
04-02 20:16:34.028: E/AndroidRuntime(8899): java.lang.RuntimeException: Unable to start activity ComponentInfo{info.androidhive.tabsswipe/info.androidhive.tabsswipe.MainActivity2}: android.view.InflateException: Binary XML file line #24: Error inflating class fragment
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.os.Handler.dispatchMessage(Handler.java:99)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.os.Looper.loop(Looper.java:137)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread.main(ActivityThread.java:5039)
04-02 20:16:34.028: E/AndroidRuntime(8899): at java.lang.reflect.Method.invokeNative(Native Method)
04-02 20:16:34.028: E/AndroidRuntime(8899): at java.lang.reflect.Method.invoke(Method.java:511)
04-02 20:16:34.028: E/AndroidRuntime(8899): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-02 20:16:34.028: E/AndroidRuntime(8899): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-02 20:16:34.028: E/AndroidRuntime(8899): at dalvik.system.NativeStart.main(Native Method)
04-02 20:16:34.028: E/AndroidRuntime(8899): Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class fragment
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
04-02 20:16:34.028: E/AndroidRuntime(8899): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Activity.setContentView(Activity.java:1881)
04-02 20:16:34.028: E/AndroidRuntime(8899): at info.androidhive.tabsswipe.MainActivity2.onCreate(MainActivity2.java:91)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Activity.performCreate(Activity.java:5104)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-02 20:16:34.028: E/AndroidRuntime(8899): ... 11 more
04-02 20:16:34.028: E/AndroidRuntime(8899): Caused by: java.lang.ClassCastException: info.androidhive.tabsswipe.MainActivity cannot be cast to android.app.Fragment
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Fragment.instantiate(Fragment.java:585)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Fragment.instantiate(Fragment.java:560)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.app.Activity.onCreateView(Activity.java:4709)
04-02 20:16:34.028: E/AndroidRuntime(8899): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
04-02 20:16:34.028: E/AndroidRuntime(8899): ... 21 more
04-02 20:16:34.052: D/dalvikvm(8899): GC_CONCURRENT freed 194K, 3% free 9117K/9340K, paused 3ms+2ms, total 30ms
知道导致此问题的原因吗?提前谢谢你们!
最佳答案
ClassCastException意味着您尝试转换两个不同的东西(例如 int
和 String
..)。在您的情况下,您尝试在布局中使用 FragmentActivity
类作为 fragment ,但事实并非如此,MainActivity
是一个 FragmentActivity 和 不是 fragment
。
根据您的 LogCat,这一行:
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.MainActivity
不是 Fragment
并且不能在布局中使用。
更新:
在评论中,我建议您重新设计您的应用程序。您应该首先创建一个 Activity
来显示您的登录 FB,然后调用 Intent
显示带有 Tabs
的 FragmentActivity
并显示您的面板。
您还可以尝试另一件事:
FragmentActivity
,其布局包含一个 FrameLayout
(例如 id 容器)并位于您的 Tabs
和其他 View 中。 FragmentTransaction
并在您的 FrameLayout(容器)内显示一个显示您的登录 FB 的 fragment 。 remove
此 fragment 并让用户看到带有您的选项卡
的“背景” 并在其中显示您的面板。 希望这对您有所帮助。
关于android - 无法转换为 android.app.Fragment,使用 FragmentActivity 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825525/
我有一个像这样的 fragment 栈 F1 -> F2 -> F3 -> F4 -> F5 现在我需要删除 F2、F3、F4 fragment 。 我需要如果我从 F5 fragment 按下后退按
我需要帮助来理解以下场景的工作原理以及如何实现结果。 我有一个名为 ShoppingCart 的类。它有一个名为 addItemsToShoppingCartFromPreviousOrder 的方法
我有一个包含 ViewPager 的 fragment 。这个 ViewPager 显然是由其他 Fragments 填充的。 我的问题是,ViewPager 中的 Fragment 是否有任何方法(
所以我正在实现一个 FragmentActivity 并尝试添加一个 fragment ,但是我遇到了多个问题。我以前做过这个,实际上我使用的代码与上一个项目(它工作的地方)相同,但由于某种原因它在这
Closed. This question needs details or clarity。它当前不接受答案。
我想将 Android X fragment (androidx.fragment.app.Fragment) 转换为 Android native fragment (android.app.Fra
假设我有一个包含 10 列文本类型 (20) 的 SQLite 表。 ListFragment 将从数据库中提取 4 列并使用 SimpleCursorAdapter 显示在列表中。 选择后,List
我有一个对话框 fragment ,我为延迟初始化创建了一个类。当我显示对话框时,它显示正常。但是,当我关闭对话框时,它崩溃的原因是: fragment 与 fragment 管理器无关。 我也尝试过
我想在 View 分页器更改为 fragment 时刷新该 fragment 。 package com.mcivisoft.rcbeam; import android.os.Bundle; imp
我有一个名为的 Activity MainActivity 我在容器 R.id.mainContainer 中添加了 fragment “BenefitFragment”。 在 BenefitFrag
所以我有这个 ClientListView,效果很好,可以显示客户,我可以单击一个客户并在右侧获取他们的详细信息(在我的第二个 fragment 中)。由此处的布局定义: 这很好用,但后来我
我试过这段代码,但点击第一个 fragment 中的按钮并没有改变第二个 fragment 中的字符串值。 这是第一个 fragment 的 kotlin 文件。它有两个按钮,点击它们可以更改字符串值
我有以下情况:我打开 fragment A 和目标,通过按钮的单击事件转到 fragment B。当我在 fragment B 中并点击后退按钮(为了返回 fragment A) 我想将一些参数传递给
我制作了一个 NavigationDrawer fragment ,其中包含 Home、Settings、Feedback 等项目。 home 项在点击 home 时应该打开,home 是在应用程序启
我正在一个接一个地替换 2 个 fragment ,两个 fragment 都有不同的选项菜单。当我替换第二个 fragment 时,它也显示第一个 fragment 的菜单。 setHasOptio
我有问题: android.app.Fragment$InstantiationException: Unable to instantiate fragment ${packageName}.${a
我正在研究 fragment 转换。当我用第二个 fragment 替换第一个 fragment 时,它出现在第一个 fragment 的下方。我希望它移动到第一个 fragment 之上。我该怎么做
我在抽屉导航里总共有 12 个 fragment 。每个 fragment 都有 volley 方法。每个 fragment 都显示自己的 Volley 响应,除了 position = 1 和 po
我在我的 Activity 中使用了两个 fragment 。最初我将向 Activity 添加一个 fragment 。然后在第一个 fragment 中使用监听器我想用第二个 fragment 替
我正在实现一个“fragments-101”程序,当相应的按钮被点击时我会替换一个 fragment 。然而,下面的事情发生了: 为什么会这样?为什么初始 fragment 没有被完全替换?MainA
我是一名优秀的程序员,十分优秀!