JoJo,这是我最后的波纹了,收下它吧!——Android 波纹效果使用

in 垃圾文章 | No Comments »

本文主要内容:介绍 Android 波纹效果与兼容方式
注:本文属于 垃圾文章补完计划

在 Android App 中,触摸反馈是非常重要的,能让用户有点下去的感觉。

最简单的实现方式莫过于用户按下的时候改变背景色,例如:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/white_hover" />
    </item>
    <item>
        <color android:color="@color/white" />
    </item>
</selector>

然后直接android:background="@drawable/white_bg" 即可。

在 Android5.0后,Android 是支持了波纹效果的,视觉体验比单纯改变背景色好,使用起来也很简单,android:background="?attr/selectableItemBackground" 即可。但是问题在于它是没背景色的,难道还得再加一层 FrameLayout 不成?并不需要,直接加一个 drawable 即可:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white"/>
            <corners android:radius="0dp"/>
        </shape>
    </item>
    <item android:drawable="?attr/selectableItemBackground"/>
</layer-list>

这样便是一个白底的波纹背景了,需要的话也可设置圆角之类的。

但是,该方式在 Android6.0 上会有渲染 bug,加载的第一个用该背景的控件波纹是不会生效的。因此查了下 API,发现提供了更科学的波纹方式,在 drawable-21 中添加:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/white_hover"
    >
    <item
        android:id="@android:id/mask"
        android:drawable="@android:color/white"/>
    <item android:drawable="@color/white"/>
</ripple>

这样兼容性就彻底没问题了。

Android 数据通信:从基本的Activity、Fragment、Service数据传递到EventBus的使用

in 垃圾文章 | No Comments »

本文主要内容:首先介绍 Android 自带的 Activity 互相传递数据、Activity 与 Fragment 互相传递数据、Activity 与 Service 互相传递数据。随后分析它们的使用场景与优缺点,引出 EventBus,最后介绍 EventBus 的基本使用。
注:本文 Demo 皆为 kotlin 编写,有 Java 基础的读者应该能大致理解,请放心阅读。
注2:本文属于垃圾文章补完计划

Android 自带的数据通信机制

Activity 与 Activity 互相传递数据

我们将从 AActivity 启动 BActivity,并通过 intent 传送数据。
AActivity 的 onCreate 方法内:

            into_b.setOnClickListener {
            val intent = Intent(baseContext, BActivity::class.java)
            //传递基本类型
            intent.putExtra("att1", "普通的字符串")
            //传递序列化对象
            val person = Person("xloger", 18)
            intent.putExtra("att2", person)

            startActivity(intent)
        }

BActivity 的 onCreate 方法内:

        val sendMsg = intent.getStringExtra("att1")
        val person = intent.getSerializableExtra("att2") as? Person
        Log.d("XExample", "收到的消息:$sendMsg,收到的对象:$person")

输出结果:

D/XExample: 收到的消息:普通的字符串,收到的对象:Person(name=xloger, age=18)

注意,虽然 intent 看似有传 extra 和传 bundle 两种方式,但是 extra 只是 bundle 的封装。需要传递对象时需该类实现 Serializable 接口。
而当需要接收 BActivity 的返回数据时,需将原先的startActivity(intent)改为startActivityForResult(intent,233),其中整型233为 requestCode,作用是区分不同请求。
而 BActivity 在销毁前通过以下代码即可传递数据给 AActivity:

        val resultIntent = Intent()
        resultIntent.putExtra("resultMsg", "返回的内容")
        setResult(124, resultIntent)

然后在 AActivity 类中实现以下方法:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 233 && resultCode == 124) {
            Log.d("XExample", "返回的内容为:${data?.getStringExtra("resultMsg")}")
        }
    }

当进入 BActivity 后返回 AActivity,输出结果:

D/XExample: 返回的内容为:返回的内容

注意,requsetCode 与 resultCode 目的是为了区分不同的请求。而实际开发中,这些数应该统一放入常量池中,防止数据过多时不好区分。

(更多…)

垃圾文章补完计划

in 垃圾文章 | 2 Comments »

我对我技术类文章要求还是比较严格的,我个人觉得某个问题是我在努力通过搜索引擎并没有轻易地解决,当我经历了一些波折才解决,把这样的经历写下来才是比较有价值的文章。那些一搜一大把还都是复制来复制去的“技术文章”我真的很抵触。

但是呢,在最近面试时经历了一些事,看来我被某个喜欢“写废话”的竞争者打败了=。= 因此我便自暴自弃知耻后勇地决定把一些我觉得对整个互联网并没价值的个人经验写出来了。(因为对应的知识已经有很多文章写的比我好了)

因此我把它自嘲为“垃圾文章补完计划”,虽然说是垃圾,但是并不代表质量低劣(也许呢…),文章我都是认真写的,也尽可能写的比较完善。假如身为读者的你恰好看到了,不妨读读看吧。

以及,高中毕业后便感觉我的精准表达能力在不断下降,很多内容我已经没法用书面语准确简练讲清楚了,直到某次我看到一篇阐述网络词汇广泛流行的弊端有哪些?的文章才惊醒。因此多写文章还有一个目的就是锻炼精准表达能力吧。

就像张佳玮说的,当某天我看到一个很美的景色时,我脑海里能浮现的是“落霞与孤鹜齐飞,秋水共长天一色”这样的句子,还是只能一句“卧槽,真好看”。——让孩子背诵古诗词、古文有什么意义?

“Console window host” CPU 占用异常情况排查

in 在路上 | No Comments »

我的电脑时不时(触发条件未知)会突然响起风扇散热的声音,检查任务管理器会发现一个“Console window host”的进程 CPU 占用居高不下,通过了“’console window host’ high cpu”关键字谷歌搜寻后,基本没有中文资料,MicroSoft 官网的解答基本无用,最后通过https://www.howtogeek.com/howto/4996/what-is-conhost.exe-and-why-is-it-running/ 解决。在此分享步骤以供后人参考。

(更多…)

ViewPager 的点击监听与存在的误触问题

in 在路上 | No Comments »

ViewPager 是不自带 onItemClickListener 之类的方法的,解决方案也很简单,就是在 PagerAdapter 的 instantiateItem 方法里为每个页面加上监听。这是业界通常的做法,但是为毛没一个人提到这样会产生误触问题呢Orz……虽然解决误触也不复杂啦,但是我还是纳闷为啥我之前搜都没有相关资料呢……所以我还是写下这篇帮助下会被此困扰的人吧。

ViewPager 的点击事件监听

public class StartViewPagerAdapter extends PagerAdapter {
    private List mListViews;
    private View.OnClickListener clickListener;

    public StartViewPagerAdapter(List mListViews,View.OnClickListener clickListener) {
        this.mListViews = mListViews;
        this.clickListener=clickListener;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {  
        container.addView(mListViews.get(position), 0);
        mListViews.get(position).setOnClickListener(clickListener);
        //TODO 后面解决误触的代码
        return mListViews.get(position);
    }
}

然后创建的时候把 clickListener 传进来就行,没啥好说的。
(更多…)

© 2018 一隅 - Powered by Wordpress / Theme: Tabinikki