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

Posted ABded

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发知识——开发中遇到的问题相关的知识,希望对你有一定的参考价值。

文章目录

前言

以下内容为笔者在开发垃圾识别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>

以上是关于Android开发知识——开发中遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android开发中遇到关于Byte位运算通信协议类项目的文档解读分析

android开发中遇到的问题汇总

js编程中经常遇到的一些问题(持续更新)

js编程中经常遇到的一些问题(持续更新)

Android--面试中遇到的问题总结

android开发中遇到的问题汇总