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)