Android技术屌丝程序员崛起之路

开发中遇到的一些操蛋问题

2016-07-21  本文已影响558人  子丿龙

1. view.inflate 和 LayoutInflater 区别和联系

基本没区别,
view.inflate里边调用的是Layoutinflater,但是参数又不一样的地方,
view.inflate只能选择要不要挂载到父view只上,如果挂载那么layoutparms也随时设置,如果不载,layoutparms就不设置,
Layoutinflater多一个boolean参数可以自己设置,需要不需要设置layoutparms,
除了这点区别外,都一样用,基本可以不用考虑这点区别,一百年用不到一次.

2. TabLayout中的操蛋问题

tabMode 当条目超过屏幕宽度是,是否让他可以滚动,或者直接缩小填充
tabGravity 当条目不足屏幕宽度时,是否让他居中,或者直接扩大填充
这两个是配合着使用的,但是貌似又相互独立,TMD到时候自己看着办吧........

3.ListView始终定位底部

listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

4.web httpurlconnection接受客户端请求消息

5.文件持久化存储的坑

6.简单的mxl布局优化

根布局,简单的FramLayout就用merge,
如果是自定义布局,根布局是Framlayout同上,如果是Linerlayout之类的,就要在自定义view中自己设定一下属性:
例如--> setOrientation(LinearLayout.HORIZONTAL);
注意事项: 在自定义布局中 使用merge ,inflate一个view时,要必须指定父布局,必须添加到父布局true
即---> inflate(int, ViewGroup, true)
不能在ViewStub中使用merge标签。最直观的一个原因就是ViewStub的inflate方法中根本没有attachToRoot的设置

作为根布局的merge,如果我们想设置自己设置背景什么的,可以这样
简要说明:因为Window窗体(比如Activity)加载时会自动添加PhoneWindow$DecorView和FrameLayout(id/content)两层布局
//setContentView(R.layout.layout_showset);
这个就不要了,我们自己去拿decorview然后拿到Framelayout,再找到我们的根布局,然后自己设置属性.
FrameLayout frameLayout = (FrameLayout)this.getWindow().getDecorView().findViewById(android.R.id.content);
frameLayout.setBackgroundResource(R.drawable.bg_repeated_main);
LayoutInflater.from(this).inflate(R.layout.layout_showset, frameLayout, true);

简要说明:其实就是一个轻量级的页面,我们通常使用它来做预加载处理,来改善页面加载速度和提高流畅性,ViewStub本身不会占用层级,它最终会被它指定的层级取代。
给ViewStub设置资源,可以在xml中(android:layout="@layout/ layout_main"),也可以在代码中,如下:
mViewStub = (ViewStub)findViewById(R.id.viewstub);
mViewStub.setLayoutResource(R.layout.layout_main);

7.Decimal 的使用

符号 描述
0 如果不存在就显示0
# 如果不存在就不显示
. 分割符

8.自定义view的大坑逼

9. Handler.post() 和 view.post()的区别

10.service中弹toast的坑

11. MediaRecorder中的坑比事

12. Dialog的背景风格

<style name="ModalDialog" parent="@android:style/Theme.Dialog">   
     <item name="android:windowFrame">@null</item>    <!-- 设置窗体边框 -->   
     <item name="android:windowIsFloating">true</item>    <!-- 窗体是否浮现在activity之上 -->                                          
     <item name="android:windowIsTranslucent">false</item>    <!-- 窗体是否半透明 -->    
     <item name="android:windowFullscreen">true</item>    <!-- 窗体是否全屏 -->
     <item name="android:windowNoTitle">true</item>    <!-- 窗体有无标题-->
     <item name="android:background">@null</item>    <!-- 背景 -->
     <item name="android:windowBackground">@android:color/transparent</item>    <!-- window背景 -->
     <item name="android:backgroundDimEnabled">false</item>    <!-- 背景是否模糊显示 -->
     <item name="android:windowContentOverlay">@null</item>     <!-- 窗体内容背景 -->
     <item name="windowOverscan">false</item>          <!-- 是否要求窗体铺满整屏幕-->
</style> 

13. 通过api拿到资源id

方法1:
int id = Context.getResources().getIdentifier("activity_main","layout",paramContext.getPackageName());
方法2:
Field field = R.id.class.getField("edit2");
int id = field.getInt("edit2");

14. 权重weight

当设置了wrap_content时,权重,最小要能包裹能容,也就是说即使权重小,但是也要先放下全部内容,所以大小还是会变

当设置了fill_parent(match_parent)时,权重,最大只能是填充父窗体,也就是说,就算内容再多,也只能到父窗体那么大
如果设置为0dp,那就是严格按照权重比例来区分了

15.path颜色设置问题

1 .在我做自定义画板view的时候,需要重新给画笔设置颜色,但是颜色会覆盖之前已经画好的东西,问题就是,如果 要改变颜色,就要重新new 一个新的path出来,总之每次的都不能一样,可以保存起来,颜色一样的再复用.

2 . 另外paint画笔的设置,风格很重要,,一个是fill 填充,一个是stroke描边这个要区别开

16.Dagger2中的问题

dagger是针对类与类之间调用,导致耦合性提高,而提供通过依赖注入的方式解耦的一个框架.(我不喜欢用)

module : 用来告知dagger 该依赖(要注入的对象) 的构造方法,这里需要注意的问题是,如果构造方法有多个参数,那么需要一层一层的去通过@provides 来告知,不可以一次性告知,例如:

//这是需要注入对象的构造方法
 @Injectpublic LoginPresenter(ILoginActivity iLoginActivity, IM im) {  
          this.iLoginActivity = iLoginActivity;    this.im = im;
  }
          
 //这是module告知的方式
  private final ILoginActivity iLoginActivity;
  public LoginActivityModule(ILoginActivity iLoginActivity) {
        this.iLoginActivity = iLoginActivity;
  }
  @Provides
  ILoginActivity provideIloginActivity() {
        return iLoginActivity;
  }
  @Provides
  LoginPresenter provideLoginPresenter(ILoginActivity iLoginActivity, IM im) {
         return new LoginPresenter(iLoginActivity, im);
  }
  1. dagger中module 和 component的工作流程是,component负责连接 宿主依赖 ,当 宿主 中注入 依赖 时,dagger就会从 宿主 注册的component中寻找 依赖被注册的 构造法方法,然后进行实例化,最后就完成了注入
  1. 对于在Component中添加 dependencies 依赖,这样的话,本个Component会继承dependencies里的所有实例化对象,这种情况一般用在继承AppComponent,而AppComponent则实例化了一些全局性的变量
  2. 而对于Component中的 modules参数,里边则是告知dagger,需要实例化哪些类,对应的module中要给出构造函数的实例化方法

17.java文件路径问题

在写一个客户端通过URL地址下载服务器图片的额时候,怎么都加载不出来图片,后来发现,原来忘了写 http:// ,当时想省事直接从ip地址开始写的.
另外,发现一个好玩的东西,java服务器只需要把图片放到项目的webcontent目录下,即可,例如我在 webcontent 目录下,新建了一个image文件夹,把所有的图片都放进去了,然后我客户端的路径就可以这样写:

    path = "http://123.56.104.149:8080/DrawingAndGuessingServer/image/1.jpg";
    Glide.with(this).load(new URL(path)).into(image);   这里用的glide图片加载框架

这样,直接就把图片加载到imageview中了,,而不是我之前想的那样还要写什么输入流输出流,唉:-(,,TMD,想多了.,原来这么简单!

18.项目中AppTheme报错问题

No resource found that matches the given name 'Theme.AppCompat.Light'.

查看 res/values/styles.xml 下的报错点。
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
把这个改成

<style name="AppBaseTheme" parent="android:Theme.Light">

路径: res/values-11/styles.xml
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
把这个改成
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">

路径: res/values-14/styles.xml
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
把这个换成
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">

19.Dialog中dismiss和hide的区别

dismiss和hide方法都可以隐藏对话框,在需要的时候也可以用show方法调用显示。但是,这两者是有区别的。
dismiss方法会释放对话框所占的资源,而hide方法不会。activity退出前必须调用dismiss方法关闭对话框。
如果对话框上有progressbar,你会发现,调用dismiss方法后,再调用show方法,出来的对话框,上面的progressbar不再会转动,而调用hide方法的则没有问题。
所以,最正确的调用方法是,在activity的onDestory方法里调用dismiss方法,其他地方都用hide方法隐藏对话框。

20.app退出后台,重新进入后,页面重新载入问题

问题具体描述: 打开app,进入一个页面,然后点击home,退到后台,这时候,再次点击app图标进入app,应该打开上次的页面,而不是重新载入.
问题解决: 我的app入口是,splashactivity,,我把splashactivity的启动模式设置成singleTask了,,所以导致每次点击app图标进入,会重新载入,其实不是重新载入了,而是重新走splashactivity了,如果我们有这个需求,可以这样写,每次点击app图标,就会重新走这里,,如果没有,想点击app图标,回到上次的页面,我们就把启动模式换掉就可以了.

21.app异常强制退出后,自动重启问题

在自己的Activity堆栈管理类中,finish掉虽有的activity就可以了
没有试过,他妈因为测不出来bug了,反正就是好了

22.微信分享,不显示缩略图bug

是因为分享的简介中存在 微信认为的 敏感词汇:元 红包 领取,目前知道的就这几个,也许有别的,微信也没有文档,自己看着办吧.

23.android图标文件夹 规范(原则是不低于规范尺寸,单位:px)

hdpi文件夹 —— 192x192

xhdpi文件夹 —— 256x256

xxhdpi文件夹 —— 384x384

xxxhdpi文件夹 —— 512x512

注:分辨率适配目录参考

480*800 drawable-hdpi

540*960 drawable-sw360dp-hdpi

720*1280 drawable-sw360dp-xhdpi

1080*1920 drawable-sw360dp-xxhdpi

1440*2560 drawable-sw360dp-xxxhdpi

一大波坑即将来袭,持续更新中.......

上一篇下一篇

猜你喜欢

热点阅读