添加位置信息编辑功能
This commit is contained in:
		| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Mon Sep 29 12:02:00 GMT 2025 | ||||
| #Mon Sep 29 17:49:24 GMT 2025 | ||||
| stageCount=3 | ||||
| libraryProject= | ||||
| baseVersion=15.0 | ||||
| publishVersion=15.0.2 | ||||
| buildCount=4 | ||||
| buildCount=12 | ||||
| baseBetaVersion=15.0.3 | ||||
|   | ||||
| @@ -6,17 +6,28 @@ package cc.winboll.studio.positions.activities; | ||||
|  * @Describe 当前位置实时显示 | ||||
|  */ | ||||
| import android.Manifest; | ||||
| import android.app.AlertDialog; | ||||
| import android.content.DialogInterface; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.location.Location; | ||||
| import android.os.Bundle; | ||||
| import android.text.InputType; | ||||
| import android.view.GestureDetector; | ||||
| import android.view.MotionEvent; | ||||
| import android.view.View; | ||||
| import android.widget.Button; | ||||
| import android.widget.EditText; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.core.app.ActivityCompat; | ||||
| import androidx.recyclerview.widget.LinearLayoutManager; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import cc.winboll.studio.positions.R; | ||||
| import cc.winboll.studio.positions.activities.LocationActivity; | ||||
| import cc.winboll.studio.positions.adapters.PositionAdapter; | ||||
| import cc.winboll.studio.positions.models.PositionModel; | ||||
| import com.google.android.gms.location.FusedLocationProviderClient; | ||||
| import com.google.android.gms.location.LocationCallback; | ||||
| import com.google.android.gms.location.LocationRequest; | ||||
| @@ -24,11 +35,7 @@ import com.google.android.gms.location.LocationResult; | ||||
| import com.google.android.gms.location.LocationServices; | ||||
| import com.google.android.gms.tasks.OnSuccessListener; | ||||
| import java.util.ArrayList; | ||||
| import android.app.AlertDialog; | ||||
| import android.content.DialogInterface; | ||||
| import android.widget.EditText; | ||||
| import android.text.InputType; | ||||
| import cc.winboll.studio.positions.models.PositionModel; | ||||
| import android.view.LayoutInflater; | ||||
|  | ||||
| /** | ||||
|  * 实时定位活动窗口: | ||||
| @@ -51,6 +58,9 @@ public class LocationActivity extends AppCompatActivity { | ||||
|     private TextView tvLongitude; // 经度显示 | ||||
|     private TextView tvLatitude;  // 纬度显示 | ||||
|     private Button fabPButton;    // 右下角圆形悬浮按钮(P字母) | ||||
| 	// UI控件:新增RecyclerView和Adapter | ||||
|     private RecyclerView rvPositionList; // 位置列表(RecyclerView) | ||||
|     private PositionAdapter positionAdapter; // 列表Adapter(数据联动) | ||||
| 	ArrayList<PositionModel> mPositionList = new ArrayList<PositionModel>(); | ||||
|  | ||||
|     @Override | ||||
| @@ -67,6 +77,15 @@ public class LocationActivity extends AppCompatActivity { | ||||
|         initLocationConfig(); | ||||
|         // 初始化悬浮按钮(设置点击事件) | ||||
|         initFabPButton(); | ||||
| 		 | ||||
| 		// 新增1:绑定RecyclerView控件(显式强转,适配Java 7) | ||||
|         rvPositionList = (RecyclerView) findViewById(R.id.rv_position_list); | ||||
|  | ||||
|         // 新增2:初始化Adapter(传入mPositionList,确保数据联动) | ||||
|         initRecyclerViewAndAdapter(); | ||||
|  | ||||
|         // 新增3:从本地加载历史位置数据(BaseBean的saveBeanList对应加载方法) | ||||
|         loadHistoryPositions(); | ||||
|  | ||||
|         // 检查并申请定位权限 | ||||
|         if (checkLocationPermissions()) { | ||||
| @@ -122,6 +141,90 @@ public class LocationActivity extends AppCompatActivity { | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| 	 | ||||
| 	private void initRecyclerViewAndAdapter() { | ||||
| 		// 1. 初始化Adapter(传入Context和mPositionList,适配新构造函数) | ||||
| 		positionAdapter = new PositionAdapter(this, mPositionList); | ||||
| 		rvPositionList.setAdapter(positionAdapter); | ||||
|  | ||||
| 		// 2. 设置删除监听(编辑视图点击“删除”时触发) | ||||
| 		positionAdapter.setOnDeleteClickListener(new PositionAdapter.OnDeleteClickListener() { | ||||
| 				@Override | ||||
| 				public void onDeleteClick(int position) { | ||||
| 					// 弹删除确认对话框(复用之前的showDeleteConfirmDialog方法) | ||||
| 					showDeleteConfirmDialog(position); | ||||
| 				} | ||||
| 			}); | ||||
|  | ||||
| 		// 3. 设置保存监听(编辑视图点击“确定”时触发,同步本地数据) | ||||
| 		positionAdapter.setOnSaveClickListener(new PositionAdapter.OnSaveClickListener() { | ||||
| 				@Override | ||||
| 				public void onSaveClick() { | ||||
| 					// 编辑后保存到本地 | ||||
| 					try { | ||||
| 						PositionModel.saveBeanList(LocationActivity.this, mPositionList, PositionModel.class); | ||||
| 					} catch (Exception e) { | ||||
| 						e.printStackTrace(); | ||||
| 						Toast.makeText(LocationActivity.this, "数据保存失败", Toast.LENGTH_SHORT).show(); | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
|  | ||||
| 		// 4. 原有布局管理器设置(保留不变) | ||||
| 		RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); | ||||
| 		((LinearLayoutManager) layoutManager).setOrientation(LinearLayoutManager.VERTICAL); | ||||
| 		rvPositionList.setLayoutManager(layoutManager); | ||||
| 	} | ||||
|  | ||||
| // 保留原删除确认对话框(无修改,编辑视图点击“删除”会触发此方法) | ||||
| 	private void showDeleteConfirmDialog(final int position) { | ||||
| 		AlertDialog.Builder deleteDialogBuilder = new AlertDialog.Builder(this); | ||||
| 		deleteDialogBuilder.setTitle("删除位置记录") | ||||
|             .setMessage("确定要删除这条位置记录吗?(删除后不可恢复)") | ||||
|             .setPositiveButton("确定", new DialogInterface.OnClickListener() { | ||||
|                 @Override | ||||
|                 public void onClick(DialogInterface dialog, int which) { | ||||
|                     positionAdapter.removePosition(position); | ||||
|                     // 删除后同步本地数据 | ||||
|                     try { | ||||
|                         PositionModel.saveBeanList(LocationActivity.this, mPositionList, PositionModel.class); | ||||
|                         Toast.makeText(LocationActivity.this, "删除成功", Toast.LENGTH_SHORT).show(); | ||||
|                     } catch (Exception e) { | ||||
|                         e.printStackTrace(); | ||||
|                         Toast.makeText(LocationActivity.this, "删除失败,请重试", Toast.LENGTH_SHORT).show(); | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             .setNegativeButton("取消", new DialogInterface.OnClickListener() { | ||||
|                 @Override | ||||
|                 public void onClick(DialogInterface dialog, int which) { | ||||
|                     dialog.dismiss(); | ||||
|                 } | ||||
|             }) | ||||
|             .setCancelable(false); | ||||
| 		deleteDialogBuilder.show(); | ||||
| 	} | ||||
| 	 | ||||
| 	/** | ||||
|      * 从本地加载历史位置数据: | ||||
|      * 基于BaseBean的saveBeanList方法,对应加载方法为readBeanList(通用持久化逻辑) | ||||
|      */ | ||||
|     private void loadHistoryPositions() { | ||||
|         try { | ||||
|             // 读取本地保存的PositionModel列表(参数:上下文、数据模型类) | ||||
|             ArrayList<PositionModel> historyList = new ArrayList<PositionModel>(); | ||||
| 			PositionModel.loadBeanList(LocationActivity.this, historyList, PositionModel.class); | ||||
|             if (historyList != null && !historyList.isEmpty()) { | ||||
|                 mPositionList.clear(); // 清空原有空列表 | ||||
|                 mPositionList.addAll(historyList); // 添加历史数据 | ||||
|                 positionAdapter.notifyDataSetChanged(); // 通知Adapter更新列表 | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             // 异常处理(如首次启动无历史数据,不提示) | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 	 | ||||
|  | ||||
|  | ||||
|     /** | ||||
| @@ -217,10 +320,20 @@ public class LocationActivity extends AppCompatActivity { | ||||
|     @Override | ||||
|     protected void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|         // Java 7条件判断格式无差异,保持空指针防护 | ||||
| 		 | ||||
| 		// 1. 停止定位监听(原有逻辑,保留) | ||||
|         if (fusedLocationClient != null && locationCallback != null) { | ||||
|             fusedLocationClient.removeLocationUpdates(locationCallback); | ||||
|         } | ||||
|  | ||||
|         // 2. 补充:销毁前同步一次数据(确保最后修改的记录被保存) | ||||
|         try { | ||||
|             if (mPositionList != null && !mPositionList.isEmpty()) { | ||||
|                 PositionModel.saveBeanList(this, mPositionList, PositionModel.class); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 	 | ||||
| 	/** | ||||
| @@ -285,7 +398,7 @@ public class LocationActivity extends AppCompatActivity { | ||||
|         // 5. 配置对话框其他属性(禁止点击外部关闭、禁止按返回键关闭) | ||||
|         dialogBuilder.setCancelable(false); // 点击对话框外部不关闭 | ||||
|         AlertDialog remarkDialog = dialogBuilder.create(); // 创建对话框实例 | ||||
|         remarkDialog.setCanceledOnTouchOutside(false); // 再次确认“外部点击不关闭”(兼容部分机型) | ||||
|         remarkDialog.setCanceledOnTouchOutside(true); // 再次确认“外部点击不关闭”(兼容部分机型) | ||||
|  | ||||
|         // 6. 显示对话框 | ||||
|         remarkDialog.show(); | ||||
|   | ||||
| @@ -0,0 +1,259 @@ | ||||
| package cc.winboll.studio.positions.adapters; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com> | ||||
|  * @Date 2025/09/29 20:25 | ||||
|  * @Describe 位置数据适配器(支持简单视图/编辑视图切换) | ||||
|  */ | ||||
| import android.content.Context; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.Button; | ||||
| import android.widget.EditText; | ||||
| import android.widget.PopupMenu; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import cc.winboll.studio.positions.R; | ||||
| import cc.winboll.studio.positions.models.PositionModel; | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| public class PositionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { | ||||
|     public static final String TAG = "PositionAdapter"; | ||||
|     private static final int VIEW_TYPE_SIMPLE = 1;  // 简单视图 | ||||
|     private static final int VIEW_TYPE_EDIT = 2;    // 编辑视图 | ||||
|  | ||||
|     private ArrayList<PositionModel> mPositionList; | ||||
|     private Context mContext; | ||||
|  | ||||
|     // 接口定义(不变) | ||||
|     public interface OnDeleteClickListener { | ||||
|         void onDeleteClick(int position); | ||||
|     } | ||||
|  | ||||
|     public interface OnSaveClickListener { | ||||
|         void onSaveClick(); | ||||
|     } | ||||
|  | ||||
|     private OnDeleteClickListener mOnDeleteClickListener; | ||||
|     private OnSaveClickListener mOnSaveClickListener; | ||||
|  | ||||
|     // 构造函数(不变) | ||||
|     public PositionAdapter(Context context, ArrayList<PositionModel> positionList) { | ||||
|         this.mContext = context; | ||||
|         this.mPositionList = positionList; | ||||
|     } | ||||
|  | ||||
|     // 设置监听(不变) | ||||
|     public void setOnDeleteClickListener(OnDeleteClickListener listener) { | ||||
|         this.mOnDeleteClickListener = listener; | ||||
|     } | ||||
|  | ||||
|     public void setOnSaveClickListener(OnSaveClickListener listener) { | ||||
|         this.mOnSaveClickListener = listener; | ||||
|     } | ||||
|  | ||||
|     // 视图类型判断(不变) | ||||
|     @Override | ||||
|     public int getItemViewType(int position) { | ||||
|         PositionModel model = mPositionList.get(position); | ||||
|         return model.isSimpleView() ? VIEW_TYPE_SIMPLE : VIEW_TYPE_EDIT; | ||||
|     } | ||||
|  | ||||
|     // 创建ViewHolder(不变,布局已在xml中修改) | ||||
|     @NonNull | ||||
|     @Override | ||||
|     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | ||||
|         LayoutInflater inflater = LayoutInflater.from(mContext); | ||||
|         if (viewType == VIEW_TYPE_SIMPLE) { | ||||
|             View view = inflater.inflate(R.layout.item_position_simple, parent, false); | ||||
|             return new SimpleViewHolder(view); | ||||
|         } else { | ||||
|             View view = inflater.inflate(R.layout.item_position_edit, parent, false); | ||||
|             return new EditViewHolder(view); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // 绑定数据(核心修改:编辑视图添加取消按钮逻辑) | ||||
|     @Override | ||||
|     public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { | ||||
|         PositionModel model = mPositionList.get(position); | ||||
|         if (holder instanceof SimpleViewHolder) { | ||||
|             bindSimpleView((SimpleViewHolder) holder, model, position); | ||||
|         } else if (holder instanceof EditViewHolder) { | ||||
|             // 编辑视图绑定:新增取消按钮逻辑 | ||||
|             bindEditView((EditViewHolder) holder, model, position); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // 简单视图绑定(不变) | ||||
|     private void bindSimpleView(SimpleViewHolder holder, final PositionModel model, final int position) { | ||||
|         holder.tvSimpleLongitude.setText(String.format("经度:%.6f", model.getLongitude())); | ||||
|         holder.tvSimpleLatitude.setText(String.format("纬度:%.6f", model.getLatitude())); | ||||
|         String memo = model.getMemo().trim().isEmpty() ? "无备注" : model.getMemo(); | ||||
|         holder.tvSimpleMemo.setText(String.format("备注:%s", memo)); | ||||
|  | ||||
|         holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { | ||||
| 				@Override | ||||
| 				public boolean onLongClick(View v) { | ||||
| 					PopupMenu popupMenu = new PopupMenu(mContext, v); | ||||
| 					MenuInflater menuInflater = popupMenu.getMenuInflater(); | ||||
| 					menuInflater.inflate(R.menu.menu_item_edit, popupMenu.getMenu()); | ||||
|  | ||||
| 					popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { | ||||
| 							@Override | ||||
| 							public boolean onMenuItemClick(MenuItem item) { | ||||
| 								if (item.getItemId() == R.id.menu_edit) { | ||||
| 									model.setIsSimpleView(false); | ||||
| 									notifyItemChanged(position); | ||||
| 									return true; | ||||
| 								} | ||||
| 								return false; | ||||
| 							} | ||||
| 						}); | ||||
| 					popupMenu.show(); | ||||
| 					return true; | ||||
| 				} | ||||
| 			}); | ||||
|     } | ||||
|  | ||||
|     // 编辑视图绑定(核心修改:新增取消按钮+调整按钮顺序) | ||||
|     private void bindEditView(final EditViewHolder holder, final PositionModel model, final int position) { | ||||
|         // 1. 绑定数据(不变) | ||||
|         holder.tvEditLongitude.setText(String.format("经度:%.6f", model.getLongitude())); | ||||
|         holder.tvEditLatitude.setText(String.format("纬度:%.6f", model.getLatitude())); | ||||
|         holder.etEditMemo.setText(model.getMemo()); | ||||
|         holder.etEditMemo.setSelection(model.getMemo().length()); | ||||
|  | ||||
|         // 2. 按钮逻辑(顺序:①删除→②取消→③确定) | ||||
|         // ① 删除按钮(最左侧,逻辑不变) | ||||
|         holder.btnEditDelete.setOnClickListener(new View.OnClickListener() { | ||||
| 				@Override | ||||
| 				public void onClick(View v) { | ||||
| 					if (mOnDeleteClickListener != null) { | ||||
| 						mOnDeleteClickListener.onDeleteClick(position); | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
|  | ||||
|         // ② 新增:取消按钮(中间,不保存→切回简单视图) | ||||
|         holder.btnEditCancel.setOnClickListener(new View.OnClickListener() { | ||||
| 				@Override | ||||
| 				public void onClick(View v) { | ||||
| 					// 关键:不保存任何修改,直接设置为简单视图 | ||||
| 					model.setIsSimpleView(true); | ||||
| 					// 局部刷新当前项→切换回简单视图 | ||||
| 					notifyItemChanged(position); | ||||
| 					// (可选)清空输入框焦点,避免残留光标 | ||||
| 					holder.etEditMemo.clearFocus(); | ||||
| 				} | ||||
| 			}); | ||||
|  | ||||
|         // ③ 确定按钮(最右侧,逻辑不变) | ||||
|         holder.btnEditConfirm.setOnClickListener(new View.OnClickListener() { | ||||
| 				@Override | ||||
| 				public void onClick(View v) { | ||||
| 					String newMemo = holder.etEditMemo.getText().toString().trim(); | ||||
| 					model.setMemo(newMemo.isEmpty() ? "无备注" : newMemo); | ||||
| 					model.setIsSimpleView(true); | ||||
| 					notifyItemChanged(position); | ||||
|  | ||||
| 					if (mOnSaveClickListener != null) { | ||||
| 						mOnSaveClickListener.onSaveClick(); | ||||
| 					} | ||||
| 					Toast.makeText(mContext, "备注已保存", Toast.LENGTH_SHORT).show(); | ||||
| 				} | ||||
| 			}); | ||||
|     } | ||||
|  | ||||
|     // ---------------------- ViewHolder 定义(核心修改:新增取消按钮引用) ---------------------- | ||||
|     /** | ||||
|      * 简单视图Holder(不变) | ||||
|      */ | ||||
|     public static class SimpleViewHolder extends RecyclerView.ViewHolder { | ||||
|         TextView tvSimpleLongitude; | ||||
|         TextView tvSimpleLatitude; | ||||
|         TextView tvSimpleMemo; | ||||
|  | ||||
|         public SimpleViewHolder(@NonNull View itemView) { | ||||
|             super(itemView); | ||||
|             tvSimpleLongitude = (TextView) itemView.findViewById(R.id.tv_simple_longitude); | ||||
|             tvSimpleLatitude = (TextView) itemView.findViewById(R.id.tv_simple_latitude); | ||||
|             tvSimpleMemo = (TextView) itemView.findViewById(R.id.tv_simple_memo); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 编辑视图Holder(核心修改:新增btnEditCancel引用) | ||||
|      */ | ||||
|     public static class EditViewHolder extends RecyclerView.ViewHolder { | ||||
|         TextView tvEditLongitude; | ||||
|         TextView tvEditLatitude; | ||||
|         EditText etEditMemo; | ||||
|         Button btnEditDelete;    // 删除按钮(已调整到最左) | ||||
|         Button btnEditCancel;    // 新增:取消按钮(中间) | ||||
|         Button btnEditConfirm;   // 确定按钮(最右) | ||||
|  | ||||
|         public EditViewHolder(@NonNull View itemView) { | ||||
|             super(itemView); | ||||
|             // 绑定控件(顺序与xml一致:删除→取消→确定) | ||||
|             tvEditLongitude = (TextView) itemView.findViewById(R.id.tv_edit_longitude); | ||||
|             tvEditLatitude = (TextView) itemView.findViewById(R.id.tv_edit_latitude); | ||||
|             etEditMemo = (EditText) itemView.findViewById(R.id.et_edit_memo); | ||||
|             btnEditDelete = (Button) itemView.findViewById(R.id.btn_edit_delete);  // 最左 | ||||
|             btnEditCancel = (Button) itemView.findViewById(R.id.btn_edit_cancel);  // 中间(新增) | ||||
|             btnEditConfirm = (Button) itemView.findViewById(R.id.btn_edit_confirm); // 最右 | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // 数据存取方法(不变) | ||||
|     public void addPosition(PositionModel model) { | ||||
|         if (mPositionList != null && model != null) { | ||||
|             model.setIsSimpleView(true); | ||||
|             mPositionList.add(model); | ||||
|             notifyItemInserted(mPositionList.size() - 1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void removePosition(int position) { | ||||
|         if (mPositionList != null && position >= 0 && position < mPositionList.size()) { | ||||
|             mPositionList.remove(position); | ||||
|             notifyItemRemoved(position); | ||||
|             notifyItemRangeChanged(position, mPositionList.size()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void updateAllPositions(ArrayList<PositionModel> newList) { | ||||
|         if (newList != null) { | ||||
|             mPositionList.clear(); | ||||
|             for (PositionModel model : newList) { | ||||
|                 model.setIsSimpleView(true); | ||||
|             } | ||||
|             mPositionList.addAll(newList); | ||||
|             notifyDataSetChanged(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public ArrayList<PositionModel> getPositionList() { | ||||
|         return mPositionList; | ||||
|     } | ||||
|  | ||||
|     public void switchAllToSimpleView() { | ||||
|         if (mPositionList != null) { | ||||
|             for (PositionModel model : mPositionList) { | ||||
|                 model.setIsSimpleView(true); | ||||
|             } | ||||
|             notifyDataSetChanged(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int getItemCount() { | ||||
|         return mPositionList == null ? 0 : mPositionList.size(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -19,6 +19,8 @@ public class PositionModel extends BaseBean { | ||||
| 	double latitude; | ||||
| 	// 位置信息备注 | ||||
| 	String memo; | ||||
| 	// 是否是简单视图 | ||||
| 	boolean isSimpleView = true; | ||||
|  | ||||
| 	public PositionModel(double longitude, double latitude, String memo) { | ||||
| 		this.longitude = longitude; | ||||
| @@ -32,6 +34,14 @@ public class PositionModel extends BaseBean { | ||||
| 		this.memo = ""; | ||||
| 	} | ||||
|  | ||||
| 	public void setIsSimpleView(boolean isSimpleView) { | ||||
| 		this.isSimpleView = isSimpleView; | ||||
| 	} | ||||
|  | ||||
| 	public boolean isSimpleView() { | ||||
| 		return isSimpleView; | ||||
| 	} | ||||
|  | ||||
| 	public void setMemo(String memo) { | ||||
| 		this.memo = memo; | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										18
									
								
								positions/src/main/res/drawable/btn_cancel_bg.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								positions/src/main/res/drawable/btn_cancel_bg.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <!-- 按压状态(加深灰色) --> | ||||
|     <item android:state_pressed="true"> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#666666"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
|     <!-- 默认状态(浅灰色) --> | ||||
|     <item> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#999999"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
| </selector> | ||||
|  | ||||
							
								
								
									
										18
									
								
								positions/src/main/res/drawable/btn_confirm_bg.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								positions/src/main/res/drawable/btn_confirm_bg.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <!-- 按压状态(加深蓝色) --> | ||||
|     <item android:state_pressed="true"> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#303F9F"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
|     <!-- 默认状态(标准蓝色) --> | ||||
|     <item> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#3F51B5"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
| </selector> | ||||
|  | ||||
							
								
								
									
										16
									
								
								positions/src/main/res/drawable/btn_delete_bg.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								positions/src/main/res/drawable/btn_delete_bg.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:state_pressed="true"> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#D32F2F"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
|     <item> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#F44336"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
| </selector> | ||||
|  | ||||
							
								
								
									
										18
									
								
								positions/src/main/res/drawable/edittext_bg.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								positions/src/main/res/drawable/edittext_bg.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:state_focused="true"> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#FFFFFF"/> | ||||
|             <stroke android:width="1.5dp" android:color="#4A90E2"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
|     <item> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#FFFFFF"/> | ||||
|             <stroke android:width="1dp" android:color="#DDDDDD"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
| </selector> | ||||
|  | ||||
							
								
								
									
										18
									
								
								positions/src/main/res/drawable/item_position_bg.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								positions/src/main/res/drawable/item_position_bg.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:state_pressed="true"> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#F5F5F5"/> | ||||
|             <stroke android:width="1dp" android:color="#DDDDDD"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
|     <item> | ||||
|         <shape android:shape="rectangle"> | ||||
|             <solid android:color="#FFFFFF"/> | ||||
|             <stroke android:width="1dp" android:color="#DDDDDD"/> | ||||
|             <corners android:radius="4dp"/> | ||||
|         </shape> | ||||
|     </item> | ||||
| </selector> | ||||
|  | ||||
| @@ -1,15 +1,16 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- 根布局改为RelativeLayout,支持悬浮按钮绝对定位(右下角) --> | ||||
| <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:padding="20dp"> | ||||
|  | ||||
|     <!-- 原有内容:经纬度显示区域(保持居中) --> | ||||
|     <!-- 1. 经纬度显示区域(保持居中,上方) --> | ||||
|     <LinearLayout | ||||
|         android:id="@+id/layout_location_info" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_centerInParent="true" | ||||
|         android:layout_centerHorizontal="true" | ||||
|         android:layout_marginTop="30dp" | ||||
|         android:orientation="vertical" | ||||
|         android:gravity="center_horizontal"> | ||||
|  | ||||
| @@ -27,7 +28,8 @@ | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:text="当前经度:等待更新..." | ||||
|             android:textSize="18sp"/> | ||||
|             android:textSize="18sp" | ||||
|             android:layout_marginTop="15dp"/> | ||||
|  | ||||
|         <!-- 纬度显示 --> | ||||
|         <TextView | ||||
| @@ -35,11 +37,22 @@ | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:text="当前纬度:等待更新..." | ||||
|             android:textSize="18sp"/> | ||||
|             android:textSize="18sp" | ||||
|             android:layout_marginTop="10dp"/> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- 新增:右下角圆形悬浮按钮(中间显示大写P字母) --> | ||||
|     <!-- 2. 新增:位置列表(RecyclerView)- 位于经纬度下方,悬浮按钮上方 --> | ||||
|     <androidx.recyclerview.widget.RecyclerView | ||||
|         android:id="@+id/rv_position_list" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:layout_below="@id/layout_location_info" | ||||
|         android:layout_above="@id/fab_p_button" | ||||
|         android:layout_marginTop="20dp" | ||||
|         android:paddingBottom="10dp"/> | ||||
|  | ||||
|     <!-- 3. 右下角圆形悬浮按钮(不变) --> | ||||
|     <Button | ||||
|         android:id="@+id/fab_p_button" | ||||
|         android:layout_width="60dp" | ||||
|   | ||||
							
								
								
									
										41
									
								
								positions/src/main/res/layout/dialog_edit_position.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								positions/src/main/res/layout/dialog_edit_position.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- 编辑视图布局:垂直排列(经纬度显示+备注输入框),带内边距确保美观 --> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="16dp"> | ||||
|  | ||||
|     <!-- 1. 经度显示(灰色小字体,不可编辑) --> | ||||
|     <TextView | ||||
|         android:id="@+id/tv_edit_longitude" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textSize="14sp" | ||||
|         android:textColor="#666666" | ||||
|         android:layout_marginBottom="8dp"/> | ||||
|  | ||||
|     <!-- 2. 纬度显示(灰色小字体,不可编辑) --> | ||||
|     <TextView | ||||
|         android:id="@+id/tv_edit_latitude" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textSize="14sp" | ||||
|         android:textColor="#666666" | ||||
|         android:layout_marginBottom="16dp"/> | ||||
|  | ||||
|     <!-- 3. 备注输入框(可编辑,带提示文字,适配多行输入) --> | ||||
|     <EditText | ||||
|         android:id="@+id/et_edit_memo" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:hint="请输入位置备注(如:公司/家/学校)" | ||||
|         android:textSize="16sp" | ||||
|         android:inputType="textMultiLine" | ||||
|         android:minLines="3" | ||||
|         android:maxLines="5" | ||||
|         android:padding="10dp" | ||||
|         android:background="@drawable/edittext_bg"/> <!-- 输入框背景(带边框,区分普通文本) --> | ||||
|  | ||||
| </LinearLayout> | ||||
|  | ||||
							
								
								
									
										60
									
								
								positions/src/main/res/layout/item_position.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								positions/src/main/res/layout/item_position.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- 列表项布局:左侧显示经纬度/备注,右侧添加删除按钮 --> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:orientation="horizontal" | ||||
|     android:padding="12dp" | ||||
|     android:background="@drawable/item_position_bg" | ||||
|     android:layout_marginBottom="8dp" | ||||
|     android:gravity="center_vertical"> <!-- 内容与按钮垂直居中对齐 --> | ||||
|  | ||||
|     <!-- 左侧:内容区(经纬度+备注,垂直排列,占满剩余宽度) --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="0dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_weight="1" | ||||
|         android:orientation="vertical" | ||||
|         android:clickable="false"> <!-- 内容区禁止点击响应 --> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/tv_item_longitude" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="14sp" | ||||
|             android:textColor="#666666"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/tv_item_latitude" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="14sp" | ||||
|             android:textColor="#666666" | ||||
|             android:layout_marginTop="5dp"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/tv_item_memo" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="16sp" | ||||
|             android:textColor="#000000" | ||||
|             android:textStyle="bold" | ||||
|             android:layout_marginTop="8dp"/> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- 右侧:删除按钮(红色图标/文字,仅按钮可点击) --> | ||||
|     <Button | ||||
|         android:id="@+id/btn_item_delete" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="30dp" | ||||
|         android:layout_marginStart="10dp" | ||||
|         android:background="@drawable/btn_delete_bg" | ||||
|         android:text="删除" | ||||
|         android:textColor="@android:color/white" | ||||
|         android:textSize="12sp" | ||||
|         android:paddingStart="12dp" | ||||
|         android:paddingEnd="12dp"/> | ||||
|  | ||||
| </LinearLayout> | ||||
|  | ||||
							
								
								
									
										105
									
								
								positions/src/main/res/layout/item_position_edit.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								positions/src/main/res/layout/item_position_edit.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- 编辑视图:按钮顺序改为【删除(左)→取消→确定(右)】,新增取消按钮 --> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="12dp" | ||||
|     android:background="@drawable/item_position_bg" | ||||
|     android:layout_marginBottom="8dp"> | ||||
|  | ||||
|     <!-- 1. 经纬度显示(不变) --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="vertical" | ||||
|         android:layout_marginBottom="12dp"> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/tv_edit_longitude" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="14sp" | ||||
|             android:textColor="#666666"/> | ||||
|  | ||||
|         <TextView | ||||
|             android:id="@+id/tv_edit_latitude" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:textSize="14sp" | ||||
|             android:textColor="#666666" | ||||
|             android:layout_marginTop="5dp"/> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
|     <!-- 2. 备注输入框(不变) --> | ||||
|     <EditText | ||||
|         android:id="@+id/et_edit_memo" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:hint="请输入位置备注(如:公司/家/学校)" | ||||
|         android:textSize="16sp" | ||||
|         android:inputType="textMultiLine" | ||||
|         android:minLines="2" | ||||
|         android:maxLines="4" | ||||
|         android:padding="10dp" | ||||
|         android:background="@drawable/edittext_bg" | ||||
|         android:layout_marginBottom="12dp"/> | ||||
|  | ||||
|     <!-- 3. 按钮区(核心修改:顺序→删除(左)→取消→确定(右),新增取消按钮) --> | ||||
|     <LinearLayout | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal" | ||||
|         android:gravity="center_vertical"> | ||||
|  | ||||
|         <!-- ① 删除按钮(最左侧,红色) --> | ||||
|         <Button | ||||
|             android:id="@+id/btn_edit_delete" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="32dp" | ||||
|             android:background="@drawable/btn_delete_bg" | ||||
|             android:text="删除" | ||||
|             android:textColor="@android:color/white" | ||||
|             android:textSize="13sp" | ||||
|             android:paddingStart="15dp" | ||||
|             android:paddingEnd="15dp"/> | ||||
|  | ||||
|         <!-- 间隔(按钮间间距) --> | ||||
|         <View | ||||
|             android:layout_width="10dp" | ||||
|             android:layout_height="match_parent"/> | ||||
|  | ||||
|         <!-- ② 新增:取消按钮(中间,灰色,不保存返回简单视图) --> | ||||
|         <Button | ||||
|             android:id="@+id/btn_edit_cancel" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="32dp" | ||||
|             android:background="@drawable/btn_cancel_bg" | ||||
|             android:text="取消" | ||||
|             android:textColor="@android:color/white" | ||||
|             android:textSize="13sp" | ||||
|             android:paddingStart="15dp" | ||||
|             android:paddingEnd="15dp"/> | ||||
|  | ||||
|         <!-- 间隔 --> | ||||
|         <View | ||||
|             android:layout_width="10dp" | ||||
|             android:layout_height="match_parent"/> | ||||
|  | ||||
|         <!-- ③ 确定按钮(最右侧,蓝色,保存并返回简单视图) --> | ||||
|         <Button | ||||
|             android:id="@+id/btn_edit_confirm" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="32dp" | ||||
|             android:background="@drawable/btn_confirm_bg" | ||||
|             android:text="确定" | ||||
|             android:textColor="@android:color/white" | ||||
|             android:textSize="13sp" | ||||
|             android:paddingStart="15dp" | ||||
|             android:paddingEnd="15dp"/> | ||||
|  | ||||
|     </LinearLayout> | ||||
|  | ||||
| </LinearLayout> | ||||
|  | ||||
							
								
								
									
										39
									
								
								positions/src/main/res/layout/item_position_simple.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								positions/src/main/res/layout/item_position_simple.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- 简单视图:仅显示经纬度+备注,无任何按钮 --> | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="12dp" | ||||
|     android:background="@drawable/item_position_bg" | ||||
|     android:layout_marginBottom="8dp"> | ||||
|  | ||||
|     <!-- 经度 --> | ||||
|     <TextView | ||||
|         android:id="@+id/tv_simple_longitude" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textSize="14sp" | ||||
|         android:textColor="#666666"/> | ||||
|  | ||||
|     <!-- 纬度 --> | ||||
|     <TextView | ||||
|         android:id="@+id/tv_simple_latitude" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textSize="14sp" | ||||
|         android:textColor="#666666" | ||||
|         android:layout_marginTop="5dp"/> | ||||
|  | ||||
|     <!-- 备注(加粗突出) --> | ||||
|     <TextView | ||||
|         android:id="@+id/tv_simple_memo" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textSize="16sp" | ||||
|         android:textColor="#000000" | ||||
|         android:textStyle="bold" | ||||
|         android:layout_marginTop="8dp"/> | ||||
|  | ||||
| </LinearLayout> | ||||
|  | ||||
							
								
								
									
										9
									
								
								positions/src/main/res/menu/menu_item_edit.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								positions/src/main/res/menu/menu_item_edit.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <!-- 编辑菜单:点击后切换到编辑视图 --> | ||||
|     <item | ||||
|         android:id="@+id/menu_edit" | ||||
|         android:title="编辑" | ||||
|         android:orderInCategory="100" | ||||
|         android:showAsAction="never"/> <!-- 仅在菜单中显示,不显示在按钮栏 --> | ||||
| </menu> | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen