2014-07-09 16 views
9

Tôi đang cố gắng để thực hiện Facebook LoginButton sử dụng các hướng dẫn ở đây https://developers.facebook.com/docs/android/login-with-facebook/v2.0#step2LoginButton với Fragment mẹ đẻ

Vấn đề là trên dòng authButton.setFragment(this);.

Tôi đang sử dụng các đoạn gốc (android.app.Fragment) nhưng setFragment mong đợi một phân đoạn hỗ trợ (android.support.v4.app.Fragment).

EDIT: Tôi không thể chuyển sang hỗ trợ Phân đoạn, tôi có một ứng dụng lớn sử dụng Phân đoạn gốc.

+0

xem câu trả lời được cập nhật bên dưới. – gnuanu

Trả lời

14

Tôi nghĩ rằng giải pháp bạn đang tìm kiếm là lớp trình bao bọc bên dưới. Sử dụng điều này, bạn chỉ có thể gọi

authButton.setFragment(new NativeFragmentWrapper(this)); 

Trình bao bọc là phần hỗ trợ và chỉ chuyển các cuộc gọi phương thức từ facebook LoginButton tới đoạn gốc. Tôi đang sử dụng nó và nó hoạt động tốt.

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

Bạn là anh hùng của tôi. – Yehonatan

+4

Nhận '' 'java.lang.NullPointerException: Argument 'context' không thể là null''' bên trong hàm tạo AppEventsLogger – ruX

+0

Đây là câu trả lời cũ. Các sdk Facebook đã có thể thay đổi kể từ đó. Rõ ràng họ cố gắng đọc ngữ cảnh từ mảnh vỡ. Có lẽ, bạn phải thực sự đính kèm đoạn trình bao bọc vào một Hoạt động để làm cho nó hoạt động. –

-2

Thêm dưới đây trong bạn build.gradle tập tin

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

Sau đó nhập android.support.v4.app.Fragment thay vì đoạn bản địa.

0

Lý do hiển nhiên. Facebook SDK đang sử dụng lớp Fragment từ thư viện hỗ trợ để làm cho nó tương thích ngược và làm việc với các phiên bản Android cũ hơn (API Level < 11). Và bạn cũng phải sử dụng cùng một lớp trong đơn đăng ký của bạn.

Bao gồm thư viện hỗ trợ android-support-v4.jar vào thư mục libs và sử dụng lớp Phân đoạn từ nó (đối với các dự án dựa trên Ant). Nếu bạn đang sử dụng hệ thống xây dựng Gradle, hãy làm theo hướng dẫn được đưa ra trong câu trả lời của Lei ở trên.

Cập nhật: Nếu ứng dụng của bạn có sự phụ thuộc cao với thư viện gốc, thì bạn chỉ còn một tùy chọn. Mã SDK Facebook có sẵn here. Ngã ba và thay đổi SDK để sử dụng thư viện gốc (Xóa thư viện hỗ trợ khỏi chính SDK). Nhưng hãy nhớ rằng, ứng dụng của bạn sẽ bị giới hạn chạy trên cấp API lớn hơn 10 (minSdkVersion phải là 11).

+0

Ngã ba là một ý tưởng tồi. Tôi chắc chắn rằng Facebook SDK có thể được thực hiện để làm việc với các mảnh gốc, nếu không có gì khác tôi có thể thực hiện cuộc gọi từ Hoạt động, hoặc tôi không phải sử dụng LoginButton. Tôi chỉ đang cố gắng tìm ra giải pháp được khuyến nghị. – miguel

0

Thực hiện theo các bước sau:

  1. Remove nhập khẩu android.app.Fragment;

  2. Thêm nhập android.support.v4.app.Fragment;

  3. Nhấp chuột phải vào dự án và chọn thuộc tính của bạn.

  4. Build Path> Library> Add Library bên ngoài> Xác định vị trí tập tin android-support-v4.jar của bạn (sdk> extras> Android> hỗ trợ> v4)

4

tôi giải quyết vấn đề này bằng cách sử dụng bối cảnh hoạt động thay vì bối cảnh đoạn và đi qua các "onActivityResult" từ hoạt động, đến đoạn đến callbackManager.

Chỉ cần làm theo các hướng dẫn sau đây:

  1. Đừng gọi loginButton.setFragment (fragment). Theo mặc định, ngữ cảnh hoạt động của LoginButton được sử dụng.
  2. Thêm phương pháp sau bên trong hoạt động của mảnh của bạn, để bắt và vượt qua kết quả nào để đoạn:

    @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. Override onActivityResult cũng bên trong đoạn của bạn chứa LoginButton và chuyển kết quả đến callbackManager.

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

Tôi hy vọng nó hoạt động.

+0

Điều này làm việc cho tôi sau khi chuyển từ v4.Fragment sang app.Fragment –

Các vấn đề liên quan