LoginButton с собственным фрагментом
Я пытаюсь реализовать Facebook LoginButton, используя учебник здесь https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2
Проблема находится на линии authButton.setFragment(this);.
Я использую собственные фрагменты (android.апп.Фрагмент), но setFragment ожидает фрагмент поддержки (android.поддержка.v4.апп.Фрагмент).
EDIT: я не могу переключиться на поддержку фрагментов, у меня есть большое приложение, которое использует собственные фрагменты.
5 ответов:
Я думаю, что решение, которое вы ищете, - это класс wrapper ниже. Используя это, вы можете просто вызвать
authButton.setFragment(new NativeFragmentWrapper(this));Оболочка является вспомогательным фрагментом и просто передает вызовы метода из facebook LoginButton в собственный фрагмент. Я использую это, и это прекрасно работает.
public class NativeFragmentWrapper extends android.support.v4.app.Fragment { private final Fragment nativeFragment; public NativeFragmentWrapper(Fragment nativeFragment) { this.nativeFragment = nativeFragment; } @Override public void startActivityForResult(Intent intent, int requestCode) { nativeFragment.startActivityForResult(intent, requestCode); } @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { nativeFragment.onActivityResult(requestCode, resultCode, data); } }
Я решил эту проблему, используя контекст действия вместо контекста фрагмента и передавая "onActivityResult" от действия к фрагменту в callbackManager.
Просто следуйте следующим инструкциям:
- Не вызывайте loginButton.setFragment (фрагмент) . По умолчанию, используется в контексте деятельности LoginButton это.
Добавьте следующий метод Внутри действия вашего фрагмента, чтобы поймать и передать любой результат к фрагменту:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); final MyFragment fragment = (MyFragment) getFragmentManager().findFragmentById(R.id.container); if (fragment != null) { fragment.onActivityResult(requestCode, resultCode, data); } }ПереопределитеonActivityResult такжевнутри вашего фрагмента , который содержит LoginButton, и передайте результат в callbackManager.
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); }Я надеюсь, что это сработает.
Выполните следующие действия:
Удалить импорт android.апп.Фрагмент;
Добавить импорт android.поддержка.v4.апп.Фрагмент;
Щелкните правой кнопкой мыши на вашем проекте и выберите Свойства.
Путь к сборке > библиотека > добавить внешнюю библиотеку > найдите свой android-support-v4.jar-файл (sdk > дополнительно > android > поддержка > v4)
Причина очевидна. Facebook SDK использует класс Fragment из библиотеки поддержки для обеспечения обратной совместимости и работы с более старыми версиями android (уровень API должны использовать тот же класс в своем приложении.
Включите библиотеку поддержки
android-support-v4.jarв папкуlibsи используйте класс фрагмента из нее (для проектов на основе Ant). Если вы используете Gradle build system, следуйте инструкциям, приведенным в ответе Lei выше.Update: Если ваше приложение имеет высокую зависимость от собственной библиотеки, то у вас остается один вариант. Код Facebook SDK доступен здесь . Разветвите его и измените SDK на использование собственной библиотеки (удалите библиотеку поддержки из самого SDK). Но имейте в виду, что ваше приложение будет ограничено для запуска на уровне API выше 10 (minSdkVersion должен быть 11).
Добавьте это ниже в вашу сборку.gradle file
dependencies { compile 'com.android.support:support-v4:+' }Затем импортируйте android.поддержка.v4.апп.Фрагмент вместо родного фрагмента.
Comments