数据的相互传递

作者: Amy木婉清 | 来源:发表于2021-07-05 17:14 被阅读0次
整体逻辑

Activtiy之间数据传递就是借助intent和startActivityForResult以及onActivityResult、setResult,需要有一个标识将两个Activity联系起来,告知对方是自己传递的消息,即一个常量码;
pop与Activity之间的传递则是通过接口回调的方式,在pop中做一个接口,并暴露给activity一个方法去调用

1.pop与activity之间的数据传递

pop中没有列表式的数据,单一的某一项罗列出来如果想将数据传递个activity,需要每一项都做点击事件。
栗子:如下图所示


image.png

这 是一个弹窗
我想把这个数据回传给上一个页面


image.png
首先考虑这是pop和activity之间的数据传递,其次考虑弹窗并不是以列表的形式出现,是固定的几种出行方式,因此需要用接口回调并且是每一项都要做点击事件
首先定义一个接口:
/**
 * @Description 选择出行方式接口回调
 * @Author rabbit
 * @Date 2021/7/5 15:08
 */
public interface SelectWayListener {
    void selectWay(String way);
}

其次在pop中写如下代码:即每一项分别做点击事件

        //火车
        tvTrain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (selectWayListener != null) {
                    selectWayListener.selectWay("火车");
                }
                dismiss();
            }
        });
        //汽车
        tvAutomobile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (selectWayListener != null) {
                    selectWayListener.selectWay("汽车");
                }
                dismiss();
            }
        });
        //飞机
        tvAirplane.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (selectWayListener != null) {
                    selectWayListener.selectWay("飞机");
                }
                dismiss();
            }
        });
        //船舶
        tvShip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (selectWayListener != null) {
                    selectWayListener.selectWay("船舶");
                }
                dismiss();
            }
        });

//并且有一个方法暴露给Activity
    //暴露给Activity的方法
    public void setWayListener(SelectWayListener selectWayListener) {
        this.selectWayListener = selectWayListener;
    }

而Activity中调用弹窗的位置写如下代码

 SelectTravelWayPop selectTravelWayPop = new SelectTravelWayPop(BusinessApplyActivity.this);
            selectTravelWayPop.setWayListener(new SelectWayListener() {
                @Override
                public void selectWay(String way) {
                    chooseWay.setText(way);
                    chooseWay.setTextColor(Color.parseColor("#ff333333"));
                }
            });
            selectTravelWayPop.show(getWindow().getDecorView());

这样就可以把弹窗中选择的数据传递给上一个页面进行展示啦~~

2.Activity之间的数据传递

(1)从A把数据传递到B
在intent时,把数据的键值对依次写入,在从B get即可
举个栗子:

//A Activity
Intent intent = new Intent(this, WarehouseOutConfirmActivity.class);
intent.putExtra("userId", userId);
startActivity(intent);
//B Activity
  userId = getIntent().getIntExtra("userId", 0);

上述就是一个简单的从A把数据传递到B的一个小例子。

(2)从B把数据回传给A
此时就需要用到startActivityForResult以及onActivityResult、setResult,如果记不住位置就记得startActivityForResult以及onActivityResult这两个永远是成对出现,并且是在第一个Activity中。
小小小栗子:如下图所示

image.png
这是第一个Activtiy
image.png
这 是第二个Activity
如何将第二个选择的时间数据回传给第一个Activtiy呢?------->>揭晓如下:
//A Activity
Intent intent = new Intent(this, SelectTimeActivity.class);
startActivityForResult(intent, Constants.RequestCode.REQUEST_SELECT_TIME);


// onActivityResult
   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Constants.RequestCode.REQUEST_SELECT_TIME && resultCode == RESULT_OK) {
            chooseStartTime.setText(data.getStringExtra("time"));
        } 
    }

/*REQUEST_SELECT_TIME 即本文开始篇章所提到的常量码,即一个数字,
因为是唯一标识,为了便于管理且不会重复统一提取出来并且名字要大写,
设置成1,2,3....都可以,只要保证唯一就行*/
// B Activity  点击确定时将结果给到A Activity  即setResult
 if (view.getId() == R.id.tv_confirm) {
            //确定
            Intent intent = new Intent();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (timePicker.getMinute() < 10) {
                    intent.putExtra("time", datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + timePicker.getHour() + ":" + "0" + timePicker.getMinute());
                } else if (timePicker.getHour() < 10) {
                    intent.putExtra("time", datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + "0" + timePicker.getHour() + ":" + timePicker.getMinute());
                } else {
                    intent.putExtra("time", datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + timePicker.getHour() + ":" + timePicker.getMinute());
                }
            }
            setResult(RESULT_OK, intent);
            finish();
        }

这样就实现了从B把数据回传给A啦

拓展

image.png
回到这个页面我们不难发现,其实这个日期和时间的实现我们是用了原生的DatePicker和TimePicker,页面代码逻辑如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.activity.SelectTimeActivity">

    <include layout="@layout/layout_default_title_margin_top" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="66dp"
        android:layout_marginBottom="@dimen/dimens_10dp"
        android:text="选择年月日"
        android:textColor="#ff999999"
        android:textSize="@dimen/dimens_text_size_16sp" />


    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:calendarViewShown="false"
        android:datePickerMode="spinner" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="@dimen/dimens_10dp"
        android:text="选择时分"
        android:textColor="#ff999999"
        android:textSize="@dimen/dimens_text_size_16sp" />

    <TimePicker
        android:id="@+id/time_picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:timePickerMode="spinner" />

    <TextView
        android:id="@+id/tv_choose"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="@dimen/dimens_20dp"
        android:layout_marginBottom="@dimen/dimens_20dp"
        tools:text="已选择:2021-05-28  09:30"
        android:textColor="#fffa6400"
        android:textSize="@dimen/dimens_text_size_16sp" />

    <TextView
        android:id="@+id/tv_confirm"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimens_44dp"
        android:layout_marginHorizontal="@dimen/dimens_16dp"
        android:layout_marginBottom="@dimen/dimens_10dp"
        android:background="@drawable/bg_radius8_0f41a6"
        android:gravity="center"
        android:text="确定"
        android:textColor="#ffffffff"
        android:textSize="@dimen/dimens_text_size_16sp" />
</LinearLayout>

那么问题来了 UI中的已选择时间是如何随着上面时间滚动而改变的呢?解决方案如下:

//首先我们要定义一个设置时间和日期的方法
 /**
  * 设置时间
            */
    public void setDateTime() {//判断当小时和分钟小于10的时候  显示小时分钟前加个0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (timePicker.getMinute() < 10) {
                tvChoose.setText("已选择: " + datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + timePicker.getHour() + ":" + "0" + timePicker.getMinute());
            } else if (timePicker.getHour() < 10) {
                tvChoose.setText("已选择: " + datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + "0" + timePicker.getHour() + ":" + timePicker.getMinute());
            } else {
                tvChoose.setText("已选择: " + datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth() + " " + timePicker.getHour() + ":" + timePicker.getMinute());
            }
        }
    }

//其次要在相应代码块调用上述方法并对时间和日期分别做改变响应事件
        setDateTime();//这段代码的意思是打开页面默认显示当前选中时间
        timePicker.setIs24HourView(true);
        //时间改变响应事件
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                setDateTime();
            }
        });

        //日期改变响应事件
        datePicker.init(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                setDateTime();
            }
        });

小编当时在这里卡了蛮久的 ,你学废了嘛~~

3.Activity与pop中带列表之间的数据传递

接下来就是弹窗里带列表与Activity之间的数据传递啦
比如UI是这个样子滴~~~


image.png

不难看出这个pop是一个列表
而这是Activity


image.png

首先也是要做一个接口回调

/**
 * @Description 选择用车区域接口回调
 * @Author zwp
 * @Date 2021/7/2 13:49
 */
public interface SelectCarAreasListener {

    void selectItem(String name);
}

然后和不是列表的区别在于,我们要在adapter中去引用这个接口回调,代码是长这个样子滴

//这是adapter哦
 private SelectCarAreasListener selectAreaListener;

    //暴露给Pop的方法
    public void setCarAreaListener(SelectCarAreasListener selectAreaListener) {
        this.selectAreaListener = selectAreaListener;
    }

最后在Activtiy中调用弹窗的地方

 //用车区域
 SelectCarsAreaPop selectCarsPop = new SelectCarsAreaPop(ApplyCarActivity.this);
 selectCarsPop.setSelectAreaListener(new SelectCarAreasListener() {
   @Override
  public void selectItem(String name) {
   if (selectCarsPop != null) {
    selectCarsPop.dismiss();
                    }
 chooseVehicleArea.setText(name);
 chooseVehicleArea.setTextColor(Color.parseColor("#ff333333"));
       }
            });
 selectCarsPop.show(getWindow().getDecorView());

酱紫就完成啦数据之间的简单传递啦 你学废了嘛

END......


image.png

相关文章

  • 数据的相互传递

    整体逻辑 Activtiy之间数据传递就是借助intent和startActivityForResult以及onA...

  • Vue中组件间传值总结 ------ 2020-05-17

    父子组件间传递数据的方式 1、父组件向子组件传递数据 2、子组件向父组件传递数据 3、父子组件相互传递同一数据的两...

  • Angular事件-不同组件间传递数据

    利用Angular Event在不同组件之间传递数据 为了实现在Angular不同Component之间相互传递数...

  • 在一个activity中启动另一个activity并且传递数据

    在一个activity中启动另一个activity并且相互传递数据 这里我们是一个A向B传递数据,跳转到B显示,回...

  • 父子组件通信

    组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。 父组件向子组件传递数据 子组件使用 pr...

  • vue.js组件间通信

    组件间需要能相互通信才价值,通信包括数据的传递,方法的调用。这样才能将不同组件结合起来搭建页面 父组件传递数据给子...

  • 关于$on的用法

    $on 兄弟组件之间相互传递数据 示例 父组件 $onFa.vue 创建一个vue的空白实例 emptyVue.j...

  • VUE进阶 - $on和$emit的用法

    使用场景:兄弟组件之间相互传递数据 先上简单的用法,一个页面上使用 兄弟组件传值

  • vue 的$attrs $listeners

    组件多级嵌套,相互传递如何实现的A:父组件B:子组件C:孙组件在开发过程中,有时候想把某些数据从A组件传递给C组件...

  • java面向对象之方法调用的参数传递/值传递

    程序在执行过从中,参数传递问题: 1、传递的数据是基本数据类型 2、传递的数据是引用数据类型 传递的数据是基本数据...

网友评论

    本文标题:数据的相互传递

    本文链接:https://www.haomeiwen.com/subject/llvssltx.html