如何使用接口从 activity 中的片段调用操作
How to use interface to call an action from a fragment in an activity
我有这样的界面:
public interface IStartCamera {
void startScanning();
}
我有一个实现此接口的片段,在这个片段中我有一个重写,如下所示:
@Override
public void startScanning() {
Intent intent = new Intent(getActivity(), QrScanAcitivity.class);
startActivityForResult(intent, SQ_SCANNING_RESULT);
startActivity(new Intent(getActivity().getApplicationContext(), QrScanAcitivity.class));
}
在我的 activity 中,当单击导航按钮时,我创建了该片段的一个实例,如下所示:
private IStartCamera iStartCameraInFragment;
public void setStartCameraInFragment(IStartCamera IStartCameraInFragment) {
this.iStartCameraInFragment = IStartCameraInFragment;
}
fragment = new ExitFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
fragment).commit();
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
fragment = null;
switch (item.getItemId()){
case R.id.item_manual_scanning:
fragment = new ExitFragment();
setStartCameraInFragment(fragment); // <=== I HAVE THE PROBLEM HERE
break;
case R.id.item_reload:
fragment = new ReloadFragment();
break;
case R.id.item_add_entry_info:
fragment = new AddEntryInfoFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
fragment).commit();
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fabOpenCamera:
iStartCameraInFragment.startScanning();
break;
}
}
当我在实例化片段时使用 setStartCameraInFragment(fragment) 时,我得到了一个错误的要求,因为它期望的是 IStartCamera 而不是片段,即使该片段实现了 IStartCamera。
首先,不要使用构造函数实例化Fragment。使用静态方法是一个很好的做法,通常命名为 'newInstance' 来实例化 Fragment,因为如果你想稍后将任何参数传递给它,你将能够轻松地做到这一点。
关于您的问题,您收到错误是因为您试图通过使用 Fragment 对象调用 'setStartCameraInFragment' 方法,而该方法需要 IStartCamera 的实例。你应该做的(如果你想坚持这个逻辑)是检查 Fragment 是否是 IStartCamera 接口的一个实例,然后你就可以这样使用它了。这是一个例子:
if (fragment instanceof IStartCamera)
setStartCameraInFragment((IStartCamera)fragment); // --> Here the fragment can be considered as an instance of IStartCamera and this will work
我有这样的界面:
public interface IStartCamera {
void startScanning();
}
我有一个实现此接口的片段,在这个片段中我有一个重写,如下所示:
@Override
public void startScanning() {
Intent intent = new Intent(getActivity(), QrScanAcitivity.class);
startActivityForResult(intent, SQ_SCANNING_RESULT);
startActivity(new Intent(getActivity().getApplicationContext(), QrScanAcitivity.class));
}
在我的 activity 中,当单击导航按钮时,我创建了该片段的一个实例,如下所示:
private IStartCamera iStartCameraInFragment;
public void setStartCameraInFragment(IStartCamera IStartCameraInFragment) {
this.iStartCameraInFragment = IStartCameraInFragment;
}
fragment = new ExitFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
fragment).commit();
navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
fragment = null;
switch (item.getItemId()){
case R.id.item_manual_scanning:
fragment = new ExitFragment();
setStartCameraInFragment(fragment); // <=== I HAVE THE PROBLEM HERE
break;
case R.id.item_reload:
fragment = new ReloadFragment();
break;
case R.id.item_add_entry_info:
fragment = new AddEntryInfoFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
fragment).commit();
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fabOpenCamera:
iStartCameraInFragment.startScanning();
break;
}
}
当我在实例化片段时使用 setStartCameraInFragment(fragment) 时,我得到了一个错误的要求,因为它期望的是 IStartCamera 而不是片段,即使该片段实现了 IStartCamera。
首先,不要使用构造函数实例化Fragment。使用静态方法是一个很好的做法,通常命名为 'newInstance' 来实例化 Fragment,因为如果你想稍后将任何参数传递给它,你将能够轻松地做到这一点。
关于您的问题,您收到错误是因为您试图通过使用 Fragment 对象调用 'setStartCameraInFragment' 方法,而该方法需要 IStartCamera 的实例。你应该做的(如果你想坚持这个逻辑)是检查 Fragment 是否是 IStartCamera 接口的一个实例,然后你就可以这样使用它了。这是一个例子:
if (fragment instanceof IStartCamera)
setStartCameraInFragment((IStartCamera)fragment); // --> Here the fragment can be considered as an instance of IStartCamera and this will work