Android Studio开发过程中遇到很多问题,自己开个贴记录一下以防将来再次遇到。
问题记录的顺序完全是自己遇到问题的顺序,且由2022.5.21开始记录。
1.Fragment中使用SharedPreferences
private EditText messageEdit;
private SharedPreferences pref;
//和Activity中使用SharedPreferences方式有所区别
pref= getActivity().getSharedPreferences("ConfRecord",Context.MODE_PRIVATE);
messageEdit = (EditText) view.findViewById(R.id.message);
//将数据写入EditText
String message=pref.getString("message","");
messageEdit.setText(message);
//数据写入SharedPreferences
private SharedPreferences.Editor editor;
editor=pref.edit();
editor.putString("message",message);
2.Fragment四周留白
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
<!-- 删除下一句即可-->
android:padding="?attr/listPreferredItemPaddingRight"
/>
3.图标
阿里巴巴矢量图库
iconfont-阿里巴巴矢量图标库https://www.iconfont.cn/
4.WLAN连接性
以 Android 10 或更高版本为目标平台的应用无法启用或停用 WLAN。
(楼主前后就wifi问题调试了近千行代码,结果。。。。)
因为WifiManager.setWifiEnabled()方法始终返回false,最简单的解决方式直接使用Settings.Panel
//打开WLAN设置
/*
第三个参数:
ACTION_INTERNET_CONNECTIVITY,显示与互联网连接相关的设置,例如飞行模式、WLAN 和移动数据。
ACTION_WIFI,显示 WLAN 设置,但不显示其他连接设置。
ACTION_NFC,显示与近距离无线通信 (NFC) 相关的所有设置。
ACTION_VOLUME,显示所有音频流的音量设置。
*/
Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
startActivity(panelIntent);
5.SMS
SMS需要申请的权限是危险权限,需要动态申请,用户同意后才能获取。
在AndroidManifest中配置后还需在代码中动态申请。
if (ContextCompat.checkSelfPermission(Classification.this,
Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){
// 没有获得授权,申请授权
if (ActivityCompat.shouldShowRequestPermissionRationale(Classification.this,
Manifest.permission.SEND_SMS)) {
// 弹窗需要解释为何需要该权限,再次请求授权
Toast.makeText(Classification.this, "请授权!", Toast.LENGTH_LONG).show();
// 帮跳转到该应用的设置界面,让用户手动授权
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}else{
// 不需要解释为何需要该权限,直接请求授权
ActivityCompat.requestPermissions(Classification.this,
new String[]{Manifest.permission.SEND_SMS},
MY_PERMISSIONS_REQUEST_SEND_SMS);
}
}
6.PyCharm训练模型移植Android
实测pt文件在AS中无法运行,ptl文件可以。
此处注意:导出模型使用的Pytorch版本必须与Android项目使用的pytorch_andorid_lite包的版本一致。
模型导出:
import os
import torch
from torch.utils.mobile_optimizer import optimize_for_mobile
from model import resnet34 # 自己的模型
model_pth = './resNet34.pth'
mobile_ptl = './model.ptl'
model = resnet34(num_classes=2)
pre_weights = torch.load(model_pth, map_location='cpu')
model.load_state_dict(pre_weights, strict=True)
device = torch.device('cpu')
model.to(device)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module_optimized = optimize_for_mobile(traced_script_module)
traced_script_module_optimized._save_for_lite_interpreter(mobile_ptl)
7.程序等待
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
return;
}
8.程序退出
System.exit(0);
9.EditText设置字数限制
android:maxLength="20"
10.报错:"xxxxx"is not an enclosing class
没有static的类中类不能使用外部类操作.
SMSActivity con_sms = new SMSActivity();
/*
*/
private myMessage m_message = con_sms.new myMessage();
11.Fragment中使用runOnUiThread()
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() { Toast.makeText(getActivity().getApplicationContext(),"hello world!",Toast.LENGTH_LONG).show();
}
});
12.在Fragment中启动另一个Fragment
getActivity().getSupportFragmentManager()
.beginTransaction()
/* R.id.container 是对应Activity中FrameLayout的id
* new testfragment()是新启动的fragment
* 最后一个参数,addToBackStack(null):可以省略不写,不写表示为非压栈式添加*/
.replace(R.id.container, new testfragment(), null)
.addToBackStack(null)
.commit();
13.EditText显示只输入数字
android:inputType="number|numberDecimal"
14.Fragment重叠问题
由于设置的是白底,所以一开始没发现。后来发现新fragment依然可以点击上一个fragment位置的Edittext。
查代码发现是用的
transaction.add(R.id.container, fragment).commit();
这会导致重叠
用replace可以解决
getSupportFragmentManager().beginTransaction().replace(R.id.container, new ImageFragment()).commitAllowingStateLoss();
15.震动
/* Activity */
Vibrator vibrator = (Vibrator)this.getSystemService(this.VIBRATOR_SERVICE);
vibrator.vibrate(1000);
/* Fragment */
Vibrator vibrator = (Vibrator)getActivity().getSystemService(getActivity().VIBRATOR_SERVICE);
vibrator.vibrate(1000);
16.报警提示音
private MediaPlayer mediaPlayer;//音频控制
/* */
//alert1为播放的文件
mediaPlayer = MediaPlayer.create(getActivity(), R.raw.alert1);
// 设置成可以循环播放
mediaPlayer.setLooping(true);
mediaPlayer.start();
17.读取文件
private String ReadRecord(){
String string_record = null;
try{
FileInputStream fis = getActivity().openFileInput("History");//与写入对应写入时起的文件名,这里用写入时的名字读取的就是写入时的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1){
baos.write(buffer,0,len);
}
string_record = baos.toString();//将文件数据赋值给变量content,变量可在你需要且合适的地方定义
fis.close();
}catch (Exception e){
e.printStackTrace();
}
return string_record;
}
18.MODE_APPEND和MODE_PRIVATE
MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
19.将string按行分别读出
String mRecord = ReadRecord();
String[] lines = mRecord.split("\\r?\\n");
20.RecyclerView倒序显示
/*
private MyAdapter mAdapter;
private List<String> mDataList;
mDataList = new ArrayList<String>();
String[] lines = mRecord.split("\\r?\\n");
for (String line : lines) {
mDataList.add(line);
}
*/
Collections.reverse(mDataList);
mRecyclerView.setAdapter(mAdapter);