我正在创建一个
不幸的是,当我添加 Twitter Fragment 以提供类似的登录功能时,遇到了问题。突然间,Facebook 登录按钮无法改变状态,我的 Facebook 身份验证也无法完全完成,尽管我可以看到身份验证回调被返回。
在反复尝试后,我最终决定通过
这让我感觉更糟了,没有让我感觉更好。我承认我不完全理解碎片,但为什么添加碎片的顺序会产生这种影响,这让我非常困惑。不管先加哪个都不起作用,但第二个添加的会起作用。值得注意的是,我正在使用actionbarsherlock和它的碎片实现。
以下是我的活动和碎片代码:
认证活动(AuthenticationActivity)
为什么通过
AuthenticationActivity
,为用户提供通过 Facebook、Twitter 或特定应用程序进行登录的选项。在按照 Facebook Android SDK 文档中写得很好的 tutorial Use Facebook Login 后,我成功实现了 Facebook 的身份验证。不幸的是,当我添加 Twitter Fragment 以提供类似的登录功能时,遇到了问题。突然间,Facebook 登录按钮无法改变状态,我的 Facebook 身份验证也无法完全完成,尽管我可以看到身份验证回调被返回。
在反复尝试后,我最终决定通过
SupportFragmentManager
更改 AuthenticationActivity
添加片段的顺序。当我这样做时,Facebook 再次开始工作,但 Twitter 片段却出现了问题。getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, twitterFragment)
.add(android.R.id.content, facebookFragment)
.commit();
这让我感觉更糟了,没有让我感觉更好。我承认我不完全理解碎片,但为什么添加碎片的顺序会产生这种影响,这让我非常困惑。不管先加哪个都不起作用,但第二个添加的会起作用。值得注意的是,我正在使用actionbarsherlock和它的碎片实现。
以下是我的活动和碎片代码:
认证活动(AuthenticationActivity)
public class AuthenticationActivity extends SherlockFragmentActivity {
private FacebookFragment facebookFragment;
private TwitterFragment twitterFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
addFragments();
} else {
restoreFragments();
}
}
private void addFragments() {
facebookFragment = new FacebookFragment();
twitterFragment = new TwitterFragment();
// TODO the order of this MATTERS if Facebook isn't last
// Facebook auth breaks and vice versa.
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, twitterFragment)
.add(android.R.id.content, facebookFragment)
.commit();
}
private void restoreFragments() {
facebookFragment = (FacebookFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
twitterFragment = (TwitterFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
}
}
Facebook片段(大部分基于SDK文档示例)
public class FacebookFragment extends SherlockFragment {
private UiLifecycleHelper uiHelper;
private static final String TAG = FacebookFragment.class.getSimpleName();
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.authentication, container, false);
LoginButton facebookButton
= (LoginButton) view.findViewById(R.id.facebookButton);
facebookButton.setFragment(this);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
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);
}
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...");
} else {
Log.i(TAG, "unknown state " + state);
}
}
}
TwitterFragment
public class TwitterFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.authentication, container, false);
Button twitterButton = (Button) view.findViewById(R.id.twitterButton);
twitterButton.setOnClickListener(twitterClickListener);
return view;
}
private OnClickListener twitterClickListener = new OnClickListener() {
public void onClick(View v) {
Context context = v.getContext();
Intent intent = new Intent(context, TwitterLoginActivity.class);
context.startActivity(intent);
}
};
}
为什么通过
SupportFragmentManger
添加上述片段的顺序很重要?