Android开发知识——开发中遇到的问题(2)

前言

以下内容为笔者在开发垃圾识别App时所遇到的实际问题及其解决方法,在此记录,与读者分享也供自己日后回顾。

1.ScrollView与ImageView共用导致出现大段空白

笔者在开发时,希望在一个界面下放入数目固定的几张图片供用户获取信息,并且由于图片较长所以采用ScrollView控件实现滑动。不过在实际开发时,却发现了滑动界面里出现了大段空白的问题。

解决方法

给ImageView设置属性:android:adjustViewBounds=“true”。

代码示例:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    android:adjustViewBounds="true"
    android:src="@drawable/guide_img_1" />

2.透明化系统栏时遇到的问题

笔者在开发时,希望能将系统栏设置为透明以便增加界面的美观性,笔者采用的透明化系统栏的方法为该博客中的第8点。可是在实际开发时出现了系统栏并未变为透明而是变成了灰色的问题。

解决方法

不能将android:fitsSystemWindows="true"属性添加在最外层布的局中,而应添加在距离实际控件最近的布局中。

3.百度地图定位不准确的问题

笔者在开发时,要用到地图的功能,而笔者采用的是百度地图(关于百度地图的使用请移步这里)。而在实际使用百度地图的定位功能时可能会出现定位不准确的情况。

解决方法

在初始化定位参数配置时,打开GPS并更改地图坐标系。

代码示例:

private void initLocation(){
        LocationClientOption option=new LocationClientOption();
        option.setScanSpan(5000);
        option.setIsNeedAddress(true);
        option.setOpenGps(true);//打开GPS
        option.setCoorType("bd09ll");如果不设置则默认使用gcj02坐标系 从而导致偏差
        client.setLocOption(option);
    }

4.改变Toolbar中title文字的位置

目前主流的开发方式中,一般情况下标题栏都会采用Toolbar的形式。不过Toolbar默认情况下的标题文字位置是在左侧的,而这就有可能影响到界面的美观性。那么该怎样改变Toolbar中title文字的位置呢?

解决方法

自定义Toolbar的标题文字。

代码示例:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="180dp"
    android:background="@drawable/timg">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:layout_gravity="center_horizontal"
        android:text="标题文字"
        android:textSize="30sp" />

</androidx.appcompat.widget.Toolbar>

补充:事实上,我们可以在Toolbar中放入任何控件,用以实现我们自定义的Toolbar。

5.Android apk方法数量超限

当我们在项目中引入大量jar包时,很有可能导致项目中的方法数超过65535(short int),此时运行项目可能就会报如下的错误:
在这里插入图片描述
解决方法

在gradle文件的defaultConfig默认配置里面增加:multiDexEnabled true

代码示例:

defaultConfig {
    minSdkVersion 19
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"
    
    multiDexEnabled true
}

6.一次性动态获取多种权限

在项目开发时,我们可能需要在软件第一次使用时获取多种权限,倘若每种权限都单独进行一次运行时权限处理,无疑会增加我们的代码量、也会影响后期的维护。

解决方法

我们可以用List来存储未被同意的权限,然后将List转换成String数组,再进行统一申请。

代码示例:

List<String> permissionList=new ArrayList<>();

//统计待审请的权限
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!permissionList.isEmpty()){
    String[] permission=permissionList.toArray(new String[permissionList.size()]);
    ActivityCompat.requestPermissions(getActivity(),permission,1);//统一申请
}else {
    requestLocation();
}

//统一处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == 1) {
        if (grantResults.length > 0) {
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getActivity(), "必须同意所有权限才能使用该功能", Toast.LENGTH_SHORT).show();
                    return;
                }
            }
            requestLocation();
        } else {
            Toast.makeText(getActivity(), "发生未知错误", Toast.LENGTH_SHORT).show();
        }
    }
}

7.碎片通过FragmentTransaction的add、hide等方法控制时的问题

1.与replace()方法的不同

add、hide、show等方法只会影响碎片视图的可见性并不会销毁View;而replace方法是先remove(Fragment),然后add(Fragment),这样会导致fragment的重新创建,因此可能会导致碎片的闪动问题。

2.生命周期及其状态变换时的回调方法

当碎片通过FragmentTransaction的add、hide等方法控制时,它将不再遵循普通碎片的生命周期及回调方法;而倘若我们想要在该碎片可见与不可见转换时进行相应操作,我们可以调用onHiddenChanged()方法。

代码示例:

@Override
public void onHiddenChanged(boolean hidden) {
    if(!hidden){
        //当碎片可见时调用
    }else {
        //当碎片不可见时调用
    }
}

8.module运行转app运行时的注意事项

1.AndroidManifest.xml的转变

在组件化开发时每一个module有两个AndroidManifest.xml文件,当要进行app下的运行时我们就需要把module运行下AndroidManifest.xml的权限申请、四大组件注册等等,全部转移到app运行下的AndroidManifest.xml中。此时需注意项目的包名已经发生了变化,因此项目中用到包名的地方也要跟着做出改变。

2.控件、文件、资源等的重名问题:

当我们在进行组件化开发前,一定要提前协商好防重名的措施(常见的防重名措施:各个组件的文件等命名时在名称前加上对应的组件名)。不然在app运行时很有可能导致资源或控件的调用错乱现象.

9.百度地图MapView控件导致其上控件显示不完整的问题

笔者最近在做百度地图相关开发时,想在MapView控件之上再加上一个可以滑动的控件。但当我滑动其上控件时,却有可能出现其上控件显示不完整的情况。

在笔者经过漫长的搜索和百度之后总算找到了解决方法,特在此记录之。

解决方法

将MapView控件换为TextureMapView控件。

代码展示:

<com.baidu.mapapi.map.TextureMapView
    android:id="@+id/map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true">
</com.baidu.mapapi.map.TextureMapView>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值