Facebook 登录按钮未显示在 ActionbarActivity 中
Posted
技术标签:
【中文标题】Facebook 登录按钮未显示在 ActionbarActivity 中【英文标题】:Facebook login button not showing up in ActionbarActivity 【发布时间】:2015-01-02 22:55:57 【问题描述】:我想将 Facebook 登录按钮添加到操作栏活动。我按照https://developers.facebook.com/docs/android/login-with-facebook/v2.2?locale=de_DE 的说明进行操作,如果我使用 FragmentActivity,一切正常。但是,如果我从 ActionBarActivity 扩展 LoginActivity,虽然我没有收到任何错误,但登录按钮只是没有显示在活动中。
这是我的activity_login.xml
代码:
<com.facebook.widget.LoginButton
android:id="@+id/authButton"
android:layout_
android:layout_
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
/>
对于LoginActivity.java
:
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class LoginActivity extends ActionBarActivity
private MainFragment mainFragment;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
// Add the fragment on initial activity setup
mainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, mainFragment)
.commit();
else
// Or set the fragment from restored state info
mainFragment = (MainFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings)
return true;
return super.onOptionsItemSelected(item);
public void onPause()
super.onPause();
overridePendingTransition(0, 0);
还有MainFragment.java
:
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.widget.LoginButton;
import android.support.v4.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MainFragment extends Fragment
private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.activity_login, container, false);
LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
authButton.setFragment(this);
return view;
private void onSessionStateChange(Session session, SessionState state, Exception exception)
if (state.isOpened())
Log.i(TAG, "Logged in...");
else if (state.isClosed())
Log.i(TAG, "Logged out...");
private Session.StatusCallback callback = new Session.StatusCallback()
@Override
public void call(Session session, SessionState state, Exception exception)
onSessionStateChange(session, state, exception);
;
@Override
public void onResume()
super.onResume();
uiHelper.onResume();
//Add Monitor Facebook logins for statistical reasons!!
// For scenarios where the main activity is launched and user
// session is not null, the session state change notification
// may not be triggered. Trigger it if it's open/closed.
Session session = Session.getActiveSession();
if (session != null &&
(session.isOpened() || session.isClosed()) )
onSessionStateChange(session, session.getState(), null);
uiHelper.onResume();
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
@Override
public void onPause()
super.onPause();
uiHelper.onPause();
@Override
public void onDestroy()
super.onDestroy();
uiHelper.onDestroy();
@Override
public void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
【问题讨论】:
所有安卓版本都会出现这个问题吗?如果你添加普通的Button
而不是facebook登录按钮,它是否可见?
@AbhishekV 这似乎只发生在 Android 5.0 中。它在 Android 4.4 中运行良好。如果我实现一个普通的 android.widget.Button,我也看不到按钮。
检查这个:***.com/questions/26633743/…,code.google.com/p/android/issues/detail?id=78701。好像是同一个问题
像魅力一样工作。感谢您的帮助!
我很高兴它有帮助:)
【参考方案1】:
参考这些问题: Fragments won't show up in activity extending ActionBarActivity
https://code.google.com/p/android/issues/detail?id=78701
您可以在 post 方法中添加片段来解决此问题。
new Handler().post(new Runnable()
@Override
public void run()
// Add the fragment on initial activity setup
mainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, mainFragment)
.commit();
);
【讨论】:
【参考方案2】:在你的 LoginActivity 中实现必要的回调函数和 uiHelper 的东西。如果您使用 Facebook 软件包中的 LoginButton,只需将 Facebook 的 Login 活动添加到您的清单。
<application>
...
activity
android:name="com.facebook.LoginActivity"
android:label="@string/app_name" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id" />
</application>
【讨论】:
以上是关于Facebook 登录按钮未显示在 ActionbarActivity 中的主要内容,如果未能解决你的问题,请参考以下文章
Facebook iOS SDK 未显示 FbLogin 按钮
任何示例显示如何使用自己的按钮或 Facebook 按钮在 Android 中使用 Facebook SDK 4.0 登录?
Facebook 登录用户数据未显示在 Firebase 控制台中