Android: 如何在Facebook登录中隐藏进度圈
Android: How to hide progress circle in Facebook login
我正在使用此方法在不使用 fb 按钮的情况下执行 Facebook 登录 Facebook authentication without login button
它工作正常,但在 fb 登录期间显示黑色背景的进度条,我猜来自 activity com.facebook.LoginActivity
如何避免显示 activity?我只想在 com.facebook.LoginActivity
登录期间显示我自己的应用程序 activity 的进度
我在使用 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 的主题设置为我们的新主题:
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@style/FullyTranslucent" />
瞧!登录前的ProgressBar没有了
为了进一步@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 中,Manifest Merging 可能会产生一个错误,抱怨 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)+ 上不起作用,应该避免在未来。
简单的解决方案只是在 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());
}
});
我正在使用此方法在不使用 fb 按钮的情况下执行 Facebook 登录 Facebook authentication without login button
它工作正常,但在 fb 登录期间显示黑色背景的进度条,我猜来自 activity com.facebook.LoginActivity
如何避免显示 activity?我只想在 com.facebook.LoginActivity
登录期间显示我自己的应用程序 activity 的进度我在使用 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 的主题设置为我们的新主题:
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@style/FullyTranslucent" />
瞧!登录前的ProgressBar没有了
为了进一步@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 中,Manifest Merging 可能会产生一个错误,抱怨 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)+ 上不起作用,应该避免在未来。
简单的解决方案只是在 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());
}
});