Activity 中的转换接口

No *_*ame 3 java android

问题是,在这之前,我实现了interfacesActivity,值中设置的方法Fragment。也就是在onAttach()初始化之后,再在哪里调用interface被调用的方法。例子:

interface OnNumberChangeCallback{
    void onSuccess();
}
Run Code Online (Sandbox Code Playgroud)

Fragment

OnNumberChangeCallback onNumberChangeCallback;

onAttach(Context context){
    onNumberChangeCallback = (OnNumberChangeCallback) context;
}
Run Code Online (Sandbox Code Playgroud)

等等。

我想初始化interfacein BaseActivity。并在Fragment实现这一点interface。当我尝试以onCreate这种方式在方法中初始化时:

onNumberChangeCallback = (OnNumberChangeCallback) this;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

BaseActivity cannot be cast to OnNumberChangeCallback
Run Code Online (Sandbox Code Playgroud)

问题:如何正确初始化interfacein Activity

Ben*_* P. 7

听起来您希望Fragment实现接口,并让 Activity 以某种方式存储对它的引用。

您的界面:

interface OnNumberChangeCallback {
    void onSuccess();
}
Run Code Online (Sandbox Code Playgroud)

要在您的片段中实现它:

public class MyFragment extends Fragment implements OnNumberChangeCallback {

    @Override
    public void onSuccess() {
        // TODO
    }

    // other fragment methods, like onCreateView() etc
}
Run Code Online (Sandbox Code Playgroud)

并将侦听器保存在您的活动中:

public class MyActivity extends AppCompatActivity {

    private OnNumberChangeCallback callback;

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);

        if (fragment instanceof OnNumberChangeCallback) {
            callback = (OnNumberChangeCallback) fragment;
        }
    }

    // other activity methods, like onCreate() etc
}
Run Code Online (Sandbox Code Playgroud)

然后,要使用回调,您可以在 Activity 的任何位置编写如下内容:

public void onButtonClick() {
    if (callback != null) {
        callback.onSuccess();
    }
}
Run Code Online (Sandbox Code Playgroud)

此解决方案的根源在于FragmentActivity(它是 的超类AppCompatActivity)有一个方法onAttachFragment(),只要将 Fragment 附加到您的活动,就会调用该方法。以同样的方式,您可以Context通过 using将您转换为片段内的接口onAttach(),您可以使用 将 aFragment转换为接口onAttachFragment()

文档:https : //developer.android.com/reference/android/support/v4/app/FragmentActivity.html#onAttachFragment(android.support.v4.app.Fragment)

PS:这个答案提供了一个非常通用的解决方案,并且几乎适用于您向活动添加片段的任何方式。但是,如果您知道Fragment 将以特定方式添加,那么您可能会做一些比实现更简单的事情onAttachFragment()……您可以在将 Fragment 添加到您的活动时对其进行转换,如下所示:

    MyFragment fragment = new MyFragment();
    callback = fragment;

    getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.content, fragment, "fragmentTag")
            .commit();
Run Code Online (Sandbox Code Playgroud)