将FacebookActivity样式化以避免糟糕的进度条

21

我刚刚使用Facebook SDK 结合 ParseFacebookUtilsV4 实现了通过Facebook登录的功能。

在我的清单文件中,我不得不声明一个FacebookActivity,当我尝试登录时它会被启动,这个功能非常好用。

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

这个片段来自于官方文档,所以我没有选择任何内容。我觉得很奇怪的是它的样式。在我的模拟器(API 22)上,它有一个进度条,看起来像是从90年代出来的!有没有办法改变它的样式?我尝试更改android:theme属性,但没有成功。

图片描述

我考虑过扩展com.facebook.FacebookActivity,但在查看源代码后发现它会填充一个com.facebook.LoginFragment,这实际上是负责进度条的。有什么想法吗?


只是一个建议,您可以拥有自己的进度条或进度对话框,当您调用fb api时开始,并在onActivityResult结束,这应该重叠到您的Facebook视图上。 - Chitrang
1
@Chitrang 在那个进度条之后,会出现一个 Facebook 对话框,要求用户输入密码和权限,我不能在其上方再显示一个进度对话框。 - natario
你尝试过将AppCompact的对话框主题应用到FacebookActivity吗? - Ahmad Nawaz
@Ahmad 是的,我在其中一个答案的评论中说过了。 - natario
我和你一样有同样的担忧。好问题! - user2511882
6个回答

4

现在你可以在AndroidManifest.xml中设置主题了。

源代码提交链接

用法:

AndroidManifest.xml

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
    <meta-data android:name="com.facebook.sdk.ApplicationName" android:value="@string/app_name"/>
    <meta-data android:name="com.facebook.sdk.WebDialogTheme" android:value="@style/Theme.AppCompat.Light.NoActionBar"/>

这适用于Facebook Android SDK v4.8.0以上版本。

2
这个不太行,进度条还是老式的。 - natario
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - eternal

2

首先,这不是进度条(progress bar),而是进度对话框(progress dialog)。我不知道如何使用自定义样式创建进度对话框。

因此,以下是一种方案:将默认的样式(Theme_Translucent_NoTitleBar)更改为Holo样式(Theme.Holo.Light)。为此,我们需要在Facebook SDK中进行更改。

1) 将以下代码放入style.xml:

<style name="NewDialogTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:background">@android:color/transparent</item>
</style>

2) 其次,我们需要在 com.facebook.widget 包内的 WebDialog.java 文件中进行更改。

public static final int DEFAULT_THEME = R.style.NewDialogTheme;

希望这能对你有所帮助。

1

只有一种方法对我有效:

FacebookSdk.setWebDialogTheme(android.R.style.Theme_Holo_Light_NoActionBar);

在调用FacebookSdk.sdkInitialize之后立即执行


0

您在清单文件中为活动设置的android:theme是基于Android Honeycomb之前使用的原始主题。这就是为什么您的进度条看起来如此陈旧。您可以尝试其他主题,例如:

@android:style/Theme.Material.NoActionBar.TranslucentDecor

这是基于新的Material Design设计的,但当然只适用于Lollipop设备。查看AppCompat库以获取更多与旧设备兼容的Material Design风格。


我没有设置它,只是复制粘贴了官方文档的建议。我尝试过更改它,但似乎对进度条没有影响。因为我正在使用API<21和appcompat,所以无法尝试您的样式。 - natario
不起作用。就像我的问题中所说的那样,它好像是由FacebookActivity管理的LoginFragment进行了样式设置。 - natario

0

你可以像这样设置任何想要的样式:

 <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:textViewStyle">@style/MyStyles.TextView</item>
    <item name="android:buttonStyle">@style/MyStyles.Button</item>
    <item name="android:progressBarStyle">@style/MyStyle.ProgressStyle</item>
    <item name="android:indeterminateProgressStyle">@style/MyStyle.ProgressStyle</item>
    <item name="android:actionBarStyle">@style/MyStyle.Toolbar</item>
</style>

那么

    <style name="MyStyle.ProgressStyle" parent="android:Widget.Holo.Light.ProgressBar">
        <item name="...">...</item>
    </style>

1
我完全可以接受AppCompat默认的进度条,问题在于FacebookActivity内部使用了另一种样式。 - natario
我认为你不能在没有root设备的情况下为其他人的应用程序设置样式...除非应用程序制造商提供了API。 - DKIT

-2
当Activity为对话框创建视图时,它会转到Activity的主题并查找由android:alertDialogTheme属性指定的主题。 您需要做的是将该属性设置为AppCompat的对话框主题(对于<v21,默认为Theme.Holo):
在您应用于Facebook Activity的主题中:
<style name="MyFacebookTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog</item>
    ...
</style>

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