2014-07-09 12 views
9

Ich versuche, den Facebook LoginButton mit dem Tutorial hier https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2LoginButton mit nativen Fragmente

Das Problem auf der Linie authButton.setFragment(this); zu implementieren ist.

Ich benutze native Fragmente (android.app.Fragment) aber SetFragment erwartet eine Unterstützung Fragment (android.support.v4.app.Fragment).

EDIT: Ich kann nicht auf Unterstützung Fragmente, ich habe eine große App, die native Fragmente verwendet.

+0

siehe die aktualisierte Antwort unten. – gnuanu

Antwort

14

Ich denke, die Lösung, die Sie suchen ist die Wrapper-Klasse unten. Mit diesem können Sie rufen Sie einfach

authButton.setFragment(new NativeFragmentWrapper(this)); 

Der Wrapper ist ein Support-Fragment und übergibt nur die Methodenaufrufe von der Facebook LoginButton auf das native Fragment. Ich benutze das und es funktioniert gut.

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); 
    } 
} 
+0

Du bist mein Held. – Yehonatan

+4

"' '' 'java.lang.NullPointerException: Argument 'context' kann nicht null''' im AppEventsLogger-Konstruktor sein – ruX

+0

Dies ist eine alte Antwort. Die Facebook-SDK hat sich seither wahrscheinlich geändert. Anscheinend versuchen sie den Kontext aus dem Fragment zu lesen. Vielleicht müssen Sie das Wrapper-Fragment tatsächlich an eine Aktivität anhängen, damit es funktioniert. –

-2

dies unten in Ihnen build.gradle Datei

dependencies { 
    compile 'com.android.support:support-v4:+' 
} 

Dann hinzufügen android.support.v4.app.Fragment statt des nativen Fragment importieren.

0

Der Grund ist offensichtlich. Das Facebook SDK verwendet die Fragment-Klasse aus der Support-Bibliothek, um es abwärtskompatibel zu machen und mit älteren Versionen von Android zu arbeiten (API Level < 11). Und Sie müssen die gleiche Klasse in Ihrer Anwendung ebenso verwenden.

Fügen Sie die Support-Bibliothek android-support-v4.jar in den Ordner libs ein und verwenden Sie die Fragment-Klasse (für Ant-basierte Projekte). Wenn Sie das Gradle-Build-System verwenden, befolgen Sie die Anweisungen in Lei's Antwort oben.

Aktualisierung: Wenn Ihre Anwendung eine hohe Abhängigkeit von der nativen Bibliothek hat, bleibt nur eine einzige Option übrig. Der Facebook SDK-Code ist verfügbar here. Fork es und ändern Sie das SDK, um native Bibliothek zu verwenden (Entfernen Sie die Support-Bibliothek aus dem SDK selbst). Beachten Sie jedoch, dass Ihre Anwendung auf API-Level größer als 10 beschränkt ist (minSdkVersion sollte 11 sein).

+0

Forking ist eine schlechte Idee. Ich bin sicher, dass das Facebook SDK mit nativen Fragmenten arbeiten kann, wenn nichts anderes den Anruf von der Aktivität ausführen kann, oder ich muss LoginButton nicht verwenden. Ich versuche nur die empfohlene Lösung zu finden. – miguel

0

Gehen Sie folgendermaßen vor:

  1. Remove Import android.app.Fragment;

  2. Hinzufügen importieren android.support.v4.app.Fragment;

  3. Klicken Sie mit der rechten Maustaste auf Ihre Projekt- und Select-Eigenschaften.

  4. Build Path> Bibliothek> Externe Bibliothek hinzufügen> Suchen Sie Ihr Android-support-v4.jar Datei (sdk> Extras> Android> unterstützt> v4)

4

Ich löste dieses Problem, indem die Aktivität Kontext statt das Fragment Kontext und das Bestehen der „onActivityResult“ von der Aktivität verwendet wird, um das Fragment zu dem callbackManager.

Folgen Sie einfach den folgenden Anweisungen:

  1. Nicht Aufruf loginButton.setFragment (Fragment). Standardmäßig wird der Aktivitätskontext des LoginButtons verwendet.
  2. In der folgenden Methode Inneren der Aktivität des Fragments, zu fangen und jedes Ergebnis an das Fragment übergeben:

    @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. Aufschalten onActivityResult auch in Ihrem Fragment die die LoginButton enthält und Übergeben Sie das Ergebnis an den CallbackManager.

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

Ich hoffe, es funktioniert.

+0

Dies funktionierte für mich nach dem Wechsel von v4.Fragment zu app.Fragment –