Best Way To Pass Data From Fragment To DialogFragment
我正在尝试找出在 Fragment 和 DialogFragment 之间传递数据的最佳方式。 (2路通讯)
首先我有一个对话框片段,允许用户选择用于旅行的司机/车辆。用户可以选择多个司机和车辆。这是 DialogFragment 类的片段:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class DriverVehiclePickersDialogFragment extends DialogFragment implements OnClickListener, LoaderManager.LoaderCallbacks<Cursor> {
private static final int DRIVERS_LOADER = 0; // Parent view for all rows and the add button. // These are the Contacts rows that we will retrieve. public interface DriverVehicleDialogListener { @Override // Helper for inflating a row Bundle args = getArguments(); if ((dialogType == DialogType.DRIVER_SPINNER) || (dialogType == DialogType.DRIVER_VEHICLE_SPINNER)) { if ((dialogType == DialogType.VEHICLE_SPINNER) || (dialogType == DialogType.DRIVER_VEHICLE_SPINNER)) { ImageButton mDelete = (ImageButton) rowView.findViewById(R.id.buttonDelete); // Inflate at the end of all rows but before the"Add new" button |
这是我的车辆类:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public static final class Vehicles implements VehicleColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_VEHICLES).build(); private int vehicle_id, vehicle_number; public Vehicles() { public Vehicles(int vehicleID, int vehicleNumber, String vehicleVin) { public int getVehicleID() { public void setVehicleID(int mVehicleID) { public int getVehicleNumber() { public void setVehicleNumber(int mVehicleNumber) { public String getVehicleVin() { public void setVehicleVin(String mVehicleVin) { public static Uri buildVehicleUri(String vehicleID) { |
这是我的司机课程:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public static final class Drivers implements DriverColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_DRIVERS).build(); private int driver_id, driver_number; public Drivers() { public Drivers(int driverID, int driverNumber, String driverName) { public static Uri buildDriverUri(String driverID) { public int getDriverID() { public void setDriverID(int driver_id) { public int getDriverNumber() { public void setDriverNumber(int driver_number) { public String getDriverName() { public void setDriverName(String driver_name) { |
这是我的片段,它调用对话片段来选择驾驶员/车辆:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class CrewTripFragment extends Fragment implements DateTimeDialogListener, CrewCountDialogListener, DriverVehicleDialogListener, OnItemSelectedListener {
@Override protected void showDriverVehicleDialog() { // Creating a bundle object if (mDrivers != null) { if (mVehicles != null) { DriverVehiclePickersDialogFragment dialogDriverVehiclePicker = DriverVehiclePickersDialogFragment.newInstance(this, bundleSettings); |
我在考虑是否应该将对话片段中的驾驶员列表和车辆列表传递回片段?
我也在考虑将一组 URI 传回片段,但这不是一个好主意,因为数据库与 web 服务保持同步,如果它同步并且 sqlite 数据库中的记录被删除,那么我无法检索片段内的数据。
我真的不确定什么是最好的解决方案,任何帮助将不胜感激。
你可以选择任何你想要的方法。
请注意,在某些情况下,片段/活动可能会重新创建(例如当您旋转设备时),因此您也需要处理它(除非您对此感到满意,否则对话框将消失。
由于您使用 setArguments 和 getArguments,您可以使用 onSaveInstanceState ,但同样,这完全取决于您想在这些情况下做什么。
对于要传递给活动的数据,您甚至可以使用自己的侦听器。
如果不仔细研究您的代码,我就是这样做的(通过 Activity 将数据从 Fragment 传递到 DialogFragment ):
像往常一样在 Frag1 中声明一个在 Act:
中实现的静态接口
1
2 3 |
public static interface DataProxy {
void sendData(Object … args); } |
通过某种方法准备 DFrag 以接收数据:
1
|
public void recvData(Object … data){ … }
|
假设 DFrag 使用标签显示:
1
2 |
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(getSupportFragmentManager().beginTransaction(),"my-dialog"); |
然后从 Act:
1
2 3 4 5 6 7 |
@Override
public void sendData(Object …data) { Fragment frag = getSupportFragmentManager().findFragmentByTag("my-dialog"); if(frag != null && frag instanceof MyDialogFragment) { ((MyDialogFragment) frag).recvData(data); } } |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269041.html