1

我跟着Facebook教程爲我的應用創建了一個登錄按鈕,它可以用於登錄,但我有一些問題需要我們幫助。登錄Facebook後發送回MainActivity

我有一個活動&一個片段。 當你啓動我的應用程序時,你會看到一個PNG圖像,這是一個標誌,再加上一個'登錄Facebook'按鈕。 當您按登錄按鈕時,您將被髮送到Facebook進行身份驗證,登錄後您將再次返回到MainActivity。

現在MainActivity有徽標,Facebook按鈕顯示'註銷'。 所以這是好的,但我的問題是:

什麼是最好的事情做後,你登錄?

創建一個新的類,您將在登錄後發送,或發送回MainActivity? 真正的程序員在auth後做了什麼?

如果它更好地發送回MainActivity,那麼如何在登錄後刪除徽標png圖像?我的意思是,在登錄之前很高興,但登錄後,圖片應該消失。 與Facebook的註銷按鈕相同的東西,我該如何刪除它,或至少把它放在別的地方? 我雖然做了一個操作欄,但註銷按鈕那裏。

這是我用於活動& Fragment的核心。 因此,我應該在登錄後做一個新班級來發送用戶,還是應該將用戶mack發送到活動,如果是,登錄後如何刪除徽標/登出按鈕?謝謝。

編輯

IF最好的方法是創建一個新的類,並登錄後,用戶發送到新的類, 代碼我應該在哪裏寫的是什麼?我嘗試過OnClickListener,但它永遠不會將用戶發送到AFTER LOGIN之後的新類。謝謝。

LoginACTIVITY。

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 

import com.facebook.widget.LoginButton; 

public class LoginActivity 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 static final String TAG = "LoginFragment"; 
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); 
    authButton.setReadPermissions(Arrays.asList("public_profile" , "user_birthday" , "user_friends")); 

    return view; 
} 

private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

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

@Override 
public void onResume() { 
    super.onResume(); 

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

編輯2:

我想我得到它的工作。 這就是我所做的,但不知道它的正確與否。

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     Log.i(TAG, "Logged in..."); 

     Intent intent = new Intent(getActivity(), MainActivity.class); 
     startActivity(intent); 
     finish(); 

而對於finish();我做到了。

private void finish() { 
} 

回答

2

嘗試以下操作:

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     Log.i(TAG, "Logged in..."); 
     Intent intent = new INTENT(context, NewActivity.class); 
     context.startActivity(intent); 
     finish(); // back button shouldn't bring you back to this fragment 
    } else if (state.isClosed()) { 
     Log.i(TAG, "Logged out..."); 
    } 
} 
+0

它沒有工作。我得到錯誤;意圖內的上下文。 另一個錯誤是startActivity之前的上下文,甚至finish();對我來說是紅色和錯誤的。所以這沒有奏效。 – DMT82 2014-10-15 20:49:24

+0

這是正確的,和它的工作::::: 意圖nextScreen =新意圖(getActivity(),SecondScreenActivity.class); startActivity(nextScreen); – DMT82 2014-10-15 21:03:34

+0

getActivity方法返回上下文。我建議的解決方案與工作的解決方案完全相同。 – 2014-10-16 01:30:20

0

好的這是我會做的。 我的應用程序的首要活動是LoginActivity.java。 此活動將包含徽標和Facebook登錄按鈕。 當用戶點擊並使用Facebook登錄時,我打電話給MainActivity.java [這是我的應用的主屏幕]。 當用戶點擊返回按鈕在這裏我不回到LoginActivity.java,我寧願顯示一個應用程序退出警報框。

+0

因此,你推薦這樣的事情? LoginActivity(logo/loginbutton) - > LoginFragment(用於auth) - >如果成功 - >新建MainActivity類? 我不知道這是否會減緩登錄過程的應用程序,但我會嘗試這個,謝謝。 – DMT82 2014-10-06 12:49:55

+0

我嘗試將auth發送給MainActivirt(我創建的新類),但它沒有工作,您是否知道代碼以及我應該在哪寫它?謝謝。 – DMT82 2014-10-06 12:58:51

+0

看看主要問題上的編輯。提出一些新問題。 – DMT82 2014-10-08 13:09:29

0

我覺得在易用性做的最好的事情是把他應該是用戶,我敢肯定,這又不是在登錄屏幕。 你記錄了他的原因,所以試着做到這一點。

至於你的代碼,@ varsha,文卡塔斯代碼應該實現這一目標。

+0

@varshas代碼沒有工作,給了我3個錯誤。 – DMT82 2014-10-15 20:52:50

+0

你應該在那裏使用getActivity()。getApplicationContext()。 – 2014-10-20 12:56:59

+0

是的,新的意向(getActivity()是使用正確的,謝謝。:) – DMT82 2014-10-20 13:43:23

0

做它,因爲它提到Tutorial

我希望這將解決您的問題。

+1

該教程是從2012年開始,一切都在該教程是一個錯誤了。這個網站沒有任何東西可以工作,它的兩年前和Facebook有新的編碼SDK,所以沒有,它沒有解決我的任何問題,它只花了我的時間。謝謝。 – DMT82 2014-10-15 20:52:07

+0

但它仍然在我的應用程序中工作。請同時提供與本教程兼容的舊版Facebook sdk下載。 – 2014-10-15 21:32:29

+0

我爲什麼要用舊的sdk?這並不好,特別是當Facebook將從2015年4月起刪除使用舊SDK的應用時,所以我將使用一個在2015年4月之後也可以使用的sdk。 – DMT82 2014-10-15 23:47:10

1

你應該在onSessionStateChange()方法中創建一個新類(Intent)並將用戶發送到新類(Intent),如果你想從facebook獲取數據到下一個intent,使用bundle做法。檢查這個例子

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
if (state.isOpened()) { 
    Log.i(TAG, "Logged in..."); 

    // Request user data and show the results 
    Request.newMeRequest(session, new Request.GraphUserCallback() { 
     @Override 
     public void onCompleted(GraphUser user, Response response) { 
      if (user != null) { 

       Intent pit = new Intent(getApplicationContext(), HomeActivity.class); 
       pit.putExtra("Fb_id", user.getId()); 
       pit.putExtra("user_name", user.getName()); 
       startActivity(pit); 

      } 
     } 
    }).executeAsync(); 


} else if (state.isClosed()) { 
    Log.i(TAG, "Logged out..."); 

} 
} 
+0

沒有工作。在getApplicationContext上獲取錯誤。請記住,該代碼位於Fragment中,而不是Activity,getApplicationContext需要Activity。 – DMT82 2014-10-15 20:58:09