android 小知识点记录

这边主要记录一些杂乱的知识点,算学习开发过程中碰到的坑。会持续更新,别问我为什么,因为坑永远填不满- -

1.  自定义布局的时候,当使用了如下红色代码,意思是将该布局添加到this所在的自定义的布局中。

当使用该布局时,显示的就是my_layout.xml 中的布局

相当于addView();

package com.example.stormxz.framelayouttest;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.FrameLayout;

/**
 * Created by stormxz on 2017/9/25.
 */

public class MyFrameLayout extends FrameLayout {
    private Context mContext;
    public MyFrameLayout(@NonNull Context context) {
        super(context);
        mContext = context;
        init();
    }

    public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    private void init() {
        LayoutInflater.from(mContext).inflate(R.layout.my_layout, this);
    }
}

2.  textview 滑动

xml 中添加textView属性:

android:scrollbars="vertical"

通过id获得textView对象,设置参数:

textView.setMovementMethod(ScrollingMovementMethod.getInstance());

3.  判断当前线程是否是主线程方法之一

Log.d("stormxz", "onResponse" + (Looper.getMainLooper().getThread() == Thread.currentThread()));


4.  使用okhttp3时,访问成功回调方法onResponse 

public void onResponse(Call call, Response response) throws IOException {
    String s = response.body().string();
    Message message = new Message();
    message.obj = s;
    message.what = 1;
    handler.sendMessage(message);
}

不能将参数response 直接发送消息出去,否则会报线程错误;也就是说response.body() 方法必须在子线程中执行


4. 剩余 XX 天的3种方式

(1)  3个拼接  剩余 + XX + 天

(2)  String.xml

通过String.Format进行格式化

<string name="vip_days">"剩余%2$s天"</string>

String.format(ResUtils.getString(R.string.vip_days), day, day)

(3)  在plurals_strings.xml中添加item

</plurals>
    <plurals name="recentlyplay_txt_remainder_time">
    <item quantity="other">"剩余 %d 分钟"</item>
</plurals>
resId = R.plurals.recentlyplay_txt_remainder_time,  后面为值

getResources().getQuantityString(resId, quantity, formatArgs)


5. Android studio出现下面错误时,一般都是同一个类有多个地方引用,而问题的所在是由于项目的依赖包或库重复了

Error:Execution failed for task ':iDOQRcode:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/sv/String.class
先查找com/google/sv/String.class这个类是在哪一个包中,不出意外,在你的依赖项目里面有一个相同的类,我们只需要把其中一个删除就好了

6. @TargetApi(android api level)  用来兼容版本api的,加了前缀的方法不会因为api版本不高而空跑该方法

   一般是在方法中进行level的判断,而执行不同的方法,用来兼容不同版本手机


7. 字符串中单复数的使用   第四点的补充

<plurals name="xxx_days">
    <item quantity="one">%1$sday left</item>
    <item quantity="zero">%1$sdays left</item>
    <item quantity="two">%1$sdays left</item>
    <item quantity="few">%1$sdays left</item>
    <item quantity="many">%1$sdays left</item>
    <item quantity="other">%1$sdays left</item>
</plurals>

zero

语言需要对数字0进行特殊处理。(比如阿拉伯语)

one

语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。)

two

语言需要对类似2的数字进行特殊处理。(比如威尔士语)

few

语言需要对较小数字进行特殊处理(比如捷克语里的234;或者波兰语里以234结尾但不是121314的数。)

many

语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数)

other

语言不需要对数字进行特殊处理。

代码中的使用
getResources().getQuantityString(resId, quantity, formatArgs)

资源文件路径 为res\values\plurals_strings.xml;当然可以根据不同语言进行写不同的xml文件


8. Android Studio Can't start Git

    Android Studio Can't start Git: git.exe Probably the path to Git executable is not valid. Fix it.  导致无法看git的提交记录。可点击Fix it 或者按下面步骤:
    Android studio -> File -> Settings -> Version Control -> Git
   一般来说本地安装Git, 这边配置git路径为...\Git\bin\git.exe的位置

9. 当Android studio出现没有代码提示后,可以根据如下步骤尝试解决:
    File-> Power Save Mode  去掉打勾


10.访问SD 卡 crash 问题
error  如下:

06-21 22:23:40.934  2715  2715 E AndroidRuntime: Process: com.android.gallery3d, PID: 2715
06-21 22:23:40.934  2715  2715 E AndroidRuntime: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/85AE-19E6/DCIM/Camera/TRIM_20180621_222339.mp4
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at com.android.gallery3d.app.TrimVideo$3$1.run(TrimVideo.java:270)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:790)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:164)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6518)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
06-21 22:23:40.934  2715  2715 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

解决方案:在配置文件中添加 <root-path  path="." name="root_path"/>
参考链接:https://www.jianshu.com/p/121bbb07cb07
在使用FileProvider 时,解决方案中的配置文件所指的就是file_paths

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.android.gallery3d.fileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

猜你喜欢

转载自blog.csdn.net/weixin_39158738/article/details/78088213