26
2017
09

Android里的小问题和小技巧

1.最好不要把图片的jpg格式直接重命名为png格式,要用 格式工厂 之类的工具进行格式转化更为妥当,否则会报出相关的错误。

2.在LinearLayout里用layout_weight的时候,如果写的比例跟我们要的预期相反,可能问题出现在我们的layout_width或layout_height设置成了match_parent。具体情况要看LinearLayout是水平方向还是垂直方向,规范做法是给它们中的一个设置为0dp。

3.LinearLayout里的layout_gravity同样需要根据排列方向来起作用​:如果orientation=”horizontal”,那么它只在垂直方向起作用;同样,如果orientation=”vertical”,那么它就在水平方向上起作用,作用相反。

4.一般来说,我们会这样写Button的三种点击方法:一种是bt.setOnClickListener(this) , 一种是bt.setOnClickListener(new onClickListener)。那么还有第三种点击方式是在Button的布局文件里加入android:onClick=”myClick” ,这样的话监听方法就是在Activity里声明public void myClick(View v)来执行就可以了。

5.图片的命名格式首字母不要用大写。

6.getTaskId()方法能打印出当前的返回栈的id。

7.IntentFilter为Intent的过滤器,只在AndroidManifest里以出现,而不出现在java代码里。(但是!广播接收器里它是通过Context.registerReceiver()函数动态的注册;它被作为IntentFilter对象创建。)

8.在使用SQLite的时候,“sqlite3 *.db ”, 数据库的名字是有区分大小写的,所以你原来是怎么写的这里也是一样。

9.如果你进入sqlite3后由于误输入而进入了 “…>”模式的话,如果 “.exit” 和 “.quit ”都不起作用,可以使用ctrl + d来退出。

10.使用Genymotion作为模拟器的时候,如果像我这样在学校用锐捷上网,它会经常爆冲突。目前我所知道的解决方法就是在“Network and Sharing Center“的“Change adapter settings”里把”VirtualBox Host-Only Network #数字“给disabled掉,这样就可以上锐捷。不过这是治标不治本,因为当你下次打开电脑的时候,很可能会多出个网络适配器,我现在电脑里已经有将近10个了。我原本以为进入Virtual Box里将模拟器的上网设置为NAT,但似乎不起作用,网上也还暂时没找到解决方法,只能暂时顶住先。

11.使用Genymotion作为模拟器的时候,有可能可以成功安装微信,QQ等软件,但出现点击打不开的结果。原因可能是Genymotion本身没有安装ARM,所以你需要下载Genymotion的ARM插件(一个zip文件),直接拖入你已经打开的模拟器里(不要用管理员权限去运行),安装完后重新启动即可。

12.使用eclipse提交到github的时候,它报出了master:master[rejected -non -fast-forward],这个时候可以试试右键工程——team——Add to Index,然后重新提交看看。这是从StackOverFlow上看到的,不过他有后续,完整的是:

May be you are not adding the files to index.

Go to Team > Add To Index. then Rebase > Continue Rebase

then commit in Your Local Master and Push

13.今天打开eclipse发现怎么之前安装的github插件没有了,后来就用管理员权限运行,发现github插件出现了,但ADT却不见了……在这里,win8.1的这点还是比较烦人的。所以想给eclipse设置为默认管理员权限运行,发现网上都基本是win7,win8的。其实大致的方向都是那样,只是win8.1的位置有些不一样:

右键程序,选择属性——兼容性
这里写图片描述

更改对用户的所有设置

这里写图片描述

以管理员身份运行该程序

这里写图片描述

14.如果你的activity继承了AppCompactActivity,那么此时使用requestWindowFeature(Window.FEATURE_NO_TITLE)是没有用的,而且可能还会报错。你可以在Manifest里对你的activity里添加

android:theme="@style/Theme.AppCompat.Light.NoActionBar"

或者是在activity文件里添加

ActionBar actionBar = getSupportActionBar(); actionBar.hide();

要注意导入的包文件的一致,我这里导入的包是:

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;

15.错误信息:android.view.InflateException: Binary XML file line #66: Error inflating class
最近在开发的时候,总会时不时地APP出现闪退的情况,按理说那只是一个简单界面,后来查找了发现是图片的问题,虽然我在界面里设置它的长和宽为20dp,但实际那张图片得好几千的像素,所以可能错误在这里,因此我就把它改小了,目前就暂时还未发现同样的问题发生了。

16.当我们在eclipse里导入RecyclerView的jar包后,编译出错的时候:
“进入sdk\extras\android\m2repository\com\android\support\recyclerview-v7\21.0.0目录,找到recyclerview-v7-21.0.0.aar这个文件。用解压软件解压此文件里面有classes.jar,把这个jar包放到项目中的libs文件下即可。这个jar包就是RecyclerView要使用的,可以给它改个名字例如android-support-v7-recyclerview.jar , 便于查看。”
参考此blog

17.如果在windows 32位的系统内,安装完sdk后,却打不开sdk manager.exe。那么有一种解决方法是进入android-sdk——tools——lib——find_java.bat。用记事本打开,找到 | %sys_32%\find /i “x86” > NUL && set arch_ext=32 || set arch_ext=64,如果你的“32”和“||”之间有个空格的话,将空格去掉后保存,重新打开即可。

18.
这里写图片描述

这代表着你应该是打开了豌豆荚一类的手机助手工具,将它关闭,或是重新开机。

19.利用真机开发的时候,发现file explorer没有显示真机的文件内容,SegmentFault上回我的答案是没有root,但我用了百度root和root精灵都显示我已经root,还是没有显示我想要的结果。

这里写图片描述
不知道是不是CM系统的缘故,我刷了另外一个系统后,则发现可以正常显示了。所以我估计是系统的原因。

20.注意onCreate()方法的使用,在创建onCreate()方法的时候,要看清楚它的参数,刚才发现数据库一直没有被创建,而语句没有错误,后来发现是onCreate()方法写错了,一个是protected void onCreate(Bundle savedInstanceState),另外一个是public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)。所以要区分好两者。

21.TextView里可以设置文字附近带有图片,如在xml里使用drawableLeft之类的。那么有两个地方,(1),如果textview设置width为match_parent,那么当设置图片的时候图片会挨着左右边缘,这时不能调与文字间的距离,要将width改为wrap_content。(2)如果想在代码里取消图片的显示,使用setCompoundDrawablesWithIntrinsicBounds()方法,并将四个参数都设为0,则图片会隐藏。

22.当需要填充ImageView的时候,要考虑使用scaleType属性。其中FitXY可以将其填满。
23.SDK Manager里的Extras没有找到Android Support Repository,一种是在Tools文件夹里对Android SDK Tools & Android SDK Platform-tools 进行安装或更新,这样就会出现。另外一种就是它已经改名为Local Maven repository for Support Libraries,打开即可看到:

这里写图片描述

24.获取屏幕像素,原先的通过WindowsManager来获取屏幕像素已经废弃:

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int width = displayMetrics.widthPixels;
        int height = displayMetrics.heightPixels;

25.INSTALL_FAILED_DUPLICATE_PERMISSION

检查手机是否连接正常;

根据列出了权限信息,查看是否写了重复的权限;

查看是否有其它应用用了同样的权限,将其卸载掉。

26.当我们查看一些官方控件源码的时候,出现了这样的情况:

这里写图片描述

这个时候首先我们确定在SDK Manager里已经下来了我们当前工程编译版本的Source for Android SDK,
然后我们点击Change Attached Source…,再点击“external folder”,然后通过路径“android-sdks/sources/android-xx”,选择该文件夹即可。
打开参考链接

27.在做语言适配的时候,我们会建立不同的values-**文件夹来适配不同国家地区的语言,那么这里在我们平时的values文件夹里虽然我们写的strings值是中文,但这里注意,其实这里默认是英文,只是我们自己去做了处理而已。所以这就是为什么我们在这里写了中文,然后建立一个values-es去存放英文,然后切换为英语地区,但还是显示中文的原因。所以我们应该是去建立一个中文文件夹:values-zh-rCN,然后写上中文的值才对。
Android应用多语言适配工作

28.使用RecyclerView的时候,出现了报错的情况:

这里写图片描述

其中的一个解决方法是如果你引用了v7的包,然后libs文件夹里有v4的包,则要记得把v4删掉。

29.查看自己apk或是jar的方法数,首先下载dex-method-counts.jar,然后CMD使用命令行:java -jar 路径\dex-method-counts.jar 路径***.jar(或是**.apk),即会罗列出方法数。

这里的前提是jar包已经被转化为dex,如果没有转化的话,在自己的SDK路径 …\androidsdk\build-tools\xx.xx.xx下有个dx.bat,因此通过cmd进入到dx.bat所在的目录下,然后通过命令dx –dex –output=输出路径***(名字可修改).jar 要转化的jar包路径***.jar。即可将原来的jar包转化为dex,然后再进行方法数的查看即可。

30.在用edittext做密码输入的时候,需要做可视与隐藏的切换,利用

et_input_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); //可视
et_input_password.setTransformationMethod(PasswordTransformationMethod.getInstance()); //隐藏

但在切换后出现光标回到初始位置,所以

 //切换后将EditText光标置于末尾
                CharSequence charSequence = et_input_password.getText();
                if (charSequence instanceof Spannable) {
                    Spannable spanText = (Spannable) charSequence;
                    Selection.setSelection(spanText, charSequence.length());
                }

31.TextInputLayout的兼容显示问题。
TextInputLayout的空白显示问题

32.进入某个有网络数据请求的fragment的时候,由于网络延迟,然后我们退出这个fragment,这个时候有一定的概率会发生闪退,提示如fragment not attach Activity之类的。有一个原因是因为在这个时候我们用到了getResource之类的语句,我们可以将用到这语句的地方移到onStart生命周期里去执行。

33.使用TextView的autolink=phone对电话号码进行处理的时候,要考虑地区的问题,假如手机的语言从大陆切换到香港或是其它国家地区的时候,就会有些出现无法识别的情况。所以这里就有一个细节的问题,如果我是设置为点击直接拨打,那么该电话应该会出现无效的情况;如果是设置为点击打开拨打界面,这样可能会好一点,用户可以在拨打界面那里修改电话号码。

34.单纯的ScrollView和WebView不要嵌套。

35.在联系recyclerview的时候,报了个这样的错误:

The specified child already has a parent. You must call removeView() on the child’s parent first.

后来检查的时候发现是在adpater的onCreateViewHolder里关联布局的时候写错了:

  View view = LayoutInflater.from(mContext).inflate(mLayoutLd , parent );

应该改成:

  View view = LayoutInflater.from(mContext).inflate(mLayoutLd , parent , false);

36.在api 22 之后getResource被废弃了,所以像类似的

img.setBackgroundColor(getResource().getColor(R.color.colorPrimary));

是行不通的,
应该改成

img.setBackgroundColor(ContextCompat.getColor(context , R.color.colorPrimary));

37.在跑程序的时候出现了手机上出现了两个图标,检查下Manifest文件里是否重复了

删成一个即可。

38.Error inflating class android.support.design.widget.FloatingActionButton,当报出类似的错误时,要查看下是不是有些app的自定义属性被写成了android了,如:app:backgroundTint 而不是 android:backgroundTint

39.在使用LayoutParam的时候,

如果报出了错误: Caused by: android.view.WindowManager InvalidDisplayException:Unabletoaddwindowandroid.view.ViewRootImpl W@3be0e7e – the specified window type is not valid,看下在初始化的时候:

 layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, 0, 0,PixelFormat.TRANSLUCENT);

这里的第一个参数type是否被写成了0,应该替换成WindowManager.LayoutParams.TYPE_SYSTEM_ERROR之类的有文字意义的。

40.在用TextView的布局里的时候,如果只想看下显示效果,可以不用android:text来写,用tools:text的话即可以在预览的时候显示文字,又可以在实际运行的时候不显示。

41.用adb shell命令时提示more than one device/emulator。此时可以通过adb devices来查看有什么设备,然后通过adb -s devicename shell来指定我们要的那个设备就行了。

42.用adb查询数据库里表的内容时发生了中文乱码的情况,此时可以重新打开cmd,然后输入chcp 65001 然后回车。然后右击窗口标题栏,选择属性——字体,将字体选择为Lucida Console,确定即可。这个时候再重新进入查看就发现中文不会出现乱码了。

43.今天打开AS发现xml里的代码提示没有,主要是出现在我的引用控件里,我们依赖了一个控件Module,然后用了里面一个控件MyScrollView,包括该控件下面的属性以及其它控件都不能获得代码提示,原因是因为我在开发的Module里把compileSDKVersion给改成了23,而依赖的没有改,我把依赖的Module也改成一样的版本就可以了。

44.当对一些旧项目修改版本到23时,由于org.apache.http.client已经被废弃了,但又不想修改,此时需要在libs里添加jar包,该jar包可在自己的sdk文件路径下的platforms/android-23/optional里找到,名为org.apache.http.legacy.jar。将其添加到libs里重新编译即可。

45.在android stuido里当我们gradle编译时间太长,然后我们想取消的时候,往往点击stop没有用。我们可以在当前项目目录下的命令行里输入gradlew.bat –stop(或gradlew –stop)来停止,

46.build一个别人的项目的时候,出现了以下错误:

Execution failed for task ‘:app:mockableAndroidJar’.
java.util.zip.ZipException: invalid entry compressed size (expected 2051 but got 2050 bytes)

解决的方法是在project的build.gradle里加上:

allprojects {
    repositories {
        jcenter()
    }

    gradle.taskGraph.whenReady {
        tasks.each { task ->
            if (task.name.equals('mockableAndroidJar')) {
                task.enabled = false
            }
        }
    }
}

47.华为手机打印不出日志:
拨号键盘输入##2846579##,然后选择ProhectMenu,然后后台设置,然后LOG设置,LOG打开。

48.如果使用Recylerview设置wrap_content的时候没有效果,尝试看下是否更新到com.android.support:recyclerview-v7:23.2.1及以上。

49.使用drawerlayout的时候会由于侧滑布局里不是listview而产生点击穿透事件,即点击侧滑菜单的空白部分,其后面的布局会发生事件响应,所以在侧滑菜单的布局里设置android:clickable=”true”即可解决。

50.使用Glide的时候,遇到CircleImageView的时候会出现加载不出来的情况,原因在于设置了占位图,可以将placeholder去掉,其它方法参考这里:
Glide使用中的踩坑和填坑

51.使用butterknife的时候报错:
duplicate entry: android/support/v4/hardware/display/DisplayManagerCompat$JellybeanMr1Impl.class
在build.gradle里修改butterknife:

 compile ('com.jakewharton:butterknife:8.6.0'){
        exclude module: 'support-compat'
    }

52.隐式调用Service的时候会报错,在5.0以上:

Intent intent = new Intent();
      intent.setAction("com.jdnew.serverapp.service.LicenseService");
        mContext.bindService(intent , mServiceConnection , Context.BIND_AUTO_CREATE);

需要加上包名即可:

Intent intent = new Intent();
        intent.setAction("com.jdnew.serverapp.service.LicenseService");
        intent.setPackage("com.jdnew.serverapp");
        mContext.bindService(intent , mServiceConnection , Context.BIND_AUTO_CREATE);

待续……

上一篇:访问Google的两种方法 下一篇:java之环境变量