【问题标题】:How to use interface to call an action from a fragment in an activity如何使用接口从活动中的片段调用操作
【发布时间】:2022-01-14 12:46:04
【问题描述】:

我有一个这样的界面:

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

在我的活动中,当单击导航按钮时,我会创建此片段的一个实例,如下所示:

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。

【问题讨论】:

    标签: android android-fragments interface


    【解决方案1】:

    首先,不要使用构造函数来实例化Fragment。使用静态方法(通常命名为“newInstance”)来实例化 Fragments 是一种很好的做法,因为如果您以后想将任何参数传递给它,您将能够轻松完成。

    关于您的问题,您收到错误是因为您尝试使用 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
    

    【讨论】:

    • 感谢您告诉我正确的操作方法。我会按照你的建议去做。
    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多