35

I know this is a very common question, btu I have read through all the stack overflow questions without finding an answer.

I'm trying to integrate the Facebook Login Button using Facebook SDK 4.0.1 added through Gradle, but I get the following error.

  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)

I can see the LoginButton class in Android Studio, so it kind of works

Here's my build.gradle dependencies

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'
}

Here's my layout

<?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>

And the relevant parts of my activity

@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);
        }
    }
Mattias Johansson
  • 723
  • 2
  • 6
  • 22

9 Answers9

168

Caused by: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.

Make sure you initialized facebook SDK before setContentView.

FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
Basheer AL-MOMANI
  • 14,473
  • 9
  • 96
  • 92
Lay Leangsros
  • 9,156
  • 7
  • 34
  • 39
  • 5
    It's better to initialize the Facebook SDK inside your Application "onCreate". – Borja Mar 12 '16 at 13:37
  • I call `sdkInitialize` in `MainActivity` before `setContentView`, but still crashing. Facebook logic is on an other activity. Should I call `sdkInitialize` on that activity as well? – János Oct 11 '16 at 14:03
  • What if I'm using 4.24.0 version of facebookSdk? In this version FacebookSdk.sdkInitialize() method is deprecated and as facebook documentation says it should automatically initialize itself but it does not.... What should I do? – Nikas Žalias Sep 06 '17 at 10:32
35

In facebook sdk 4.0.1, LoginButton class is not inside com.facebook.widget package. It is inside com.facebook.login.widget package. So your xml declaration should look like this:

  <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" />
Mehul Joisar
  • 15,348
  • 6
  • 48
  • 57
  • I have used implementation 'com.facebook.android:facebook-login:4.42.0' and com.facebook.login.widget.LoginButton in xml, but still same issue coming..!! – Siddharth Thakkar Feb 18 '20 at 12:28
10

Only add this methods of your app's Application class::

FacebookSdk.sdkInitialize(getApplicationContext());

AppEventsLogger.activateApp(this);

Befeore: setContentView in onCreate Activity.

In dependencies import:

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

Enjoy :)

Krste Moskov
  • 157
  • 2
  • 6
7

Don't forget to added the android app id in the android manifest inside the application xml tag

<application> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> </application>

Nelson Katale
  • 1,309
  • 15
  • 21
user8459720
  • 375
  • 3
  • 9
5

hey friends all your code is right. follow below instructions.

put FacebookSdk.sdkInitialize(getApplicationContext()); before setContentView();

and put following line in your xml parent layout

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

like,

<?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>
Amol Suryawanshi
  • 2,108
  • 21
  • 29
5

Make sure that your Facebook SDK is initialized before setContentView FacebookSdk.sdkInitialize(getApplicationContext()); setContentView(R.layout.activity_main);

Zahid Ali
  • 239
  • 5
  • 11
2

The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());            
    setContentView(R.layout.activity_main1);
}
Keshav Gera
  • 10,807
  • 1
  • 75
  • 53
1

On Facebook docs the package is outdated. For new versions, 4 and up the new package for the button is com.facebook.login.widget.LoginFacebook.

dependencies:

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" />

Enjoy!

Marcio Mangar
  • 156
  • 3
  • 4
  • 1
    if you use 'com.facebook.android:facebook-android-sdk:4.6.0' still some problem so change to 'com.facebook.android:facebook-android-sdk:4.5.0' – Lalit kumar Oct 30 '15 at 11:15
0

FacebookSdk.sdkInitialize(); is deprecated. Don't use it anymore.

And follow this tutorial here: https://developers.facebook.com/docs/facebook-login/android without using the com.facebook.login.widget.LoginButton.

Try to use a normal button using this code:

/**
 * Setup Facebook Login Button
 */
@Override
public void setupFacebookLoginButton() {
    Button btnFacebook = mActivityReference.findViewById(R.id.btnFacebook);
    Drawable leftDrawable = AppCompatResources.getDrawable(mActivityReference, R.drawable.ic_facebook_icon);
    btnFacebook.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);

    // Start Facebook integration
    LoginManager fbLoginManager = com.facebook.login.LoginManager.getInstance();
    mFaceCallbackManager = CallbackManager.Factory.create();
    fbLoginManager.registerCallback(mFaceCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();
            // Your accessToken is here
        }

        @Override
        public void onCancel() {
            Log.d("asd", "asd");
        }

        @Override
        public void onError(FacebookException e) {
            Log.d("asd", "asd");
        }
    });

    btnFacebook.setOnClickListener(v -> fbLoginManager.logInWithReadPermissions(
        mActivityReference,
        Arrays.asList("email", "public_profile", "user_birthday")));
}

/**
     * Facebook Call Back
     *
     * @param requestCode request code
     * @param resultCode  result code
     * @param data        data
     */
    @Override
    public void facebookCallBack(int requestCode, int resultCode, Intent data) {
        if (mFaceCallbackManager != null) {
            mFaceCallbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }
André Luiz Reis
  • 2,273
  • 21
  • 14