2014-03-01 70 views
0

我正在開發一個Android應用程序,並希望將Facebook登錄集成到主頁面上。我下面這些方向的相同:漫遊列表改變MainActivity類別的Android - 現有片段與Facebook SDK衝突?

https://developers.facebook.com/docs/android/login-with-facebook/#step1

部分延伸FragmentActivity。但是,我的MainActivity類已經擴展了它,因爲我在主視圖上實現了一個內容滑塊。 MainActivity原始的onCreate代碼是:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Instantiate a ViewPager and a PagerAdapter. 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 
    mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      invalidateOptionsMenu(); 
     } 
    }); 
} 

而且這個工作很好。繼Facebook登錄演練中,我添加以下方向一個新的「MainFragment」類字面上地:

public class MainFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
         ViewGroup container, 
         Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.main, container, false); 

    return view; 
    } 
} 

,還增加了一個com.facebook.widget.LoginButton到我的MainActivity佈局(這似乎顯示效果細膩),並試圖通過添加以下到MainActivity類別的OnCreate部分,將其結合在一起(上面顯示,而不是在這裏再次重複這一切簡潔):

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); 
    } 

這個問題我根本已經是如何使我現有的滑塊和Facebook登錄很好地一起玩?如果我添加MainActivity的OnCreate所需的Facebook代碼,那麼我的滑塊就會消失。如果我不添加代碼,那麼Facebook登錄顯然不起作用。我已經儘可能多地閱讀了片段,認爲我可能在那裏做錯了什麼,但沒有太多的運氣......

在此先感謝您提供的任何幫助!

回答

0

我能夠發現問題出在CreateView方法的MainFragment中。出於某種原因,如果我刪除了這個覆蓋,我沒有問題,我的內容滑塊被刪除。不知道爲什麼,而不是添加以下幾行:LoginButton authButton =(LoginButton)findViewById(R.id.authButton); authButton.setFragment(本);在MainFragment的onViewCreate方法中,我只是將它們移動到MainActivity中的onCreate方法。似乎已經爲我工作,雖然不完全確定原來的問題是誠實的。

0

這是我的解決方案,您將您的MainActivity作爲第一級別,在此級別,您的Android應用程序將檢查用戶是否已登錄,基於此,轉至第二級,即Facebook login頁或content slider。爲了實現,這將是這樣的:

這是MainActivity

public class MainActivity extends FragmentActivity{ 
     private LoginFragment loginFragment; 

     @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState == null) { 
      // Add the fragment on initial activity setup 
      loginFragment = new LoginFragment(); 
      getSupportFragmentManager() 
      .beginTransaction() 
      .add(android.R.id.content, loginFragment) 
      .commit(); 
     } else { 
      // Or set the fragment from restored state info 
      loginFragment = (LoginFragment) getSupportFragmentManager() 
      .findFragmentById(android.R.id.content); 
     } 
    } 


    } 

這是LoginFragment

public class LoginFragment extends Fragment { 

private LoginButton authButton; 
private static final String TAG = "MainFragment"; 
private UiLifecycleHelper uiHelper; 

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.login_fragment, 
      container, false);   
    authButton=(LoginButton)view.findViewById(R.id.login_button); 
    authButton.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..."); 
     startActivity(new Intent(getActivity(), ContentSliderActivity.class)); 
    } else if (state.isClosed()) { 
     Log.i(TAG, "Logged out..."); 
    } 
} 

} 

這裏是你想有一個內容滑塊活動,這將在用戶成功登錄後顯示,這裏我稱之爲ContentSliderActivity

public class ContentSliderActivity extends FragmentActivity{ 
     ..................... 
    } 
+0

我真的非常感謝這方面的詳細迴應,但不幸的是,我的設計要求不夠靈活,無法按照您的建議重新設計項目。我真的需要將內容滑塊和Facebook登錄按鈕一起作爲MainActivity的一部分。 – someone29926