Android:如何隐藏Facebook登录中的进度圆圈

17

我正在使用这种方法进行Facebook登录,而不使用fb按钮“无需登录按钮的Facebook认证”

它可以正常工作,但在进行fb登录期间会显示一个黑色背景的进度条,我猜是来自活动com.facebook.LoginActivity

如何避免显示该活动?我只想在com.facebook.LoginActivity中的登录期间显示我的应用程序活动中的进度条


你好,据我所知这是不可能的。那个屏幕无法被其他东西重载。 - deesarus
3个回答

63

我在使用 Facebook SDK 4.X 时遇到了同样的问题。当我点击 Facebook 登录按钮时,Facebook Activity 窗口会半透明显示,并显示一个进度条。幸运的是,我们可以在主题中禁用这个进度条。因此,Facebook Activity 被声明为

<activity
    android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

我们只需要创建一个继承自Theme.Translucent.NoTitleBar的样式并隐藏进度条即可:
<style name="FullyTranslucent" parent="android:Theme.Translucent.NoTitleBar">
    <item name="android:progressBarStyle">@style/InvisibleProgress</item>
</style>

<style name="InvisibleProgress">
    <item name="android:visibility">gone</item>
</style>

现在将活动的主题设置为我们的新主题:

<activity
    android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name"
    android:theme="@style/FullyTranslucent" />

好了!登录前的进度条已经消失。


@Andrew刚刚用4.7试了一下,运行良好。您还遇到了麻烦吗? - VM4
是的。根本不起作用。我甚至不确定它对你来说是如何工作的,考虑到他们是通过编程方式构建ProgressDialog:spinner = new ProgressDialog(getContext()); - Bogdan Zurac
在你的清单文件中使用android:theme="@style/FullyTranslucent"代替android:theme="@android:style/Theme.Translucent.NoTitleBar"。它可以正常工作。谢谢。 - Michael Katkov
6
工作得很好,我在活动中添加了 "tools:replace="android:theme"" 以解决一些冲突问题,不过还是谢谢! - Andrea Biagioni
在清单文件中添加 xmlns:tools="http://schemas.android.com/tools",并在活动中添加 tools:replace="android:theme",我成功让它工作了。 - Snowbases
显示剩余2条评论

21
为了进一步完善@VM4的优秀答案,我修改了他们的方法,使其能够与SDK版本4.12.0正确配合使用。
首先,我在AndroidManifest.xml中添加了以下内容。
 <activity xmlns:tools="http://schemas.android.com/tools"
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@style/Translucent"
            tools:replace="android:theme"/>
在Android Studio 2.2中,可能会出现清单合并产生错误的情况,抱怨无法覆盖android:theme,因为它已经存在。可以在<activity>标签中使用tools:replace="android:theme"来解决这个问题。
我在/res/values/styles.xml中创建了一个自定义样式。
 <style name="Translucent" parent="Translucent.Base"/>

 <style name="Translucent.Base" parent="android:Theme.Translucent.NoTitleBar">
    <item name="android:progressBarStyle">@style/InvisibleProgress</item>
 </style>

这样做成功地移除了丑陋的Facebook进度对话框。

然而,在5.0(API 21)及以上版本设备上,这会导致系统顶部状态栏在FacebookActivity活动期间变为黑色。

为了解决此问题,我在res/values-v21/styles.xml中添加了一个样式。

<style name="Translucent" parent="Translucent.Base">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style> 

这使得主题完全透明并移除了进度对话框。

最后需要注意的是,对于建议使用@android:style/Theme.NoDisplay的解决方案,在Android Marshmallow 6.0(API 23)及以上版本中将无法使用,因此未来可能应该避免使用该解决方案。


我尝试使用Android Studio 3.2.1尝试了这个解决方案,但是我遇到了“Android资源链接失败”和“错误:找不到资源样式/InvisibleProgress”。有什么想法吗? - highwaychile
1
@highwaychile 请查看 VM4 的答案,那里定义了样式。 - Ed Holloway-George
哇,我一直在寻找解决黑色状态栏的方法,这个方法解决了4.41.0版本的问题,谢谢Ed! - asozcan

-1

简单的解决方案就是在registercallback中显示进度条。

看看我的代码:

fb_login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

        @Override
        public void onSuccess(LoginResult loginResult) {

            progressBar.setVisibility(View.VISIBLE);

            // App code
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) {
                            // Application code
                            Log.v("Profile ---------   ", response.toString());

                            progressBar.setVisibility(View.GONE);

                            try {

                                if (object!=null){

                                    F_ID = object.getString("id");
                                    if (object.has("first_name"))
                                        Name = object.getString("name");
                                    Log.d(TAG, "onCompleted: Name - "+object.getString("name"));
                                    if (object.has("last_name"))
                                        LastName = object.optString("last_name");
                                    Log.d(TAG, "onCompleted: LastName - "+object.optString("last_name"));
                                    if (object.has("email"))
                                        Email = object.optString("email");
                                    if (object.has("birthday"))
                                        DOB = object.optString("birthday");


                                    ProfilePic = "https://graph.facebook.com/" + F_ID + "/picture?type=large";

                                    Toast.makeText(getApplicationContext(), "Login Successful!", Toast.LENGTH_LONG).show();

                                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                                    intent.putExtra("Name", object.getString("name"));
                                    intent.putExtra("Email", Email);
                                    intent.putExtra("DOB", DOB);
                                    intent.putExtra("ID", F_ID);
                                    intent.putExtra("ImgURL", ProfilePic);
                                    Log.d(TAG, "onCompleted: Email = "+Email+" Name = "+Name+" FID = "+F_ID);
                                    //sharedpreference is used to store the email, password and the useername
                                    SharedPreferenceManager.setDefaults("email", Email, SigninActivity.this);
                                    SharedPreferenceManager.setDefaults("facebook_id", F_ID, SigninActivity.this);
                                    SharedPreferenceManager.setDefaults("profile_pic", "https://graph.facebook.com/" + F_ID + "/picture?type=large", SigninActivity.this);

                                    if (object.has("name"))
                                    SharedPreferenceManager.setDefaults("username", Name, SigninActivity.this);
                                    Log.d(TAG, "onCompleted: Store shared data");

                                    startActivity(intent);

                                }else
                                    Log.d(TAG, "onCompleted: object is null "+object);


                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }
                    });

            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender, birthday");
            request.setParameters(parameters);
            request.executeAsync();

            System.out.println("Facebook Login Successful!");
            System.out.println("Logged in user Details : ");
            System.out.println("--------------------------");
            System.out.println("User ID  : " + loginResult.getAccessToken().getUserId());
            System.out.println("Authentication Token : " + loginResult.getAccessToken().getToken());

        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(), "Login cancelled by user!", Toast.LENGTH_LONG).show();
            System.out.println("Facebook Login Cancel!!");

        }

        @Override
        public void onError(FacebookException e) {
            Toast.makeText(getApplicationContext(), "Something went wrong!!", Toast.LENGTH_LONG).show();
            System.out.println("Facebook Login failed!! because of " + e.getCause().toString());
        }
    });

Facebook SDK有自己的“层”,并且在您的视图上显示其旋转器。你的回答中哪里是用户要求的隐藏部分?你只是从你的应用程序中复制了一堆登录相关的内容,并在其上添加了ProgressBar... - Bartando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接