Android Studio开发记录

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)

参考博客:学习记录——Pytorch模型移植Android小例子_weixin_44438341的博客-CSDN博客_pytorch_androidhttps://blog.csdn.net/weixin_44438341/article/details/123897165

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

参考博客:创建java类中类出现is not an enclosing class_World_Data的博客-CSDN博客https://blog.csdn.net/cocochenqiuyue/article/details/70228562

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

参考博客:android studio数据的本地存储并读写_中华小帅仔的博客-CSDN博客_android studio 文件读写icon-default.png?t=M4ADhttps://blog.csdn.net/weixin_50878401/article/details/113246016

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值