Android中一些开发的小技巧总结(持续更新)

前言

做事,写代码都要找到最优的方案!

Activity中获取Fragment对象

      不管是布局xml里是fragment(有id),还是一个帧布局,帧布局最终要替换成对应的fragment,通过findFragmentById可以获取到对应的fragment对象,然后你要使用fragment里面的某些方法等比较方便,网上说的那些通过回调等也是可以的,但是通常来说,Activity里需要使用fragment里面某些判断等简单调用吧,可以使用这种方式.如下我这边目前使用这个方式来操作一些逻辑,对于内存泄漏什么的,目前还没有检测.

 EmailPullFragment fragment = (EmailPullFragment) getSupportFragmentManager().findFragmentById(R.id.frame_content);
        if (null != fragment) {
            if (fragment.checkHaveEmailData()) {
                ToastUtil.showCentreToast(EmailPullHomeActivity.this,R.string.email_no_batch_edit_hint);
                return;
            } else {
                startActivity(intent);
            }
        } else {
            startActivity(intent);
        }

Activity中获取跟布局(RootView)

大家如果做过“沉浸式状态栏”的功能,可能需要这个小技巧,因为沉浸式有个属性,当然这个沉浸式支持的最低系统是Android4.4,实现沉浸式需要使用到这个属性fitsystemWindows,这个需要在根布局里边加上fitsystemWindows = true可以实现沉浸式的效果,当然,代码中也可以设置这个属性,通过setFitsystemWindows(true)即可实现效果;话又说回来了,这个我们要做统一的效果,不能在每个页面根部都加这个属性吧,有点麻烦哦,看过源码的人都知道,Activity的唯一实现窗口phoneWindow就是我们手机的屏幕,里面有个DecorView,DecorView是一个容器,它所对应的ID 为android.R.id.content,之前我们经常调用setContentView(),我们的View就是该DecorView下面的一个子View,因此
((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0).setFitsSystemWindows(true);
通过上面的设置我们就在代码中实现了沉浸式的效果,当然要在基类中设置,因为是统一的效果,基类设置也需要注意下,注意Activity加载过程,要在setContentView后,系统计算好布局高度一系列工作后展示到用户面前的时候,展示到用户面前,有个周期不就是onResume()吗,在基类的这个周期里加上上述的代码即可简单快速的实现沉浸式效果!(4.4系统的沉浸式和5.0系统之后的设置效果一样,虽然沉浸式的样式有所变化,那是系统级的变化,不影响使用!)

IntentService

该类继承于Service,执行一次,自行销毁(stopSelf) 针对后台耗时操作,可以使用这个,很方便!

动态注册广播

这个在平常开发中用的还是比较多的,IntentFilter中加入action,界面耦合等用的挺好,要注意内测泄漏的问题, 退出当前记类时记得将广播取消注册.

Android中的盒子模型

盒子模型最早用于前端Html,相对于外部是margin,相对于内部是Padding.Android布局使用xml编辑,也是盒子模型的原理,这里有个小技巧 比如你要实现一个未读数字的效果,可以这样编写
<RelativeLayout
        android:layout_width="60dp"
        android:gravity="center"
        android:layout_height="60dp">

        <ImageView
            android:layout_width="wrap_content"
            android:src="@drawable/message_icon"
            android:layout_centerHorizontal="true"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_gravity="top|right"
            android:layout_alignParentRight="true"
            android:layout_marginTop="-3dp"
            android:layout_marginRight="-3dp"
            android:gravity="right|top"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/iv_new_message"
                android:layout_width="10dp"
                android:layout_height="10dp"
                android:visibility="gone"
                android:src="@drawable/message_circle_bg"
                />
        </LinearLayout>

    </RelativeLayout>

 android:layout_marginTop="-3dp"
            android:layout_marginRight="-3dp"

可以看到-3dp的写法,其实跟3dp的方向正好相反,-3dp其实就是相对于父容器并向父容器靠拢,3dp是相对于父容器分开,可你又说了,那为什么不使用margin_bottom,根据盒子模型,marginBottom是这个控件距离父容器底部3dp,你改成30dp后,你会发现,有部分控件被遮挡了,也就实现不了右上角未读提醒了,可以看下我用这个实现的效果
就是右上角的红点,当然实现方式很多,我比较喜欢使用这个写法,嵌套了两层,帧布局的话会简单点,记得我尝试过,可能效果不太理想吧.




发布了60 篇原创文章 · 获赞 109 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/shenshibaoma/article/details/73648623