运用代码为textview设置drawableLeft

原难点根源于CSDN问答频道,更加多解决方案见:原难题陈说:xml中的textView:

screen_shot.gif

图片 1<include />

TextViewandroid:android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:drawableLeft="@drawable/checkmark"android:gravity="center_vertical"android:textStyle="bold"android:textSize="24dip"android:maxLines="1"android:ellipsize="end"/

主意生龙活虎、使用系统控件ViewFlipper格局:

作者:李旺成

如程序中所见自个儿在xml中装置了DrawableLeft。小编想在代码中改换drawable。有哪些点子能够利用代码为textview设置drawableLeft呢?杀鸡取卵方案:

布局文件:

<ViewFlipper
        android:id="@+id/view_flipper"
        android:layout_width="300dp"
        android:layout_height="35dp"
        android:layout_centerInParent="true"
        android:autoStart="true"
        android:background="@drawable/warning_bg"
        android:flipInterval="3000"
        android:inAnimation="@anim/slide_in_bottom"
        android:outAnimation="@anim/slide_out_top">

        <TextView
            android:id="@+id/tv_warning_content1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:ellipsize="middle"
            android:gravity="center"
            android:singleLine="true"
            android:text="有预警信息有预警信息有预警信息"
            android:textColor="#000000"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_warning_content2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:ellipsize="middle"
            android:gravity="center"
            android:singleLine="true"
            android:text="当前天气状况当前天气状况当前"
            android:textColor="#000000"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_warning_content3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:ellipsize="middle"
            android:gravity="center"
            android:singleLine="true"
            android:text="123456465"
            android:textColor="#000000"
            android:textSize="16sp"/>
    </ViewFlipper>

时间:2016年5月7日

在这里个 Hack 上将详细介绍 <include /> 标签的接收,以致一些注意事项。

图片 2加多页脚暗意图

即便:今后有那样一个急需,为运用中的每一种页面都助长叁个页脚。这里差不离管理,要加上的页脚正是壹位展览馆示应用名称的文本(使用 TextView 来突显),如上海教室所示。大超级多的接收都以由多个 Activity 组成的,多少个 Activity 日常对应多少个布局文件。那是或不是要把那个页脚 TextView 叁个个拷贝到每一个构造文件中?

听过这么一句话:当你的程序中现身大量的双重代码时您得小心了。(不是本身杜撰的,大约是其一意思,未有找到出处...)

诚然是这么,不要把生机勃勃段相符的代码随处“复制/粘贴”,有三个很显著的流弊摆在日前,假若未来须要修改这段代码就正剧了。

所以,要兑现上述需要“复制/粘贴”不是大家要的消除方案。杀绝该难点最简易的点子是采取<include /> 标签。当然,使用 style 来确认保障这么些页脚都使用同叁个样式也是足以的,但还未 <include /> 标签简便,再说 style 的最首要意义可不是用来解决重复代码难点的。

好了须要鲜明的,看看怎么贯彻。

首先,始建二个页脚布局 footer_app_name.xml:

<?xml version="1.0" encoding="utf-8"?><TextView xmlns:andro android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:gravity="center" android:text="AndroidHacksLayout" android:textColor="@android:color/holo_red_dark"/>

然后,应用 <include /> 为布局加多页脚 activity_hack2_1.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.diygreen.androidhackslayout.Hack2Activity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="演示使用 <include /> 标签避免代码重复"/> <!-- 插入页脚 --> <include layout="@layout/footer_app_name"/></RelativeLayout>

上边的自己要作为轨范固守规则代码很简短,为 <include /> 标签的 layout 属性钦定多个象征页脚的结构就能够。留心一点的同窗可能见到了:页脚结构中装置了 android:layout_alignParentBottom="true" 属性,那么难题来了,这一个特性是 RelativeLayout 中子控件才有用,假诺把 activity_hack2_1.xml 的根构造修改为 FrameLayout 那不就不行了吧?

图片 3根布局改善为 FrameLayout

上海教室中可以看见,将根布局改善为 FrameLayout 之后,“页脚”就不是在该页面的底层了,那要如何做了?不急,上边会交到应用方案,且三番五次往下阅读。

<include /> 标签选拔即使挺简单的,但也许有局地细节要小心,这里做个轻巧的下结论供咱们参谋。

1、在子结构中装置固然地方的演示代码中采纳的必经之路,直接在子布局中设置好全部的性质,使用的时候只要求在主结构中为 include 设置 layout 属性就能够。

诸如此比用很实惠,可是 Android 中提供了多数搭架子能力,你在子构造中设置的品质可能只适用与某几个/某生龙活虎类构造。上边的演示中正是那般,唯有主布局为 RelativeLayout 的时候页面能力在钦赐地方显得,假如替换为 FrameLayout 就展现不正确了。那就浮现了三个标题 —— 不灵活。那怎么解决吧?include 属性还会有此外黄金时代种设置方法。

2、在 <include /> 标签里设置谈到这里,那先把示例中余留的主题材料解决了,就是将 RelativeLayout 替换为 FrameLayout 之后页面地点的标题。

先看扼杀后的成效:

图片 4在 <include /> 标签里设置属性

养虎遗患方案代码:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:andro ... > ... <include android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" layout="@layout/footer_app_name"/></FrameLayout>

上边的示范代码中与根布局为 RelativeLayout 相比的最重要纠正处是在 <include /> 标签中加多了 android:layout_gravity 属性,并将其属性值设置为了 "bottom" ,那就足以确认保障页脚会在页面包车型客车平底显示了。

说明:骨子里和 style 的选择特别接近,你能够直接选取 style,也足以覆盖 style 中的一些天性。

在 <include /> 标签里设置属性经常是如此用的,上边选用增加叁个页眉作为示范:

  1. 始建页面 header_app_name.xml:
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:andro android:layout_width="0dp" android:layout_height="0dp" android:gravity="center" android:text="我是-页眉-" android:textColor="@android:color/holo_blue_dark"/>
  1. 接纳 <include /> 标签增加页眉
<include android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" layout="@layout/header_app_name"/>

成效如下:

图片 5累计页眉

注意:在演示中页面结构的上升的幅度高度都安装为 0dp 了,这么做的指标正是由 header_app_name.xml 文件的使用者在 <include /> 标签中内定layout_width 和 layout_height 属性。若是使用者不点名这七个天性,它们的暗许值都是 0dp,那便看不到页眉。

此间罗列了一些本人在采用 <include /> 标签的时候踩过的部分坑,希望大家从今将来能够绕过去。

具体意况是这么的,要是 include 一个搭架子时,并不曾给 <include /> 标签设置 id 属性,那么您一向动用 findViewById 来找 include 钦命构造中央调整件是没十分的。

不过,生龙活虎旦你为 <include /> 标签设置了 id ,就无法一直把它里面包车型地铁控件当成主布局文件中的控件来直接拿到了,必得先获得那一个<include /> 标签钦赐的结构文件,再通过该构造文件 findViewById 来收获其子控件。

Android 的毛病追踪系统中告知过二个欠缺,破绽的题目是:“<include /> 标签失效了,假设想通过 <include /> 标签的特性覆盖被含有的结构所钦赐的属性是船到江心补漏迟的。”。

其生龙活虎 issue 描述的标题在自然水准上是情有可原的,难点出在就算想在 <include /> 标签中覆盖被含有构造所钦定的此外 android:layout_* 属性,必得在 <include /> 标签中同一时候钦点 android:layout_width 和 android:layout_height 那七个天性。(参谋自:《50 Android 哈克s》)

PS:话说假如你是用 AndroidStudio 的话,恐怕根本就不会遇见那几个标题,因为,若是你在内定其余的 android:layout_* 属性时,若无同一时候钦点 android:layout_width 和 android:layout_height 那五个属性,AndroidStudio 是会报错的:

图片 6提示增加layout_width 和 layout_height

只假若部分比较轻便,include 进来未来没有需求有过多操作的,使用 <include /> 完全能够胜任了。对于部分相比较复杂,何况要拉长超多响应事件等的利用景况,提出接纳自定义控件。要是照旧采用<include /> 标签,那么不可防止在 Java 代码中又得写一批形似的代码来增多相应逻辑。

AndroidHacks合集布局篇个人博客示例用到代码见:Hack2Activity.javaactivity_hack2_1.xmlactivity_hack2_2.xmlheader_app_name.xmlfooter_app_name.xml

publicvoidsetCompoundDrawables(Drawableleft,Drawabletop,Drawableright,Drawablebottom);

背景文件:warning_bg.xml

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid android:color="#34000000"/>
    <corners android:radius="80dp"/>

</shape>

看似调用方法如下:1.在XML中使用

切入动画:slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="1000"
        android:fromYDelta="100%p"
        android:toYDelta="0" />
</set>
android:drawableLeft="@drawable/icon"

切出动漫:slide_out_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="1000"
        android:fromYDelta="0"
        android:toYDelta="-100%p" />

</set>

只顾:就算不在构造文件里设置: android:autoStart="true", 能够在代码中动态设置开头循环mViewFlipper.startFlipping(卡塔尔(قطر‎;
在Activity中显示正常,但在fragment中可能会有重影的现象。

2.代码中动态变化

情势二、使用三方框架