《第一行代码》笔记2—UI之—常用属性与片段

Android开发之UI常用属性

介绍控件和布局中的一些属性和片段


属性篇

1.属性android:visibility

(所有控件中都具有的属性,在progressbar中较常用)
可选值有三种:visible、invisible、gone
invisible表示控件不可见,但它仍然占据着原来的位置和大小
gone表示控件不可见&控件不占用屏幕空间

还可以在代码中设置控件的可见性:
setVisibility(View.VISIBLE);传入View.VISIBLE、View.INVISIBLE或View.GONE三种值

  • 关于android中调用某个样式或者属性时应该用@还是用?的问题,例如:
style="?android:attr/progressBarStyleHorizontal"

关于用@还是用?的问题,具体解释请点这里

2.dp和sp、dip、px、pt之间的换算问题

  • dp(密度无关的像素),一种基于屏幕密度的抽象单位,2英寸3英寸的320像素480像素中,屏幕密度为320/2=160dip。即在每英寸160点的显示器上,1dp=1px。
    (密度为160时,1dp=1px;密度为320时,1dp=2px)
  • sp(与刻度无关的像素,指定文字大小):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
  • dip 与dp相同
  • px 分辨率
  • pt(磅),1/72英寸。
    一般Android设置长宽多用dip,设置字体多用sp,在屏幕密度为160时,说明每英寸有160个px,即160px=1in。又因为此时有1sp=1dip=1px(在屏幕密度160的特定条件下),所以有160sp=1in,再加上1pt=1/72in,即72pt=1in,所以72pt=160sp,化简得1pt≈2.22sp(是一道换算题哦(/▽\))

PS:分辨率与密度的概念:分辨率指相对于软件来说的显示像素,以px为单位;密度表示每英寸有多少个像素,density=240->用hdpi标签的资源,density=160->mdpi,density=120->ldpi

3. 点9图

左和上绘制的线代表拉伸区域,右和下绘制的线代表内容被放置区域

4.碎片(Fragment)

属于UI片段
让程序更加合理地利用大屏幕的空间
像这样:

未合理利用空间

利用了Fragment之后的效果

Amazing!!!

image.png

Fragment的用法

  • 导包问题
    创建Fragment类所继承的包使用support-v4,因为它可以让碎片在所有Android系统版本中保持功能一致性
    而且不需要将该包的依赖添加到build.gradle,因为build.gradle中添加的appcompat-v7库会将support-v4库一起引入进来。

  • Activity布局文件中引入fragment时
    需要在xml文件中的<fragment>标签中添加name属性用来指定Fragment的类,如下:

  • 动态添加碎片的用法
    关键步骤:
动态添加碎片的关键步骤

R.id.right_layout表示界面中的一块布局区域的id,如FrameLayout布局的id。

具体步骤为:

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在活动中可直接通过getSupportFragmentManager()方法得到
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器内添加替换碎片
  5. 提交事务,调用commit()方法来完成

这里有个大坑:
需要让每个自定义的Fragment类继承自android.support.v4.app.Fragment类。
切记!! android.support.v4.app.Fragmentandroid.app.Fragment不要混用。

MainActivity类要继承FragmentActivity类或者AppCompatActivity类,不然在第二步的getSupportFragmentManager()方法找不到,会报Cannot resolve method 'getSupportFragmentManager()'错误。

如果使用的是AppCompatActivity类,则需要将theme改成Theme.AppCompat或其派生类,否则会报以下错误:
You need to use a Theme.AppCompat theme (or descendant) with this activity.

  • 在碎片中模拟返回栈(按下返回键不是直接退出程序,而是返回上一个fragment中)
将fragment加入回退栈

其中的参数是用于描述返回栈状态的名字

  • 碎片和活动之间进行通信
  1. 在碎片中获取活动的实例:
MainActivity activity=(MainActivity)getActivity();
  1. 在活动中获取碎片的实例:
RightFragment rightFragment=(RightFragment)getFragmentManager().findFragmentById(R.id.right_fragment);
  1. 碎片和碎片之间互相调用:

先在碎片中调用相关联的活动,在用这个活动去调用碎片

  • fragment的生命周期
    运行状态:可见&&关联的活动在运行
    暂停状态:活动进入暂停状态时
    停止状态:活动进入停止状态||通过调用FragmentTransactionremove()replace()方法从活动中移除&&事务提交之前用了addToBackStack()方法
    销毁状态:活动被销毁时||通过调用FragmentTransactionremove()replace()方法从活动中移除&&事务提交之前没有用用addToBackStack()方法
  1. 其它回调:
    onAttach()---碎片和活动建立关联
    onCreateView()---为碎片创建视图(加载布局)时调用
    onActivityCreated()---与之关联的活动已创建完毕时
    onDestroyView()---碎片关联的视图被移除时
    onDetach()--碎片和活动解除关联时
    上一个糊糊的图:(✿◡‿◡)
碎片生命周期
  • 动态加载布局的技巧
  • 使用限定符
    Qualifier:在运行时,根据屏幕大小判断是使用单页模式还是双页模式
    使用步骤:
  1. 在layout目录下的main_activity.xml中只写一个<fragment>,在res目录下再写一个layout-large目录,写两个<fragment>,代表双页模式,“large”就是限定符,屏幕被认为是large的设备就会自动加载layout-large文件夹下的布局,而小屏幕的设备还是会加载layout文件夹下的布局。
常见的限定符表
  • 碎片的屏幕适配
    判断单页和双页:
    在onActivityCreated()方法中判断:
getActivity().findViewById(R.id....)!=null

判断能否找到对应id的View,来设置是单页模式还是双页模式,能找到则说明在xml文件中定义了该View,这时可以刷新对应的fragment中的内容:

RightFragment fragment=(RightFragment)getFragmentManager().findFragmentById(R.id....);
fragment.refresh(String stra,String strb);

如果找不到则可以开启单独的Activity来显示内容:

SecondActivity.actionStart(getActivity(),str1,str2...);

actionStart是SecondActivity中的一个静态方法,在该方法中打开另一个Activity的话,需要将MainActivity的Context用参数的方式传递过去,而且还需要为SecondActivity添加flag,使SecondActivity放到另一个独立的任务栈中,具体关于flag的笔记将写在《Android开发艺术探索》笔记中。

fragment相关的代码点这里

5. android:layout_weight属性

android:layout_width="0dp"
android:layout_weight="1"
  • 如果多个同级控件一起定义了这两个属性,而父布局是android:layout_width="match_parent"或android:layout_width="wrap_content"时,两个控件在水平方向上平分宽度,原理是系统按照该属性指定的值(上面的例子是“1”)在水平方向上所有控件的layout_weight值的比例划分宽度,值越大,划分宽度越大。

  • 如果是如下情况:

<LinearLayout>
  <EditText
    ...
    android:layout_width="0dp"
    android:layout_weight="1"
  />
  <Button
    ...
    android:layout_width="wrap_content"
  />
</LinearLayout>

表明Button的宽度仍然按照wrap_content来计算,而EditText会占满屏幕所有的剩余空间。

6. gravity和layout_gravity属性

android:gravity用于设置View中内容相对于View组件的对齐方式;
android:layout_gravity用于设置View组件相对于Container的对齐方式。
说的再直白点,就是android:gravity只对该组件内的东西有效,android:layout_gravity只对组件自身有效。
android:layout_gravity 只在 LinearLayout 和 FrameLayout 中有效

在LinearLayout中:
android:orientation=vertical (垂直) 时,只有水平方向的left,right,center_horizontal是生效的。
android:orientation=horizontal (水平) 时,只有垂直方向的top,bottom,center_vertical是生效的。

在FrameLayout布局中:
任意android:layout_gravity属性都有效


到这里UI的属性和片段介绍就记完了,后续对这部分有所领悟还会继续添加内容(^^ゞ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容