LoginButton с собственным фрагментом



Я пытаюсь реализовать Facebook LoginButton, используя учебник здесь https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2



Проблема находится на линии authButton.setFragment(this);.



Я использую собственные фрагменты (android.апп.Фрагмент), но setFragment ожидает фрагмент поддержки (android.поддержка.v4.апп.Фрагмент).



EDIT: я не могу переключиться на поддержку фрагментов, у меня есть большое приложение, которое использует собственные фрагменты.

483   5  

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.

Просто следуйте следующим инструкциям:

  1. Не вызывайте loginButton.setFragment (фрагмент) . По умолчанию, используется в контексте деятельности LoginButton это.
  2. Добавьте следующий метод Внутри действия вашего фрагмента, чтобы поймать и передать любой результат к фрагменту:

    @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);
        }
    }
    
  3. ПереопределитеonActivityResult такжевнутри вашего фрагмента , который содержит LoginButton, и передайте результат в callbackManager.

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

Я надеюсь, что это сработает.

Выполните следующие действия:

  1. Удалить импорт android.апп.Фрагмент;

  2. Добавить импорт android.поддержка.v4.апп.Фрагмент;

  3. Щелкните правой кнопкой мыши на вашем проекте и выберите Свойства.

  4. Путь к сборке > библиотека > добавить внешнюю библиотеку > найдите свой 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

    Ничего не найдено.