Skip to content

Commit 76ad17e

Browse files
committed
优化文件选择器,支持单选
1 parent a1c1e57 commit 76ad17e

26 files changed

+2103
-646
lines changed

app/proguardMapping.txt

Lines changed: 1468 additions & 618 deletions
Large diffs are not rendered by default.

app/src/main/java/com/ichtj/basetools/MainActivity.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import com.ichtj.basetools.util.CustomButtonGridView;
7070
import com.ichtj.basetools.util.FKey;
7171
import com.ichtj.basetools.util.JXLExcelUtils;
72+
import com.ichtj.basetools.util.LoadingDialog;
7273
import com.ichtj.basetools.util.OptionTools;
7374
import com.ichtj.basetools.util.PACKAGES;
7475
import com.ichtj.basetools.util.POIExcelUtils;
@@ -167,6 +168,7 @@ public Map<Integer, String> getDisplayBtn() {
167168
btnList.put (FKey.KEY_QR_CODE, getString(R.string.main_qrcode_create));
168169
btnList.put (FKey.KEY_ORIENTATION, getString(R.string.main_screen_orientation));
169170
btnList.put (FKey.KEY_FILE_SELECT, getString(R.string.main_file_dialog_select));
171+
btnList.put (FKey.KEY_LOADDING_DIALOG, "加载中...");
170172
return btnList;
171173
}
172174

@@ -481,9 +483,32 @@ public void onItemClick(int position, String itemText) {
481483
public void onFileSelected(List<File> selected) {
482484
Log.d(TAG, "onFileSelected: "+selected);
483485
}
484-
}).setSizeRatio(0.3f,0.5f,30);
486+
}).setSizeRatio(0.3f,0.5f,30).setSingleSelect(true);
485487
fileDialogSelectUtils.show();
486488
break;
489+
case FKey.KEY_LOADDING_DIALOG:
490+
int[] frames = new int[] {
491+
R.drawable.ic_1,
492+
R.drawable.ic_2,
493+
R.drawable.ic_3,
494+
R.drawable.ic_4,
495+
R.drawable.ic_5,
496+
R.drawable.ic_6
497+
};
498+
499+
LoadingDialog loadingDialog = new LoadingDialog(this);
500+
501+
// 情况一:PNG 列表
502+
loadingDialog.setLoadingImages(frames, 100, 100, 1200);
503+
loadingDialog.showLoading();
504+
505+
// 情况二:仅一张图旋转
506+
// loadingDialog.setLoadingImages(new int[]{R.drawable.loading_icon}, 100, 100, 0);
507+
// loadingDialog.showLoading();
508+
509+
// 关闭时
510+
// loadingDialog.hideLoading();
511+
break;
487512
}
488513
}
489514

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package com.ichtj.basetools.network;
2+
3+
import android.app.AlertDialog;
4+
import android.content.Context;
5+
import android.graphics.Color;
6+
import android.graphics.Typeface;
7+
import android.graphics.drawable.ColorDrawable;
8+
import android.text.TextUtils;
9+
import android.view.Gravity;
10+
import android.view.View;
11+
import android.view.ViewGroup;
12+
import android.view.Window;
13+
import android.view.WindowManager;
14+
import android.widget.Button;
15+
import android.widget.EditText;
16+
import android.widget.LinearLayout;
17+
import android.widget.TextView;
18+
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
22+
import android.app.AlertDialog;
23+
import android.content.Context;
24+
import android.graphics.Typeface;
25+
import android.util.DisplayMetrics;
26+
import android.util.TypedValue;
27+
import android.view.Gravity;
28+
import android.view.View;
29+
import android.view.ViewGroup;
30+
import android.widget.*;
31+
32+
import androidx.core.content.ContextCompat;
33+
34+
import com.face_chtj.base_iotutils.DisplayUtils;
35+
import com.face_chtj.base_iotutils.RegularTools;
36+
import com.face_chtj.base_iotutils.ToastUtils;
37+
import com.ichtj.basetools.R;
38+
39+
import java.util.ArrayList;
40+
import java.util.List;
41+
42+
public class CustomDynamicDialog {
43+
private static int IP_COUNT=0;
44+
public interface OnConfirmListener {
45+
void onConfirm(List<String> inputs);
46+
}
47+
48+
public static void showDialog(Context context,String titleStr, OnConfirmListener listener) {
49+
IP_COUNT=0;
50+
AlertDialog.Builder builder = new AlertDialog.Builder(context,R.style.CustomDialogTheme);
51+
// 根布局
52+
LinearLayout rootLayout = new LinearLayout(context);
53+
rootLayout.setOrientation(LinearLayout.VERTICAL);
54+
rootLayout.setPadding(25, 25, 25, 25);
55+
56+
// ===== 1. 标题 =====
57+
TextView title = new TextView(context);
58+
title.setText(titleStr);
59+
title.setTextSize(18);
60+
title.setTypeface(null, Typeface.BOLD);
61+
title.setGravity(Gravity.START);
62+
LinearLayout.LayoutParams titleParams = new LinearLayout.LayoutParams(
63+
ViewGroup.LayoutParams.MATCH_PARENT,
64+
ViewGroup.LayoutParams.WRAP_CONTENT
65+
);
66+
titleParams.bottomMargin = 30;
67+
rootLayout.addView(title, titleParams);
68+
69+
// ===== 2. ScrollView + 输入框容器 =====
70+
ScrollView scrollView = new ScrollView(context);
71+
LinearLayout.LayoutParams scrollParams = new LinearLayout.LayoutParams(
72+
ViewGroup.LayoutParams.MATCH_PARENT,
73+
ViewGroup.LayoutParams.WRAP_CONTENT
74+
);
75+
76+
// 设置最大高度(如 400dp)
77+
int maxHeightPx = (int) TypedValue.applyDimension(
78+
TypedValue.COMPLEX_UNIT_DIP, 400,
79+
context.getResources().getDisplayMetrics()
80+
);
81+
scrollView.setLayoutParams(scrollParams);
82+
scrollView.setFillViewport(true);
83+
scrollView.setOverScrollMode(View.OVER_SCROLL_IF_CONTENT_SCROLLS);
84+
85+
// 限制 ScrollView 的最大高度
86+
scrollView.setVerticalScrollBarEnabled(true);
87+
scrollView.setLayoutParams(new LinearLayout.LayoutParams(
88+
ViewGroup.LayoutParams.MATCH_PARENT,
89+
maxHeightPx
90+
));
91+
92+
// 输入框容器
93+
LinearLayout inputContainer = new LinearLayout(context);
94+
inputContainer.setOrientation(LinearLayout.VERTICAL);
95+
scrollView.addView(inputContainer);
96+
97+
rootLayout.addView(scrollView);
98+
99+
TextView tvCount = new TextView(context);
100+
tvCount.setTextSize(23);
101+
102+
// 添加首个输入框
103+
addInputRow(context,tvCount, inputContainer);
104+
tvCount.setText(context.getString(R.string.net_record_ip_count,IP_COUNT+""));
105+
106+
// ===== 3. 底部按钮区域 =====
107+
LinearLayout buttonLayout = new LinearLayout(context);
108+
buttonLayout.setOrientation(LinearLayout.HORIZONTAL);
109+
buttonLayout.setGravity(Gravity.END);
110+
buttonLayout.setPadding(0, 40, 0, 0);
111+
112+
Button cancelBtn = new Button(context);
113+
cancelBtn.setText(R.string.dialog_cancel);
114+
cancelBtn.setTextSize(23);
115+
116+
Button confirmBtn = new Button(context);
117+
confirmBtn.setText(R.string.dialog_confirm);
118+
confirmBtn.setTextSize(23);
119+
120+
buttonLayout.addView(tvCount);
121+
buttonLayout.addView(cancelBtn);
122+
buttonLayout.addView(confirmBtn);
123+
rootLayout.addView(buttonLayout);
124+
125+
// ===== 4. 创建并显示 Dialog =====
126+
AlertDialog dialog = builder.setView(rootLayout).create();
127+
128+
cancelBtn.setOnClickListener(v -> dialog.dismiss());
129+
130+
confirmBtn.setOnClickListener(v -> {
131+
List<String> inputs = new ArrayList<>();
132+
for (int i = 0; i < inputContainer.getChildCount(); i++) {
133+
LinearLayout row = (LinearLayout) inputContainer.getChildAt(i);
134+
EditText et = (EditText) row.getChildAt(0);
135+
String etContent=et.getText().toString().trim();
136+
if (!TextUtils.isEmpty(etContent)){
137+
inputs.add(etContent);
138+
}
139+
}
140+
listener.onConfirm(inputs);
141+
dialog.dismiss();
142+
});
143+
dialog.show();
144+
Window window = dialog.getWindow();
145+
WindowManager.LayoutParams params = window.getAttributes();
146+
int[] size = DisplayUtils.getScreenSize(context);
147+
params.width = (int) (size[0] / 2);
148+
// params.height = (int) (size[1] / 4);
149+
window.setAttributes(params);
150+
}
151+
152+
// 添加一个输入框行(EditText + [+]按钮)
153+
private static void addInputRow(Context context,TextView tvCount, LinearLayout container) {
154+
LinearLayout row = new LinearLayout(context);
155+
row.setOrientation(LinearLayout.HORIZONTAL);
156+
row.setGravity(Gravity.CENTER_VERTICAL);
157+
row.setPadding(0, 20, 0, 0);
158+
159+
EditText editText = new EditText(context);
160+
editText.setHint("请输入内容");
161+
editText.setTextSize(28);
162+
editText.setLayoutParams(new LinearLayout.LayoutParams(
163+
0, ViewGroup.LayoutParams.WRAP_CONTENT, 1f
164+
));
165+
166+
Button addBtn = new Button(context);
167+
addBtn.setText("+");
168+
addBtn.setTextSize(28);
169+
170+
Button reduceBtn = new Button(context);
171+
reduceBtn.setText("-");
172+
reduceBtn.setTextSize(28);
173+
174+
addBtn.setOnClickListener(v -> {
175+
if (RegularTools.isValidIpOrUrl(editText.getText().toString())){
176+
addBtn.setVisibility(View.GONE); // 隐藏当前按钮
177+
reduceBtn.setVisibility(View.GONE); // 隐藏当前按钮
178+
addInputRow(context,tvCount, container); // 添加新行
179+
tvCount.setText(context.getString(R.string.net_record_ip_count,IP_COUNT+""));
180+
}else{
181+
ToastUtils.error("输入格式错误!");
182+
}
183+
});
184+
185+
reduceBtn.setOnClickListener(v -> {
186+
if (IP_COUNT>1){
187+
int index = container.indexOfChild(row);
188+
container.removeView(row);
189+
IP_COUNT--;
190+
tvCount.setText(context.getString(R.string.net_record_ip_count, IP_COUNT + ""));
191+
192+
// 如果被删的是最后一行,恢复上一行的按钮
193+
int childCount = container.getChildCount();
194+
if (childCount > 0 && index - 1 >= 0 && index == childCount) {
195+
LinearLayout prevRow = (LinearLayout) container.getChildAt(index - 1);
196+
View prevAddBtn = prevRow.getChildAt(1);
197+
View prevReduceBtn = prevRow.getChildAt(2);
198+
prevAddBtn.setVisibility(View.VISIBLE);
199+
prevReduceBtn.setVisibility(View.VISIBLE);
200+
}
201+
}
202+
});
203+
204+
row.addView(editText);
205+
row.addView(addBtn);
206+
row.addView(reduceBtn);
207+
container.addView(row);
208+
IP_COUNT++;
209+
}
210+
}

app/src/main/java/com/ichtj/basetools/network/NetRecordAty.java

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,39 @@
66
import android.content.DialogInterface;
77
import android.content.Intent;
88
import android.content.ServiceConnection;
9+
import android.graphics.Paint;
10+
import android.graphics.Typeface;
11+
import android.net.ConnectivityManager;
912
import android.os.Bundle;
1013
import android.os.IBinder;
14+
import android.text.Html;
1115
import android.text.method.ScrollingMovementMethod;
16+
import android.util.Log;
17+
import android.view.Gravity;
1218
import android.view.View;
19+
import android.view.ViewGroup;
1320
import android.widget.Button;
1421
import android.widget.EditText;
22+
import android.widget.LinearLayout;
1523
import android.widget.TextView;
24+
import android.widget.Toast;
1625

1726
import androidx.annotation.Nullable;
1827

1928
import com.alibaba.android.arouter.facade.annotation.Route;
29+
import com.face_chtj.base_iotutils.DialogUtils;
2030
import com.face_chtj.base_iotutils.FormatViewUtils;
31+
import com.face_chtj.base_iotutils.GlobalDialogUtils;
2132
import com.face_chtj.base_iotutils.KLog;
2233
import com.face_chtj.base_iotutils.NetUtils;
2334
import com.face_chtj.base_iotutils.ObjectUtils;
35+
import com.face_chtj.base_iotutils.RegularTools;
2436
import com.face_chtj.base_iotutils.SPUtils;
2537
import com.face_chtj.base_iotutils.ToastUtils;
38+
import com.face_chtj.base_iotutils.callback.IDialogCallback;
39+
import com.face_chtj.base_iotutils.view.OnPopupItemClickListener;
40+
import com.face_chtj.base_iotutils.view.PopupWindowTools;
41+
import com.ichtj.basetools.MainActivity;
2642
import com.ichtj.basetools.R;
2743
import com.ichtj.basetools.StartPageAty;
2844
import com.ichtj.basetools.base.BaseActivity;
@@ -66,6 +82,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
6682
btnClear.setOnClickListener(this);
6783
tvPingAddr = findViewById(R.id.tvPingAddr);
6884
tvPingAddr.setOnClickListener(this);
85+
tvPingAddr.setPaintFlags(tvPingAddr.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
6986
btnClearCount = findViewById(R.id.btnClearCount);
7087
btnClearCount.setOnClickListener(this);
7188
tvDbm = findViewById(R.id.tvDbm);
@@ -97,7 +114,7 @@ private void showItemSelectionDialog() {
97114
}
98115
}
99116
AlertDialog.Builder builder = new AlertDialog.Builder(this);
100-
builder.setTitle("Select DNS");
117+
builder.setTitle(R.string.net_record_dns_title);
101118
builder.setMultiChoiceItems(NetUtils.getDnsList(), selectedItems, new DialogInterface.OnMultiChoiceClickListener() {
102119
@Override
103120
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
@@ -118,7 +135,7 @@ public void onClick(DialogInterface dialog, int which) {
118135
if (selectedItemsList.size() > 0) {
119136
timerService.replacePingDns(selectedItemsList.toArray(new String[0]));
120137
}else{
121-
ToastUtils.error("至少选择一个进行网络测试!");
138+
ToastUtils.error(getString(R.string.net_record_more_than_one));
122139
}
123140
}
124141
});
@@ -169,7 +186,18 @@ public void refreshNet(NetBean netBean) {
169186
// String dnsResult = FormatViewUtils.formatUnderline (R.color.blue, Arrays.toString(netBean.pingDns));
170187
FormatViewUtils.formatData(tvResult, /*"dns:" + dnsResult + */"dns:" + Arrays.toString(netBean.pingResult) + ", dbm:" + netBean.dbm + ", localIp:" + netBean.localIp + ", netType:" + netBean.netType + ", On4G:" + netBean.isNet4G + ", netResult:" + netConnectResult,"yyyyMMddHHmmss");
171188
tvDbm.setText("信号:" + netBean.dbm);
172-
tvPingAddr.setText("DNS地址:" + Arrays.toString(netBean.pingDns));
189+
String content=getString(R.string.net_record_in_dns,Arrays.toString(netBean.pingDns));
190+
setTextWithLimit(tvPingAddr,content,25);
191+
}
192+
193+
public static void setTextWithLimit(TextView textView, String content, int maxLength) {
194+
content=content.replace("[","").replace("]","");
195+
if (content.length() > maxLength) {
196+
String truncated = content.substring(0, maxLength - 1) + "………"; // 中文省略号也可以用
197+
textView.setText(truncated);
198+
} else {
199+
textView.setText(content);
200+
}
173201
}
174202

175203
@Override
@@ -196,7 +224,26 @@ public void onClick(View v) {
196224
timerService.clearCount();
197225
break;
198226
case R.id.tvPingAddr:
199-
showItemSelectionDialog();
227+
List<String> options = Arrays.asList("自定义", "内部列表");
228+
PopupWindowTools.showDropdownPopup(this, tvPingAddr, options, new OnPopupItemClickListener() {
229+
@Override
230+
public void onItemClick(int position, String itemText) {
231+
// 这里你可以接收到点击项的 position 和文本
232+
if (position==0){
233+
CustomDynamicDialog.showDialog(NetRecordAty.this, "请输入IP", new CustomDynamicDialog.OnConfirmListener() {
234+
@Override
235+
public void onConfirm(List<String> inputs) {
236+
if (inputs!=null&&inputs.size()>0){
237+
Log.d(TAG, "onConfirm: ipList>>"+inputs);
238+
timerService.replacePingDns(inputs.toArray(new String[0]));
239+
}
240+
}
241+
});
242+
}else{
243+
showItemSelectionDialog();
244+
}
245+
}
246+
});
200247
break;
201248
case R.id.btnClear:
202249
tvResult.setText("");

0 commit comments

Comments
 (0)