龙湖风景 發表於 2019-8-7 11:16:00

Android开发走过的坑(持续更新)

<p>1 华为 nova真机 打印不出Log</p>
<p>参考资料:http://www.apkbus.com/thread-585228-1-1.html</p>
<p>解决:针对权限问题,我们当然也可以解决的,华为手机在你的拨号界面,请拨*#*#2846579#*#*,我们就进入了工程菜单,接下来我们就可以操作了。点击ProjectMenu,进入后台设置,很容易看到的就是LOG设置。进入LOG设置,将AP日志打钩并关闭,或许你还有顾虑,那你就全部选中然后关闭,然后重新启动手机。</p>
<p>2&nbsp;AS 在用vivo x9手机运行程序时,出现“解析软件包时出现问题”的问题。</p>
<p>参考资料:https://blog.csdn.net/wl521124/article/details/80558155</p>
<p>解决方法:</p>
<p>打开as 的setting界面,把instant run 界面的 enable 前面的√去掉,如下图:</p>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/blog/1481953/201908/1481953-20190808182636984-1521162088.png"></p>
<p>&nbsp;</p>
<p>3 launching app client not ready yet</p>
<p>新建工程时,打包运行,没有打包,也没有报错,提示&nbsp;launching app client not ready yet</p>
<p>这个是一个很低级的错误,因为我新建工程时选择的是no activity, java文件下都没有代码,能打包成功才怪呢,估计只有像我这种菜鸟才犯这样的低级错误吧。老鸟也是一个坑一个坑过来的,这就是成长吧</p>
<p>从新建了一个工程,这次选的是empty activity, 这样再打包运行就可以了</p>
<p>&nbsp;</p>
<p>4 kotlin定时器的使用</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">var</span> mCompositeDisposables: CompositeDisposable? = <span style="color: rgba(0, 0, 255, 1)">null</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> disposable = Observable.timer(<span style="color: rgba(128, 0, 128, 1)">800</span><span style="color: rgba(0, 0, 0, 1)">, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread()).subscribe{mAdapter.notifyDataSetChanged()}
            mCompositeDisposables</span>?.addAll(disposable)</pre>
</div>
<p>上面代码表示延迟执行mAdapter.notifyDataSetChanged() 800ms</p>
<p>&nbsp;</p>
<p>5 用Java代码改变xml布局中的margin&nbsp;</p>
<div class="cnblogs_code">
<pre>ViewGroup.MarginLayoutParams layoutParams =<span style="color: rgba(0, 0, 0, 1)"> (ViewGroup.MarginLayoutParams)plSupport.getLayoutParams();
                        layoutParams.bottomMargin </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
                        plSupport.setLayoutParams(layoutParams);</span></pre>
</div>
<p>&nbsp;方法二:</p>
<div class="cnblogs_code">
<pre>ImageView image =<span style="color: rgba(0, 0, 0, 1)"> (ImageView) findViewById(R.id.main_image);
RelativeLayout.LayoutParams lp </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RelativeLayout.LayoutParams(image.getLayoutParams());
lp.setMargins(</span>50, 100, 0, 0<span style="color: rgba(0, 0, 0, 1)">);
image.setLayoutParams(lp);</span></pre>
</div>
<p>参考:Android,View设置margin</p>
<p>6&nbsp;本地打包是好的,jenkins打包有一个弹窗显示和本地打包显示的不一样</p>
<p>原因:定义的bean类没实现 basebean 导致解析不了</p>
<p>解决,定义的bean类实现 basebean</p>
<p>&nbsp;</p>
<p>7 Namwspace 'app' is not bound</p>
<p>主要的问题是根节点少了一个声明。</p>
<p>xmlns:app="http://schemas.android.com/apk/res-auto"</p>
<p>参考:https://blog.csdn.net/mr_hjy/article/details/87436179</p>
<p>&nbsp;</p>
<p>8 用Java改变TextView中的textStyle</p>
<p>例 字体加粗</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">xxx.setTypeface(null, Typeface.BOLD);
</pre>
</div>
<p>&nbsp;</p>
<p>9 Java 自定义路由</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">try {
                JSONObject param = new JSONObject();
                param.put("selectTopic", true);
                JSONObject data = new JSONObject();
                data.put("name", "topic_list");
                data.put("param", param);
                JSONObject route = new JSONObject();
                route.put("page", "flutter");
                route.put("data", data);
                .jump(route);
            }catch (Exception e){
                e.printStackTrace();
}
</pre>
</div>
<p>&nbsp;</p>
<p>10 Android开发神器 Pandora</p>
<p>将pandora集成后,app只需摇一摇即可出现工具箱,包含ui、网络、沙盒(数据库等)、选择控件等功能</p>
<p>&nbsp;</p>
<p>11 命令行编辑</p>
<p>./gradlew build (或者执行 ./gradlew assembleEnvtest 只打包测试版本)</p>
<p>cd build/outputs/apk/debug</p>
<p>adb install -r app-debug.apk 安装</p>
<p>&nbsp;</p>
<p>12&nbsp;【android】AudioManager音量控制</p>
<p>//音量控制,初始化定义</p>
<p>AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);</p>
<p>//最大音量</p>
<p>int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);</p>
<p>//当前音量</p>
<p>int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);</p>
<p>&nbsp;</p>
<p>直接控制音量的多少:</p>
<p>&nbsp;</p>
<p>if(isSilent){</p>
<p>&nbsp; mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);</p>
<p>}else{</p>
<p>&nbsp; mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, tempVolume, 0); //tempVolume:音量绝对值</p>
<p>}</p>
<p>&nbsp;</p>
<p>13&nbsp;AudioManager(音频管理器)</p>
<p>https://www.runoob.com/w3cnote/android-tutorial-audiomanager.html<br><br></p>
<p>14&nbsp;大家对HttpUrlConnection这个类并不陌生,它处于java.net包下的,是JDK支持的。它主要用来服务器端发送Http请求</p>
<p>&nbsp;</p>
<p>15 EventBus发消息所在文件,不用注册EventBus,如果注册了EventBus,没有接受,就会报错</p>
<p>EventBusException: Subscriber class *** and its super classes have no public methods with the @Subsc</p>
<p>&nbsp;</p>
<p>16 ScrollView下轮播图片加载不出来,原因是ScrollView下只有一个轮播组件</p>
<p>结局:ScrollView下放一个RelativeLayout或者LinearLayout,再把轮播组件放到RelativeLayout内</p>
<p>&nbsp;</p>
<p>注意:<code>ScrollView</code>的子元素只能有一个,可以是一个<code>View</code>(如<code>ImageView</code>、<code>TextView</code>等) 也可以是一个<code>ViewGroup</code>(如<code>LinearLayout</code>、<code>RelativeLayout</code>等),其子元素内部则不再限制,否则会报以下异常。</p>
<p>&nbsp;</p>
<p>17 adb导出手机日志</p>
<p>1 adb devices 看看有没有连接成功手机</p>
<p>2 adb logcat -d &gt; log.txt 已log.txt文件名保存&nbsp;</p>
<p>&nbsp;</p>
<p>18&nbsp;在Android开发中,常常需要调用对话框,但会遇到这样一种情况,在显示对话框的时候,点击对话框以外的屏幕其他区域,会关闭对话框。以下是解决该问题的设置:</p>
<div>&nbsp;</div>
<div>AlertDialog.Builder builder = new AlertDialog.Builder(context);</div>
<p>&nbsp;<br>//不关闭写法<br>builder.setCancelable(false);&nbsp;<br>&nbsp;<br>//关闭写法<br>builder.setCancelable(true);&nbsp;</p>
<p>参考:https://blog.csdn.net/xiaohei5188/article/details/16827709</p>
<p>&nbsp;</p>
<p>19 ImageView实现圆角效果</p>
<p>方法一:使用CardView包裹ImageView, CardView可以设置圆角</p>
<p>方法二:自定义CustomImageView继承ImageView实现圆角效果</p>
<p>如果想单独设置左上角,右上角2个角是圆角,另外2个角不是圆角,就要使用自定义CustomImageView</p>
<p>坑:为什么使用自定义CustomImageView设置的圆角不起作用,原因是高度和宽度用的是match_parent, 把高度和宽度设置成固定值就起作用了</p>
<p>&nbsp;</p>
<p>20 android 重构</p>
<p>参考1:&nbsp;https://www.jianshu.com/p/28dc6e3ef59e</p>
<p>参考2:http://www.imooc.com/article/4095</p>
<p>android编码规范,参考:https://www.jianshu.com/p/f5a55dff62f0</p>
<p>&nbsp;</p>
<p>21 AS 编译失败,可以删除android包下的.idea问价,然后重新build试试</p>
<p>&nbsp;</p>
<p>22 透明度渐变动画</p>
<p>     //fromAlpha &nbsp; 动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //toAlpha &nbsp; &nbsp; &nbsp; 动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alphaAnimation = new AlphaAnimation(0, 1);</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alphaAnimation.setDuration(2000);</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tvDemo.startAnimation(alphaAnimation);</p>
<p>&nbsp;</p>
<p>23 TextView 代码中设置字体加粗</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> (info.getMsgstatus() == 1<span style="color: rgba(0, 0, 0, 1)">) {
    holder.contentText.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">加粗</span>
}<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
    holder.contentText.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">常规</span>
}</pre>
</div>
<p>参考&nbsp;https://blog.csdn.net/qq_33650812/article/details/76670224</p>
<p>&nbsp;</p>
<p>24 设置TextView字体颜色</p>
<p>一、通过配置文件XML写入属性</p>
<p>&lt;.......android:color="#FFFFFF"/&gt;&nbsp;<br>&lt;.......android:color="@color/colorPrimary"/&gt;&nbsp; //从colors.xml读取键值<br>二、在Activity内设置</p>
<p>tv.setTextColor(0xFFFFFFFF);//前面看帖子给的是0xFFFFFF,后面用Color.GRAY才发现,Android Studio里面显示应该是8个16位数,大家输入的时候需要小心<br>tv.setTextColor(Color.GRAY); //使用Color的常数<br>tv.setTextColor(Color.rgb(255, 255, 255)); //用Color的rgb进行转换<br>tv.setTextColor(Color.parseColor("#FF0000"));&nbsp; //用Color的parseColor进行转换<br>tv.setTextColor(Context.getResources().getColor(R.color.colorPrimary));//通过获取上下文,进行获取colors.xml内配置的值,一定要配置好Context<br>————————————————<br>参考:https://blog.csdn.net/sharpeha/article/details/89485353</p>
<p>&nbsp;</p>
<p>24 获取TextView的行数</p>
<p>网上搜资料查到可以通过textView.getLineCount()获取,但是获取不到</p>
<p>下面方法可以获取:<br>1 首先定义一个StaticLayout staticLayout</p>
<p>2 新建StaticLayout实例</p>
<p>3 通过staticLayout.getLineCount()获取</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> StaticLayout staticLayout;
   
staticLayout </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> StaticLayout(item.getName(), tvName.getPaint(), width, Layout.Alignment.ALIGN_NORMAL, 1, 0, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">int</span> lineCount = staticLayout.getLineCount()</pre>
</div>
<p>&nbsp;</p>
<p>25 android 启动页的配置</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">intent-filter</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
          <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">action </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.intent.action.MAIN"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

          <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">category </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.intent.category.LAUNCHER"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">intent-filter</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                  </pre>
</div>
<p>&nbsp;</p>
<p>26&nbsp;Unable to add window -- token null is not valid; is your activity running?</p>
<p>在调用PopupWindow或者Dialog时,PopupWindow需要依附在一个当前创建好的Activity,如果所依赖的Activity不在running,就会出现上面的问题,解决方法有3个,可以一个一个试</p>
<p>1)使用的Context对象不对,使用了getApplicationContext(),解决方法用当前Activity.this替代getApplicationContext()</p>
<p><code>YourActivityName.this</code>&nbsp;instead of&nbsp;<code>getApplicationContext()</code>&nbsp;at</p>
<p><code>Dialog dialog = new Dialog(getApplicationContext());</code></p>
<p>2)有可能当前Activity还没有渲染完成就调用,使用Handler增加一个延时可以解决,参考https://www.cnblogs.com/mochaMM/p/5098343.html</p>
<p>3)重写onWindowFocusChanged方法,参考https://blog.csdn.net/wuzhipeng1991/article/details/38656967</p>
<p>&nbsp;</p>
<p>27 AS大小写切换键</p>
<p>大小写切换</p>
<p>Ctrl+Shift+U</p>
<p>&nbsp;</p>
<p>28&nbsp;&nbsp;java.lang.IllegalStateException</p>
<p>使用Rxjava导致的内存泄漏导致的问题</p>
<div>rxjava虽然好用,但是总所周知,容易遭层内存泄漏。也就说在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable便是这个订阅事件,可以用来取消订阅。</div>
<p>参考<br>链接:https://www.jianshu.com/p/2a882604bbe8<br><br></p>
<p>&nbsp;</p>
<p>29 java float转int,直接舍去小数后面的数字,不是四舍五入,注意,防止入坑</p>
<p>&nbsp;</p>
<p>30 安装zsh后adb每次都要重新运行source ~/.bash_profile才可以使用,解决方法,在.zshrc文件的第一行加入source ~/.bash_profile,就可以解决这个问题</p>
<p>&nbsp;</p>
<p>31&nbsp;AIDL(Android Interface Definition Language)</p>
<p>&nbsp;</p>
<p>32&nbsp;</p>
<p>当代码库远程迁移后,修改本地代码关联的远程地址</p>
<div class="_2Uzcx_">&nbsp;
<div class="cnblogs_code">
<pre>git remote set-url origin http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">jcode.cbpmgt.com/git/&lt;your rep name&gt;.git/</span></pre>
</div>
<p>&nbsp;</p>
<p>33&nbsp;</p>
<h1 id="articleContentId" class="title-article">java中设置ImageView的src</h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span>(view <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> ImageView){
   ((ImageView)view).setImageResource(</span>getResources().getDrawable(R.drawable.xxx)</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置背景用:</span> <span style="color: rgba(0, 0, 0, 1)"> viewgroup.setBackgroundResource(background);</span></pre>
</div>
<p>&nbsp;</p>
<p>34</p>
<div>switch case种不能对null进行switch,否则会出现
<div class="cnblogs_code">
<pre>Attempt to invoke <span style="color: rgba(0, 0, 255, 1)">virtual</span> method <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">int java.lang.String.hashCode()</span><span style="color: rgba(128, 0, 0, 1)">'</span> on a <span style="color: rgba(0, 0, 255, 1)">null</span> <span style="color: rgba(0, 0, 255, 1)">object</span> reference</pre>
</div>
<p>&nbsp;</p>
<p>35 GridView设置左右边距都为16,例如有4列</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
         *gridView的item左右边距都是16,item居中,所以
         *gridViewMargin + (ScreenWidth - 2 * gridViewMargin - 80 * 4)/8 = 16;
         *得出gridViewMargin = (448 - ScreenWidth) / 6;
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span></pre>
</div>
<p>&nbsp;</p>
<p>36 gradient angle角度方向问题</p>
<p><code>ndroid:angle</code>Integer,代表渐变颜色的角度,&nbsp;0 is left to right, 90 is bottom to top. 必须是45的整数倍.&nbsp;</p>
<p>默认是 0.该属性只有在type=linear情况下起作用,默认的type为linear。</p>
<p>&nbsp;默认情况下,从左到右</p>
<p>angle = 270, 从上到下</p>
<p>参考https://blog.csdn.net/l_215851356/article/details/79408848</p>
<p>&nbsp;</p>
<p>37&nbsp;android获取textview的行数</p>
<p><img alt=""></p>
<div class="cnblogs_code">
<pre>mTextView.getViewTreeObserver().addOnGlobalLayoutListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OnGlobalLayoutListener() {

@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onGlobalLayout() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated method stub</span>
Log.e(TAG, "行数"+<span style="color: rgba(0, 0, 0, 1)">mTextView.getLineCount());

mTextView.getViewTreeObserver().removeGlobalOnLayoutListener(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">if</span>(mTextView.getLineCount()&gt;0<span style="color: rgba(0, 0, 0, 1)">){

mTextView.getViewTreeObserver().removeOnGlobalLayoutListener(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">);

}


}
});</span></pre>
</div>
<p>参考:https://blog.csdn.net/weixin_30912051/article/details/95115518?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control</p>
<p>&nbsp;</p>
<p>38 textview的文字超出屏幕宽度</p>
<p>textView的右边还有一个textView2,达到效果是textview2一直在textView右边,当textView2到屏幕最右边时,如果textView的文字过长,则不显示超出的问题</p>
<p>使用ConstraintLayout和RelativeLayout作为父控件达不到要实现的效果</p>
<p>暂时没有找到解决方案,因为textView必须确定左右边距才可以实现文字过长不显示的效果,但是右边界确定不了,我觉得重写textView或者改源码应该可以</p>
<p>&nbsp;</p>
<p>39 kotin textView设置string中的文字</p>
<p>tv_do.text = resources.getString(R.string.do)</p>
<p>40 kotlin map 使用</p>
<pre>val map = HashMap&lt;String, String&gt;()<br>map["topicId"] = "" + item.topicId<br>map["contentId"] = "" + item.id<br><br>或者</pre>
<pre>hashMapOf("Uid" to mUserId.toString()<br><br>41 <em style="font-size: 1.5em; font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif"><span class="final-path">检测Android应用的启动与关闭.md<br>参考 https://github.com/hehonghui/android-tech-frontier/blob/master/issue-8/检测Android应用的启动与关闭.md<br><br>42 </span></em>android 解决getColor()方法过时<br>https://blog.csdn.net/bzlj2912009596/article/details/79620231</pre>
<pre><em id="__mceDel" style="font-size: 1.5em; font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif"></em></pre>
</div>
</div><br><br>
来源:https://www.cnblogs.com/xinzaimengzai/p/11314170.html
頁: [1]
查看完整版本: Android开发走过的坑(持续更新)