android开发中的一些小技巧

728 阅读1分钟

android:id="@android:id/empty"

与ListView配合使用,当ListView中没有数据时,显示id为empty的组件。当然对RecyclerView也是适用的。


使用TextPaint而不是Paint绘制文本

设置View的显示范围

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

RecyclerView.notifyItemChanged()


view.setTranslationZ(-1); //让组件位于其他组件下边


将View裁剪为圆形等(API >= 21)

view.setOutlineProvider(new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                outline.setOval(view.getPaddingLeft(), view.getPaddingTop(),
                        view.getWidth() - view.getPaddingRight(),
                        view.getHeight() - view.getPaddingBottom());
            }
        });

setClipToOutline(true);

String的格式化


<string name="price_symbol_formatted_with_unit" formatted="false">¥%.2f/%s</string>
android:text="@{@string/price_symbol_formatted_string(goods.price,goods.unit)}"


<string name="ratio_good_evaluation" formatted="false">
    <Data>
        <![CDATA[ <font color="#63C88C" style="font-size:2em"> %s&#37</font> 好评 ]]>
    </Data>
</string>

上述代码从上到下结果示例: ¥94.24/kg 96% 好评

SpannableString

ClickableSpan:具有点击时间的文本效果 MaskFilterSpan:如模糊效果(BlurMaskFilter),浮雕效果(EmbossMaskFilter) RasterizerSpan:光栅效果 DynamicDrawableSpan:设置图片,基于文本baseline或bottom对齐 SubscriptSpan:下标 SuperscriptSpan:上标 UrlSpan:文本超链接 AlignmentSpan:对齐方式 TypefaceSpan:字体 StyleSpan:字体样式,例如对文本加粗、斜体等 AbsoluteSizeSpan:字体绝对大小 RelativeSizeSpan:字体相对大小 BackgroundColorSpan:背景色 ForegroundColorSpan:前景色 TextAppearanceSpan:文本外貌,包括字体、样式、大小、颜色等

e.g.

String base = "北京到湖南的";
String append = "[路线]";
String com = base + append;
SpannableString ss = new SpannableString(com);
ss.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(MainActivity.this, "路线", Toast.LENGTH_LONG).show();
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
    }
}, base.length(), com.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

TextView textView = (TextView) findViewById(R.id.text);
//必须设置MovementMethod
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(ss);

处理Markdown

Bypass

使用StrictMode来检测内存泄漏

//add follow codes in your Application#onCreate()
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
//android 2.3添加StrickMode之后只能监测到数据库是否关闭
builder.detectLeakedSqLiteObjects();
//在android 3.0之后,可以监测Activity泄漏,对象泄漏,对象未关闭泄漏
if (VERSION.SDK_INIT >= Build.VERSION_CODES.HONEYCOMB){
    builder.detectActivityLeaks().detectLeakedClosableObjects();
}

屏幕旋转失效

与主题冲突:

android:windowIsTranslucent="true"

InputMethodManager导致内存泄露

https://gist.github.com/pyricau/4df64341cc978a7de414