2015-04-19 4 views
31

Я знаю, что это очень распространенный вопрос, btu Я прочитал все вопросы о переполнении стека, не найдя ответа.Ошибка раздувания класса com.facebook.widget.LoginButton с Facebook SDK 4.0.1

Я пытаюсь интегрировать кнопку входа в Facebook, используя Facebook SDK 4.0.1, добавленную через Gradle, но я получаю следующую ошибку.

java.lang.RuntimeException: Unable to start activity ComponentInfo{se.speedle.android/com.bryderi.speedle.android.activity.MainActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class com.facebook.widget.LoginButton 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
     at android.app.ActivityThread.access$600(ActivityThread.java:141) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5103) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class com.facebook.widget.LoginButton 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
     at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228) 
     at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
     at com.bryderi.speedle.android.activity.MainActivity.onCreate(MainActivity.java:36) 
     at android.app.Activity.performCreate(Activity.java:5133) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5103) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
            at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.facebook.widget.LoginButton" on path: DexPathList[[zip file "/data/app/se.speedle.android-1.apk"],nativeLibraryDirectories=[/data/app-lib/se.speedle.android-1, /system/lib]] 
     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
     at android.view.LayoutInflater.createView(LayoutInflater.java:559) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
            at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228) 
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
            at com.bryderi.speedle.android.activity.MainActivity.onCreate(MainActivity.java:36) 
            at android.app.Activity.performCreate(Activity.java:5133) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5103) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 

Я могу видеть класс LoginButton в Android Studio, так что вид работ

Вот мои build.gradle зависимости

dependencies { 

aspects 'org.robobinding:robobinding:0.8.9' 
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1' 
compile 'com.android.support:appcompat-v7:21.0.3' 
compile 'com.android.support:support-v4:21.0.3' 
compile 'com.android.support:support-v13:21.0.3' 

compile 'com.android.support:recyclerview-v7:21.0.3' 
compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2' 
compile 'com.jakewharton:butterknife:6.1.0' 
compile 'com.facebook.android:facebook-android-sdk:4.0.1' 
compile 'me.alexrs:recyclerview-renderers:1.0.3' 
compile 'com.google.android.gms:play-services:6.5.87' 
} 

Вот мой макет

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:facebook="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_horizontal" 
    android:orientation="vertical" 
    android:padding="20dp" > 

    <com.facebook.widget.LoginButton 
     android:id="@+id/connectWithFbButton" 
     style="@style/com_facebook_loginview_default_style" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_gravity="center_horizontal" 
     android:text=" connect_with_facebook"/> 
</LinearLayout> 

И соответствующие части моей деятельности

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     FacebookSdk.sdkInitialize(getApplicationContext()); 


     callbackManager = CallbackManager.Factory.create(); 


     setContentView(R.layout.activity_main); 

     // Set a Toolbar to replace the ActionBar. 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Find our drawer view 
     dlDrawer = (FragmentNavigationDrawer) findViewById(R.id.drawer_layout); 
     // Setup drawer view 
     dlDrawer.setupDrawerConfiguration((ListView) findViewById(R.id.lvDrawer), toolbar, 
       R.layout.drawer_nav_item, R.id.flContent); 
     // Add nav items 
     dlDrawer.addNavItem("Home", "First Fragment", ClassifiedsFragment.class); 
     dlDrawer.addNavItem("Favourites", "Favourites", ClassifiedsFragment.class); 
     dlDrawer.addNavItem("My Items", "Items", ClassifiedsFragment.class); 
     dlDrawer.addNavItem("Settings", "Settings", ClassifiedsFragment.class); 


     //dlDrawer.addNavItem("Second", "Second Fragment", SecondFragment.class); 
     //dlDrawer.addNavItem("Third", "Third Fragment", ThirdFragment.class); 
     // Select default 
     if (savedInstanceState == null) { 
      dlDrawer.selectDrawerItem(0); 
     } 
    } 
+0

Попробуйте удалить 'стиль =«@ стиль/com_facebook_loginview_default_style»' – VadymVL

+0

я все еще получаю ту же ошибку, даже после удаления 'стиль =" @ стиль/com_facebook_loginview_default_style "' –

+0

Вы пытались поставить 'setContentView()' над 'FacebookSdk.sdkInitialize'? Я не уверен, но, возможно, FacebookSdk пытается взаимодействовать с вашим (в то время неинфляционным) представлением. – AlexWalterbos

ответ

35

В facebook sdk 4.0.1, LoginButton класс не внутри com.facebook.widget упаковка. Он находится внутри пакета com.facebook.login.widget. Таким образом, ваша xml-декларация должна выглядеть так:

<com.facebook.login.widget.LoginButton 
    android:id="@+id/connectWithFbButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:layout_gravity="center_horizontal" 
    android:text=" connect_with_facebook" /> 
+0

Так оно и было, большое спасибо, я должен был заметить пропущенный логин после просмотра сообщения об ошибке, –

+0

@MattiasJohansson: Я рад помочь. Если вы сочтете это полезным, отметьте его как ответ или повысьте, чтобы другие разработчики могли пойти на это решение, когда сталкивались с такими ошибками. –

+0

работал для меня. Благодарю. – stack

1

На документах Facebook пакет устарел. Для новых версий 4 и выше новый пакет для кнопки - com.facebook.login.widget.LoginFacebook.

зависимостей:

compile 'com.facebook.android:facebook-android-sdk:4.5.0' 

activity_login.xml:

<com.facebook.login.widget.LoginButton 
    android:id="@+id/connectWithFbButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:layout_gravity="center_horizontal" /> 

Наслаждайтесь!

+1

, если вы используете 'com.facebook.android:facebook-android-sdk:4.6.0' все еще какая-то проблема, поэтому измените на 'com.facebook.android:facebook-android-sdk:4.5.0' –

5

привет всем, что ваш код является правильным. следуйте инструкциям ниже.

положить FacebookSdk.sdkИнтициализировать (getApplicationContext()); перед установкойContentView();

и положить следующую строку в XML компоновкой родителя

XMLNS: facebook = "http://schemas.android.com/apk/res-auto"

как,

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:facebook="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.facebook.login.widget.LoginButton 
     android:id="@+id/login_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginBottom="30dp" 
     android:layout_marginTop="30dp" /> 


</RelativeLayout> 
158

Вызвано: SDK не был инициализирован, обязательно позвоните по номеру FacebookSdk.sdkInitialize().

Перед установкойContentView убедитесь, что вы инициализировали SDK в facebook.

FacebookSdk.sdkInitialize(getApplicationContext()); 
setContentView(R.layout.activity_main); 
+8

Это должно быть принято ответ. Благодаря! – zackygaurav

+0

Так оно и было. Сэкономил мне массу времени. – drulabs

+0

Вы экономите мой день :) –

4

Убедитесь, что Facebook SDK инициализируется перед setContentView FacebookSdk.sdkInitialize(getApplicationContext()); setContentView(R.layout.activity_main);

9

только добавить эти методы класса приложений вашего приложения ::

FacebookSdk.sdkInitialize(getApplicationContext()); 

AppEventsLogger.activateApp(this); 

Befeore: setContentView в OnCreate деятельности.

В зависимости импорта:

compile 'com.facebook.android:facebook-android-sdk:[4,5)' or smaller 

Наслаждайтесь :)

1

В SDK не был инициализирован, убедитесь, что для вызова FacebookSdk.sdkInitialize() первым

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(this.getApplicationContext());    
    setContentView(R.layout.activity_main1); 
} 
+0

компилировать 'com.facebook.android:facebook-android-sdk:[4,5)' –

Смежные вопросы