1.跳转到选择文件界面
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, 1);
2.重写选择文件后的回调(这里只读excel文件)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 1) {
String path;
Uri uri = data.getData();
if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
path = uri.getPath();
// Toast.makeText(this, path , Toast.LENGTH_SHORT).show();
return;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
path = Util.getPath(this, uri);
// Toast.makeText(this, path, Toast.LENGTH_SHORT).show();
} else {//4.4以下下系统调用方法
path = Util.getRealPathFromURI(uri,TagSearchActivity.this);
// Toast.makeText(VisitorInfoAddActivity.this, path , Toast.LENGTH_SHORT).show();
}
if(path==null||path.isEmpty()||!path.endsWith("xls") ){
Toast.makeText(TagSearchActivity.this,"请选择Excel文件",Toast.LENGTH_SHORT);
return;
}else{
epcList=new ArrayList<>();
tagAdapter.reSet(epcList);
//开Task读文件
String[] args=new String[1];
args[0]=path;
frt=new FileReaderTask();
frt.execute(args);
}
}
}
}
3.编写FileReaderTask内部类读取文件
class FileReaderTask extends AsyncTask<String, Integer, List<String>> {
private static final int SUCESS = 0; //成功
private static final int FAIL = -1; //文件打开失败
private static final int File_TYPE_OTHER =-1; //XLS 文件
private static final int File_TYPE_XLS =1; //XLS 文件
private static final int File_TYPE_XLSX =2; //XLSx 文件
private int status=SUCESS; //当前状态,执行过程中随时更新
private String msg=""; //错误信息
StringBuilder warnInfo=new StringBuilder() ; //提示信息
@Override
protected void onPreExecute() {
super.onPreExecute();
loadingDialog.show();
isReading=true;
}
@Override
protected List<String> doInBackground(String... paths) {
List<String> ret=new ArrayList<>();
int fileType=File_TYPE_OTHER; //当前文件类型
try {
Workbook workbook = Workbook.getWorkbook(new File(paths[0]));
Sheet rs = workbook.getSheet(0);
int rowsCount = rs.getRows();//总行数
for (int r = 0; r < rowsCount; r++) {
Cell c = rs.getCell(0, r);
String epc = c.getContents();
if(epc.equals("")){
continue;
}
if(ret.contains(epc)){
warnInfo.append("已合并多条数据:"+epc+"\n");
continue;
}
ret.add(epc);
}
return ret;
}catch(BiffException e){
status=FAIL;
msg="仅支持97-03 xls格式的Excel";
return new ArrayList<>();
}catch (Exception e){
status=FAIL;
msg=e.getMessage();
return new ArrayList<>();
}finally{
// if(stream!=null)try{stream.close();}catch(Exception e){}
}
}
@Override
protected void onCancelled(List<String> visitors) {
}
@Override
protected void onPostExecute(List<String> ret) {
if(loadingDialog.isShowing()){
loadingDialog.dismiss();
}
isReading=false;
if(isCancelled()==false) {
if (status != SUCESS) { //处理失败
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
} else {
epcList=ret;
tagAdapter.reSet(epcList);
if (warnInfo.length() > 0) {
showWarn(warnInfo.toString());
}
}
}
}
};
4.在手机默认自动旋转模式下,从文件中读取数据并加载到页面后,横置手机后,页面也横置了,然后数据消失了。只需在AndroidManifest.xml添加如下代码可解决

为什么会出现这种情况呢?
页面横置后,Android会默认重新调用Activity的onCreate方法,如果你的onCreate方法里修改了tagList集合,就会出现横置页面后,数据丢失的现象了,代码
android:windowSoftInputMode="adjustResize|stateHidden"
就是控制页面横置后不重新调用onCreate方法
参考:Android 设定横屏,禁止屏幕旋转,Activity重置
https://blog.csdn.net/u012364372/article/details/51088831/
本文介绍了如何在Android应用中选择文件,特别是读取Excel文件,并加载数据到界面。当设备横置时,数据意外消失的问题通过在AndroidManifest.xml中添加特定代码得到解决,避免了页面横置时onCreate方法被重新调用导致的数据丢失现象。
583

被折叠的 条评论
为什么被折叠?



