Android: как скрыть круг прогресса в Facebook

Я использую этот метод для входа в систему Facebook без использования кнопки fb Facebook без кнопки входа в систему

Он работает нормально, но индикатор хода с черным фоном отображается во время входа fb, я думаю, из Activity com.facebook.LoginActivity

Как я могу избежать отображения этой активности?, я просто хочу показать свой собственный прогресс из своей активности приложения во время входа в com.facebook.LoginActivity

Ответы

Ответ 1

У меня была та же проблема с facebook sdk 4.x. Когда я нажимаю кнопку входа в facebook, функция Facebook появляется полупрозрачной, но на ней отображается индикатор выполнения. К счастью, мы можем отключить этот индикатор выполнения в теме. Таким образом, активность Facebook объявлена ​​как

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

Voila! ProgressBar перед входом в систему отсутствует.

Ответ 2

Для дальнейшего превосходного ответа @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 нельзя переопределить, поскольку он уже существует. Это можно решить, используя tools:replace="android:theme" в теге <activity>.

Я создал собственный стиль в /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) + и, вероятно, этого следует избегать в будущем.

Ответ 3

Простое решение просто показывает прогресс в 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());
        }
    });