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