Facebook LoginButton无法实现

时间:2015-10-18 16:45:36

标签: android facebook facebook-login facebook-android-sdk

在我们的某个应用中,某些用户在启动应用时会遇到强制关闭。事实证明,Facebook按钮出现了问题。我去设计师,我看到一个灰色的矩形代替了所需的按钮,错误:

  

渲染问题       以下类无法实例化:        - com.facebook.login.widget.LoginButton(Open Class,Show Exception,Clear Cache)   提示:自定义视图中的用户View.isInEditMode()在IDE中显示时跳过代码数据

     

异常细节       java.lang.NoSuchFieldError:com_facebook_login_view_com_facebook_confirm_logout           在com.facebook.login.widget.LoginButton.parseLoginButtonAttributes(LoginButton.java:591)           在com.facebook.login.widget.LoginButton.configureButton(LoginButton.java:551)           在com.facebook.FacebookButtonBase。(FacebookButtonBase.java:66)           在com.facebook.login.widget.LoginButton。(LoginButton.java:200)           at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)           at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)           at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)           at java.lang.reflect.Constructor.newInstance(Constructor.java:408)           在org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:437)           在org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:154)           在org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:93)           在com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:190)           在android.view.BridgeInflater.loadCustomView(BridgeInflater.java:214)           在android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:142)           在android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:806)           在android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)           在android.view.LayoutInflater.rInflate(LayoutInflater.java:782)           在android.view.LayoutInflater.inflate(LayoutInflater.java:504)           在android.view.LayoutInflater.inflate(LayoutInflater.java:385)           在com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:413)           在com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:321)           在com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)           在com.android.tools.idea.rendering.RenderTask $ 2.compute(RenderTask.java:511)           在com.android.tools.idea.rendering.RenderTask $ 2.compute(RenderTask.java:499)           在com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:888)           在com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:499)           在com.android.tools.idea.rendering.RenderTask.access $ 600(RenderTask.java:72)           在com.android.tools.idea.rendering.RenderTask $ 3.call(RenderTask.java:611)           在com.android.tools.idea.rendering.RenderTask $ 3.call(RenderTask.java:608)           在com.android.tools.idea.rendering.RenderService.runRenderAction(RenderService.java:363)           在com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:608)           在com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:630)           在com.intellij.android.designer.designSurface.AndroidDesignerEditorPanel $ 6.run(AndroidDesignerEditorPanel.java:480)           在com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)           在com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)           在com.intellij.util.ui.update.MergingUpdateQueue $ 2.run(MergingUpdateQueue.java:254)           在com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)           在com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)           在com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)           在com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)           at com.intellij.util.Alarm $ Request $ 1.run(Alarm.java:351)           at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)           at java.util.concurrent.FutureTask.run(FutureTask.java:266)           在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)           at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)           在java.lang.Thread.run(Thread.java:744)

虽然这似乎是一个IDE问题,但我从用户那里获得的堆栈跟踪是相同的:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yolify.android/com.yolify.android.Activity_Splash}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.login.widget.LoginButton.setBackgroundResource(int)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2802)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2867)
    at android.app.ActivityThread.access$900(ActivityThread.java:181)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1476)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:145)
    at android.app.ActivityThread.main(ActivityThread.java:6134)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.login.widget.LoginButton.setBackgroundResource(int)' on a null object reference
    at com.yolify.android.Activity_Splash.onCreate(Activity_Splash.java:214)
    at android.app.Activity.performCreate(Activity.java:6374)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
    ... 10 more

活动

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        mCallbackManager = CallbackManager.Factory.create();
        tracker = new AccessTokenTracker() {

            @Override
            protected void onCurrentAccessTokenChanged(com.facebook.AccessToken oldAccessToken, com.facebook.AccessToken currentAccessToken) {

            }
        };
        tracker.startTracking();

        setContentView(R.layout.activity_splash);

        btn_fblogin = (LoginButton) findViewById(R.id.login_button);
        btn_fblogin.setBackgroundResource(R.drawable.btn_facebook_selector);
        btn_fblogin.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); 
        btn_fblogin.setReadPermissions(PERMISSIONS);
        btn_fblogin.registerCallback(mCallbackManager, mCallback);


        btn_fblogin.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                if(CheckNetwork.isInternetAvailable(Activity_Splash.this)) {
                    LoginManager.getInstance().logInWithReadPermissions(Activity_Splash.this, PERMISSIONS);
                } else {
                    Toast.makeText(getApplicationContext(), "Please check your internet connection", Toast.LENGTH_SHORT).show();
                }
            }
        });
        ...

    }

就像Facebook按钮在他们的手机上不存在一样。这是一个正常的活动。 Facebook sdk被添加为依赖项(.aar文件,而不是gradle)。所有Facebook相关的进口都很好。 Min SDK是15,错误来自Android 4.1到5.0。 怎么了?

2 个答案:

答案 0 :(得分:0)

问题出在

btn_fblogin.setBackgroundResource(R.drawable.btn_facebook_selector);

btn_fblogin为空,您必须确保@+id/login_button中存在ID activity_splash.xml

修改 如果您在activity_splash.xml中有自定义视图,那么试试这个 - > https://stackoverflow.com/a/30785533/1008278

答案 1 :(得分:0)

之前我有这样的问题,我通过使用我自己的按钮来解决,该按钮调用loginbuton(facebook)的点击btn_fblogin.callOnClick();

//渲染问题是因为您在运行时设置了这两行    btn_fblogin.setBackgroundResource(R.drawable.btn_facebook_selector);    btn_fblogin.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);