整体逻辑
Activtiy之间数据传递就是借助intent和startActivityForResult以及onActivityResult、setResult,需要有一个标识将两个Activity联系起来,告知对方是自己传递的消息,即一个常量码;
pop与Activity之间的传递则是通过接口回调的方式,在pop中做一个接口,并暴露给activity一个方法去调用
1.pop与activity之间的数据传递
pop中没有列表式的数据,单一的某一项罗列出来如果想将数据传递个activity,需要每一项都做点击事件。
栗子:如下图所示
![](https://img.haomeiwen.com/i24275679/ee1b555e06e8ebe5.png)
这 是一个弹窗
我想把这个数据回传给上一个页面
![](https://img.haomeiwen.com/i24275679/c6367f5f5c65e91f.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中。
小小小栗子:如下图所示
![](https://img.haomeiwen.com/i24275679/97c906c8bc7edc0f.png)
这是第一个Activtiy
![](https://img.haomeiwen.com/i24275679/714ba89532ed44a0.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啦
拓展
![](https://img.haomeiwen.com/i24275679/48fde28cdab77d20.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是这个样子滴~~~
![](https://img.haomeiwen.com/i24275679/1801097afc489dbe.png)
不难看出这个pop是一个列表
而这是Activity
![](https://img.haomeiwen.com/i24275679/9cd8cda9001635a5.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......
![](https://img.haomeiwen.com/i24275679/cdde1ec5dc370fcc.png)
网友评论