Android Facebook setFragment与常规Fragment

时间:2015-01-16 12:54:33

标签: java android facebook android-fragments

因为Facebook的setFragment仅与support.fragment一起工作,所以为了在处理常规片段时克服了这个问题,我做了以下工作:

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

在facebook按钮所在的登录页面中,我执行了以下操作:

authButton.setFragment(new new NativeFragmentWrapper(this));

在Eclipse中,它运行良好,但Android Studio 1.0.2正在抱怨:

此片段应该提供一个默认的构造(公共构造与无参数)。从Fragment文档:每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。

所以我尝试了这个:

NativeFragmentWrapper f = new NativeFragmentWrapper();
Bundle bundle = new Bundle();
f.setArguments(bundle);
authButton.setFragment(f);

但我没有找到一种方法将“this”(这是一个Fragment)放在bundle中,以便在包装器构造函数中检索它。

我可以@SuppressLint(“ValidFragment”),但我确信有更清洁的方法。

1 个答案:

答案 0 :(得分:0)

最好的方法是只使用应用程序中v4支持库中的Fragment类,签名是相同的,您只需要更改import语句。

如果失败了,其他帖子中的解决方案可能会起作用(自己没有尝试过),并且为了解决你的问题,只需要2个构造函数(一个是默认值,另一个是Fragment参数),只是在创建包装器对象时使用正确的构造函数(即非默认值)。