添加位置信息编辑功能

This commit is contained in:
ZhanGSKen
2025-09-30 01:54:11 +08:00
parent 72ba518c6d
commit dee9586748
15 changed files with 752 additions and 15 deletions

View File

@@ -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

View File

@@ -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();

View File

@@ -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();
}
}

View File

@@ -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;
}

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -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"

View 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>

View 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>

View 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>

View 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>

View 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>