问题是,在这之前,我实现了interfaces在Activity,值中设置的方法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?
听起来您希望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)
| 归档时间: |
|
| 查看次数: |
4095 次 |
| 最近记录: |