使用ViewPager后,在FragementBaseActivity下的fragment打开另外一个Activity,将Activity中的数据回传到打开它的fragment(使用接口传递数据)

本人ViewModel用的始终比较奇妙,因此使用接口的方式进行数据传递.

fragment通过Viewpager嵌套在一个Activity内部的情况下,就不能直接通过接口传递数据,不然直接使用会出现实例没有正确创建的问题;

所以得稍微曲线一下得通过FragmentBaseActivity来接收另外一个从fragment中打开的Activity中传递的数据,之后再通过FragmentBaseActivity将数据传输给fragment,思路是这样的.

接下来是代码环节:

下面这是一个listView中点击一个小行获取数据后回传的操作

接口需要写在你在fragment中打开的那个Activity中

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String irrigatename = irrigateBeens.get(position).getIrrigation();
                Intent intent = new Intent();
                intent.putExtra("irrigatename",irrigatename);
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }

    public interface OnDataChangeListener{
        void onDataChange(String data);
    }

}

之后会用FragmentBaseActivity作为数据的监听者,同时实现一些方便fragment进行数据接收的操作,下面的代码是FragmentBaseActivity中需要添加的代码:

private final ActivityResultLauncher<Intent> resultLauncher = 
registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
 new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    if (result.getResultCode() == RESULT_OK) {
                        Intent data = result.getData();
                        if (data != null) {
                            String youdata = data.getStringExtra("key");
                            passDataToFragment(irrigatename);
                        }
                    }
                }
            }
    );
//注意上面这个是创建在oncreat方法外面的
//getStringExtra需要传递的是键对象,别问我键是什么,不知道学javase去

    public void startListActivity(){
        Intent intent = new Intent(this,ListBaseActivity.class);
        resultLauncher.launch(intent);
    }
//这个暴露的方法是为了方便fragment调用和书写,在FragmentBaseActivity打开第二个activity
//这个方法是在fragment中调用的不是在FragmentBaseActivity中调用的

//这个方法就是单纯作为监听
    public void passDataToFragment(String data) {
        if (myhomeFragment != null) {
            myhomeFragment.onDataChange(data);
        }
    }

最后一个就是需要在你的Fragment中写的代码:

public class MyhomeFragment extends Fragment implements ListBaseActivity.OnDataChangeListener {
 @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        iv_select = view.findViewById(R.id.iv_select);
        ed_irrigate = view.findViewById(R.id.ed_irrigate);

        iv_select.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getActivity() instanceof FragmentBaseActivity) {

                    ((FragmentBaseActivity)getActivity()).startListActivity();
//fragment本来就能够通过getActivity的方式去获取本身创建它的对象所以我们需要强转成FragmentBaseActivity的对象,这样才能使用FragmentBaseActivity内部的方法
                }
            }
        });
    }
//这个就没什么好说的了
    @Override
    public void onDataChange(String data) {
        if (ed_irrigate != null) {
            ed_irrigate.setText(data);
            Log.d("MyhomeFragment", "Received data: " + data);
        }
    }
}

好像有点不适合刚开始敲代码的人看,但是还是比较好理解的,里面的代码都很简单.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值