来自fabric的Twitter登录在片段中不起作用

Posted

技术标签:

【中文标题】来自fabric的Twitter登录在片段中不起作用【英文标题】:Twitter Login from fabric doesn't work in fragments 【发布时间】:2015-10-26 07:20:26 【问题描述】:

授权完成,但出现错误

10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: com.twitter.sdk.android.core.TwitterAuthException:授权失败。 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: 在 com.twitter.sdk.android.core.identity.TwitterAuthClient.handleAuthorize(TwitterAuthClient.java:110) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: 在 com.twitter.sdk.android.core.identity.TwitterAuthClient.authorize(TwitterAuthClient.java:101) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: 在 com.twitter.sdk.android.core.identity.TwitterLoginButton$LoginClickListener.onClick(TwitterLoginButton.java:161) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: 在 android.view.View.performClick(View.java:5198) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 android.view.View$PerformClick.run(View.java:21147) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 android.os.Handler.handleCallback(Handler.java:739) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 android.os.Handler.dispatchMessage(Handler.java:95) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 android.os.Looper.loop(Looper.java:148) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 android.app.ActivityThread.main(ActivityThread.java:5417) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 java.lang.reflect.Method.invoke(本机方法)10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 10-26 11:58:33.404 7456-7456/com.idfcwalletapp.idfc_wallet E/Twitter: 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我的片段代码是:

public class FragmentSample extends Fragment 
    private TwitterLoginButton loginButton;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
       View rootView=inflater.inflate(R.layout.fragment_sample,container,false);
        loginButton = (TwitterLoginButton)rootView. findViewById(R.id.twitter_login_button);

        return rootView;
    

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(getActivity(), new Twitter(authConfig));

        loginButton.setCallback(new Callback<TwitterSession>() 
            @Override
            public void success(Result<TwitterSession> result) 
                // The TwitterSession is also available through:
                // Twitter.getInstance().core.getSessionManager().getActiveSession()
                TwitterSession session = result.data;
                // TODO: Remove toast and use the TwitterSession's userID
                // with your app's user model
                String msg = "@" + session.getUserName() + " logged in! (#" + session.getUserId() + ")";
                Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();
            

            @Override
            public void failure(TwitterException exception) 
                Log.d("TwitterKit", "Login with Twitter failure", exception);
            
        );
    

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        loginButton.onActivityResult(requestCode, resultCode, data);

    

【问题讨论】:

在容器活动的后续更改后,它现在正在工作。 FragmentSample 片段 = 新的 FragmentSample(); android.support.v4.app.FragmentTransaction 事务 = getSupportFragmentManager().beginTransaction(); // transaction.add(R.id.more_activity_container, fragment).commit(); transaction.replace(R.id.more_activity_container, fragment, TAG_PROFILE_FRAGMENT) .addToBackStack(null) .commit(); 其中 TAG_PROFILE_FRAGMENT 可以是任何唯一标志。我把它作为私有静态最终字符串 TAG_SAMPLE_FRAGMENT = "sampleFragment"; 【参考方案1】:

虽然迟到是解决办法。

片段的onActivityResult 不会被直接调用。它调用调用片段的活动的 onActivityResult。因此,首先在您的活动上覆盖 onActivityResult,如下所示,

fragment = getSupportFragmentManager().findFragmentByTag(title);
if (fragment != null) 
fragment.onActivityResult(requestCode, resultCode, data);

希望它有效:)

【讨论】:

以上是关于来自fabric的Twitter登录在片段中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录在 Twitter iOS 应用程序中不起作用

Android Twitter登录按钮不起作用

片段中的按钮在android中不起作用

如何使用fabric从twitter webview中检索登录回调

如何在 iOS 中使用 Twitter Kit/Fabric 从登录用户获取用户个人资料图片

在我的 Android 应用程序中,将数字(通过 Twitter 的 Fabric)升级到 2.0.0 版后,数字主题不起作用