Android开发的一些问题总结(持续更新)
标签搜索

Android开发的一些问题总结(持续更新)

Pop.Kite
2021-10-15 / 0 评论 / 165 阅读 / 正在检测是否收录...

Windows中 UI Automator Viewer 闪退

JDK版本不符合导致,本机应该装入JDK8,然后修改启动脚本中的jdk目录
原文件中

rem Check we have a valid Java.exe in the path.
set java_exe=
call ..\lib\find_java.bat
if not defined java_exe goto :EOF

修改为
rem Check we have a valid Java.exe in the path.

set JAVA_HOME=C:\DRIVERS\jdk8
set java_exe=%JAVA_HOME%/bin/java.exe
if not defined java_exe goto :EOF

Ubuntu 切换JDK版本

sudo update-alternatives --config java

无法安装apk到车机

提示The application could not be installed: INSTALL_FAILED_TEST_ONLY
gradle.properties中添加 android.injected.testOnly=false

retrofit2 Missing either @GET URL or @Url parameter.

@Get(".")
@Get("/")

javax.net.ssl.SSLHandshakeException

提示: Chain validation failed 异常解决
Fix the android communication time zone

使用脚本推送APK至终端并同步

  • 此方法需要已知进程名
  • 此方法需要在APK目录下执行
  • 欲kill某进程只需将 proc修改为目标进程的名字
  • 新建 push.sh文件粘贴以下内容,然后赋予可执行权限

    挂载

    adb remount

    推送APK

    adb push SystemUI.apk /vendor/app/SystemUI

    同步

    adb shell sync

    进程名

    proc=com.ts.systemui

    获取进程号,注意,Android原生shell没有awk

    pid= adb shell ps -ef| grep -ie $proc | awk '{print($2)}'
    echo "waiting"

    等待

    sleep 2

    杀死进程

    adb shell kill -9 $pid
    echo "well done"

动态设置控件布局属性

看代码。

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
lp.topMargin = R.dimen.anime_margin_top;
view.setLayoutParams(lp);

Manager类无法绑定Service

看看Service有没有在AndroidManifest.xml中注册...

AIDL报错

提示:no package ID was set...
编译SDK时报错上面的这句话,是说添加的依赖包没有设置成library,在模块的build.gradle下,把plugins内的id改成com.android.library并删除defaultConfig中的applicationId即可。

Fragment之间的切换

  • Fragment的切换可以通过replace、add、show和hide。
  • 使用replace切换Fragment时每次都会重新初始化fragment,没有保持fragment之前的状态。
  • 使用add切换Fragment时Fragment不会重新创建,是什么样子切换回来还是什么样子。
  • 当Fragment被add到FragmentManager后,可以通过hide隐藏/show显示。

通过上述几种切换Fragment的方式的描述可以定义各种切换方式的工作场景。
replace适用于当上一个Fragment不需要时候使用。
切换Fragment时候 先add目标Fragment,然后通过hide/show切换。
使用Show和Hide切换Fragment时,可以通过 onHiddenChange 方法监听Fragment的状态改变以达到修改Fragment生命周期的目的。

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        //TODO
    } else { 
        //TODO
    }
}

在Fragment中添加Fragment的话,如果要操作子Fragment需要getChildFragmentManager()而不是getSupportFragmentManager()
如果在添加Fragment时设置了TAG,则需要执行一遍getSupportFragmentManager().executePendingTransactions()
刷新一次Fragment的队列,否则可能无法通过TAG找到Fragment。

WindowManager报错 is your Activity Running

一般是布局参数layout_params的type属性值错误,再者是对于父类Activity的生命周期控制不当导致

按钮添加悬浮窗报错already has a parent

错误信息如下:
java.lang.RuntimeException: view com.google.android.material.button.MaterialButton{ab14860 VFED..C.. ...P..I. 0,0-506,168 #7f0801d2 app:id/button_add_view} being added, but it already has a parent
看代码,在设置按钮监听事件时,参数view和需要注入的视图view命名重复,把二者之一修改名字即可

private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
private View view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ···
    findViewById(R.id.button_add_view).setOnClickListener(view -> {
        windowManager.addView(view, layoutParams);
    });
    ···
}


安卓添加悬浮窗后退出应用时报错

安卓添加悬浮窗等Veiw时提示如下错误:
E/WindowManager : android.view.WindowLeaked: Activity com.tsaigee.listview.MainActivity has leaked window android.widget.LinearLayou that was originally added here
原因是在销毁Activity时没有移除添加的视图,在执行finish时移除视图即可

ListView设置Item的间距

在ListView的Item属性中设置Margin无效,可以在ListView的属性中声明分割线高度和颜色透明

   android:dividerHeight="10dp"
   android:divider="#00FFFFFF"

RecyclerView点击变色双击恢复

我们每次与RecyclerView的Item交互后执行notifyDataSetChanged(),会刷新所有position的Item。
思路
当我们点击一次Item,先比较当前Item的position和上次点击的positionChangeColor是否相同

  • 如果不同就将当前Item的position传递给positionChangeColor作为标志位。
  • 点击后会执行onBindViewHolder,当查询到position和positionChangeColor相同,改变该位置颜色,不同的位置恢复颜色
  • 如果相同表示该位置为二次点击,将positionChangeColor设置-1
  • 在执行onBindViewHolder时候会将该位置恢复颜色

代码示例:

@Override
public void onBindViewHolder(@NonNull MyVH holder, @SuppressLint("RecyclerView") int position) {
    //TextView setText
    holder.getTextContainer().setText(dataArrayList.get(position));
    //positionChangeColor Recorded which position was clicked
    //If position is equal to positionChangeColor, position change backgroundColor
    if (position == positionChangeColor)
        holder.itemView.setBackgroundColor(Color.RED);
    //If position is not equal to positionChangeColor,resume backgroundColor
    else
        holder.itemView.setBackgroundColor(Color.WHITE);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("NotifyDataSetChanged")
        @Override
        public void onClick(View view) {
            //If position is equal to positionChangeColor
            //This position is clicked for the second time,resume this position color
            if (positionChangeColor == position) {
                holder.itemView.setBackgroundColor(Color.WHITE);
                positionChangeColor = -1;
            }
            //If position is not equal to positionChangeColor,change this backgroundColor
            else
                positionChangeColor = position;
            notifyDataSetChanged();
        }
    });
}

ContentResolver 找不到URI

请求自定义ContentProvider提示URI相关错误,在Manifest.xml中application同级标签添加包名如下,再检查URI格式

<queries>
        <package android:name="com.example.contentprovider"/>
    </queries>

静态广播接受器无法接收广播

提示 Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers... 是因为安卓8.0以后对与manifest中注册的静态广播接收者进行了限制。需要在使用intent发送广播指定应用包名和类名

Intent intent = new Intent("com.tsaigee.boardcast.MY_BOARDCAST");
intent.setComponent(new ComponentName(this,MyBoardcastReceiver.class));
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendBroadcast(intent);
}
});
0

评论 (0)

取消