2016-04-04 3 views
0

Я сделал фрагмент для подключения через Facebook, код которого находится здесь:FragmentTransaction.add(): неправильный тип фрагмента

import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.facebook.AccessToken; 
import com.facebook.AccessTokenTracker; 
import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.FacebookSdk; 
import com.facebook.Profile; 
import com.facebook.ProfileTracker; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 

public class LoginFragment extends Fragment 
{ 
    private TextView mTextDetails; 
    private CallbackManager fbCallbackManager; 
    private AccessTokenTracker tTracker; 
    private ProfileTracker pTracker; 


    private FacebookCallback<LoginResult> fbCallback = new FacebookCallback<LoginResult>() 
    { 
     @Override 
     public void onSuccess(LoginResult loginResult) 
     { 
      AccessToken accessToken = loginResult.getAccessToken(); 
      Profile profile = Profile.getCurrentProfile(); 
     } 

     @Override 
     public void onCancel() 
     { 

     } 

     @Override 
     public void onError(FacebookException error) 
     { 

     } 
    }; 

    public LoginFragment() 
    { 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getActivity().getApplicationContext()); 
     fbCallbackManager = CallbackManager.Factory.create(); 
     setupTokenTracker(); 
     setupProfileTracker(); 

     tTracker.startTracking(); 
     pTracker.startTracking(); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.fragment_main, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) 
    { 
     super.onViewCreated(view, savedInstanceState); 
     setTextDetails(view); 
     setupFBLoginButton(view); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     Profile profile = Profile.getCurrentProfile(); 
    } 

    @Override 
    public void onStop() 
    { 
     super.onStop(); 
     tTracker.stopTracking(); 
     pTracker.stopTracking(); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 
     fbCallbackManager.onActivityResult(requestCode, resultCode, data); 
    } 



    private void setupFBLoginButton(View view) 
    { 
     LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button); 
     loginButton.setReadPermissions("user_friends"); 
     loginButton.setFragment(this); 
     loginButton.registerCallback(fbCallbackManager, fbCallback); 
    } 

    private void setTextDetails(View view) 
    { 
     mTextDetails = (TextView) view.findViewById(R.id.text_details); 
    } 

    private void setupTokenTracker() 
    { 
     tTracker= new AccessTokenTracker() 
     { 
      @Override 
      protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) 
      { 
       //TODO 
      } 
     }; 
    } 

    private void setupProfileTracker() 
    { 
     pTracker = new ProfileTracker() 
     { 
      @Override 
      protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) 
      { 
       //TODO 
      } 
     }; 
    } 


} 

Я пытаюсь «назвать» этот фрагмент из моей основной деятельности с использованием следующий код:

import android.app.FragmentManager; 
import android.app.FragmentTransaction; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

public class MainActivity extends AppCompatActivity 
{ 

    private boolean logged = false; 
    private LoginFragment loginFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     FragmentManager fManager = getFragmentManager(); 
     FragmentTransaction fTransaction = fManager.beginTransaction(); 

     LoginFragment loginFragment = new LoginFragment(); 

     fTransaction.add(R.id.fragment_container, loginFragment, "fragment_container"); 
     fTransaction.commit(); 

     setContentView(R.layout.activity_main); 
    } 


} 

Тем не менее, у меня есть ошибка на 2-й аргумент этой линии fTransaction.add(R.id.fragment_container, loginFragment, "fragment_container");.

Моя IDE говорит мне, что ожидает объект android.app.Fragment, а мой - my.package.LoginFragment.

Я не понимаю, мой LoginFragment расширяет Fragment ...

Я также попытался передать все в android.support.v4.*, но тогда я не могу сделать loginButton.setFragment(this);, и тогда я понятия не имею о том, как установить Фрагмент к кнопке loggin.

+0

check LoginFragment.java: import android.support.v4.app.Fragment; ваш фрагмент поддерживает версию библиотеки поддержки, поэтому используйте getSupportFragmentManager(), чтобы получить packagemanager –

ответ

2

Использование getSupportFragmentManager() при работе с фрагментами поддержки вместо getFragmentManager().

Кроме того, добавление фрагмента должно происходить после setContentView(), поэтому можно найти fragment_container.

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    loginFragment = new LoginFragment(); 
    getSupportFragmentManager() 
      .beginTransaction() 
      .add(R.id.fragment_container, loginFragment, "fragment_container") 
      .commit(); 
} 

После этого вам также придется исправить пару импортных товаров. Убедитесь, что вы используете следующее: MainActivity.

import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
+0

@EddaSnorra. Я включил еще одно потенциальное исправление в ваш код. У вас есть поле класса 'LoginFragment', похоже, что вы должны были назначить' LoginFragment' в 'onCreate()'. –

Смежные вопросы