如何使用接口从 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