android - Facebook Android API 和 Twitter Webview 登录集成

标签 android twitter android-fragments facebook-android-sdk

我有一个 android 应用程序,它要求用户使用 facebook 或 twitter 登录。我设法实现了这两个并且部分成功了。 Facebook 登录是使用 this 实现的来自 Facebook 的教程。

至于 twitter 登录,我只是使用了一个按钮来启动执行 webview 登录的 TwitterLoginActivity,如果它成功启动 TwitterHomeActivity,它的实现在 fragment 方面与 facebook 登录非常相似。

所以这是整个登录实现的细目

FacebookHomeActivity 有 3 个 fragment

  • FacebookSplashFragment(使用 fb 或 twitter 登录的选项)
  • FacebookSelectionFragment(显示应用菜单)
  • FacebookUserSettingsFragmen(注销用户)。

TwitterHomeActivity 有 2 个 fragment

  • TwitterSelectionFragment(显示应用菜单)
  • TwitterUserSettingsFragment(注销用户)

TwitterLoginActivity(包含一个 webview 以通过我的服务器执行身份验证,它将重定向到 Twitter 页面以进行登录)

问题是,如果您还没有看到,如果我从 Twitter 帐户注销,我必须启动 FacebookHomeActivity 才能看到登录 Facebook 或 Twitter 的选项。

这样做是非常 hacky 和糟糕的。所以我想,如果我把它全部制作成 fragment ,它可能会解决我的问题。

LoginActivity(所有登录的主机)包含:

  • LoginSelectionFragment(选择使用 facebook 或 twitter 登录)
  • TwitterLoginFragment(通过 webview 登录用户)
  • FacebookSelectionFragment(授权用户并显示菜单)
  • TwitterSelectionFragment(显示菜单)
  • FacebookUserSettingFragment(注销 fb 用户)
  • TwitterUserSettingFragment(注销 Twitter 用户)

通过使用它来显示不同登录状态下的正确 fragment :

        @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
        getSupportActionBar().show();
        showFragment(FACEBOOKSELECTION, false);
    }

    else if (Globals.loggedIn() && Globals.isTwitterUser()) {
        // otherwise present the splash screen
        // and ask the person to login.
        getSupportActionBar().show();
        showFragment(TWITTERSELECTION, false);

    } 
    else {
        // otherwise present the splash screen
        // and ask the person to login.
        Globals.logout();
        getSupportActionBar().hide();
        showFragment(LOGINSELECTION, false);
    }

}

让所有的登录逻辑都以 fragment 的形式存在对我来说似乎很有意义,但它并不像我想象的那样工作。相反,它基本上运行每个 fragment 中的 onStart() 中的所有内容,因此想象一下大量的 progressDiaglogs 弹出,除此之外什么都没有发生。后台堆栈也搞砸了,导致从未显示过的 fragment 显示出来。要么我实现这个错误,要么这是解决这个问题的完全错误的方法。

我的问题是:如果这不是解决问题的好方法,那么实现 Facebook 登录和 Twitter 登录的更好方法是什么。

如果以上确实有道理并且没有任何问题,您认为我做错了什么?

最佳答案

在尝试了大约 5 天的新方法之后,例如将 facebook 登录身份验证隔离到它自己的 Activity 和它自己的一组 fragment ,但也未能按应有的方式运行,我阅读了 Fragments Documentation这让我更好地理解了 fragment 的实际工作原理和工作原理。对于遇到与我类似问题的任何人,我强烈建议您先阅读文档。

我使用的 FragmentManager 或 SupportFragmentManager 与方法 beginTransaction() 一起公开名为 replace() 的方法这将允许您将当前 View 中的 fragment 替换为您想要显示的 fragment 。下面是我如何使用它:

  public void replaceFragment(Fragment f, Boolean addToBackStack) {
        if (addToBackStack) {
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, f).addToBackStack(null).commit();
        } else {
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, f).commit();
        }
    }

The addToBackStack parameter is for you to decide if the user can navigate back to that fragment after you show the new one.

因此,我没有使用 Facebook Android API 示例中显示的 showFragment(),而是将所有 showFragment() 方法替换为 replaceFragment()。

两者之间的区别在于,当您使用 showFragment() 方法时,您可以在主机 Activity (在我的例子中是 LoginActivity.java)中预加载所有 fragment ,发生的是所有 fragment 的 onCreate(), onStart() 和 onResume() 函数被调用。这种行为很糟糕,因为我的一些 fragment 开始执行 onStart() 方法中的代码,导致所有 progressDialogs 在不应该显示的时候也显示。

通过使用上面显示的 replaceFragment() 方法,我可以仅在需要显示 fragment 时实例化 fragment ,从而允许我正常使用生命周期方法(onCreate()、onStart()、onResume() 等)。

用户登录成功后,我简单地向用户显示我的菜单并使用以下方法清除返回堆栈:

public void clearBackStack() {
    FragmentManager manager = getSupportFragmentManager();
    // Get the number of entries in the back stack
    int backStackSize = manager.getBackStackEntryCount();
    // Clear the back stack
    for (int i = 0; i < backStackSize; i++) {
        manager.popBackStack();
    }
}

Key areas to clear the back stack would be after the user has successfully logged in, and when the user has successfully logged out.

有了这个,我能够更好地控制 fragment ,因为它们在生命周期方面表现得像 Activity 。

希望这对外面的人有所帮助。

关于android - Facebook Android API 和 Twitter Webview 登录集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18876282/

相关文章:

android - Cordova 构建和 gradle 依赖项

android - 基于 Web 服务的 Android 应用程序的测试策略

java - 最小化 setOnSeekBarChangeListener 样板

iphone - iOS - 在不使用 ARC 的应用程序中使用 Twitter Reverse auth

iphone - 在 iPhone 应用程序中使用 Twitter API

php - Laravel Twitter 库 - 静态函数 getUserTimeline() 在哪里

Android fragment XML 布局问题

Android Bottomsheet TextView 高度在第一次扩展时未调整

android - 将字符串从 fragment 主要 Activity 传递到 viewpager 中的 fragment Activity

android - onOptionsItemSelected() 在 Fragment 上被调用两次