RTL Layout由来

2024-05-24 04:38
文章标签 rtl layout 由来

本文主要是介绍RTL Layout由来,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一。RTL Layout由来
平常我们了解的布局习惯都是:从左到右,从上到下。但在很多国家的习惯是:从右到左,从上到下。诸如阿拉伯语、希伯来语等国家就是这种习惯。那对于从右到左的习惯,Android中怎么使用LinearLayout,不好用吧,难道只能用RelativeLayout来实现。这当然不适合Android的初衷和发展。
所以,从Android 4.2开始,Android SDK支持一种从右到左(RTL,Right-to-Left)UI布局的方式,尽管这种布局方式经常被使用在诸如阿拉伯语、希伯来语等环境中,中国用户很少使用。不过在某些特殊用途中还是很方便的。
RTL Layout,就是把界面的右边作为原点,布局方式为:从右到左,从上到下。


二。RTL Layout实现
既然布局方式有从左往右,有从右往左两种。而一般默认布局都为从左往右,那么从右往左的布局如何实现呢?
1)首先要在AndroidManifest.xml文件中将<application>标签的android:supportsRtl属性值设为"true"
2)将相应视图标签的android:layoutDirection属性值设为"rtl"
就是这么简单,其实与我们从左往右的习惯没什么区别,只是要主动标明打开RTL属性而已。
3)不如举个简单例子看看吧
   首先,AndroidManifest.xml文件<application>标签添加一行:
   
[html]  view plain  copy
  1. android:supportsRtl="true"  


   再上布局文件,其中text1/text2为默认LTR布局,而text3/text4才为RTL布局。
   
[html]  view plain  copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_marginTop="30dp"  
  11.         android:orientation="horizontal" >  
  12.   
  13.         <TextView  
  14.             android:id="@+id/text1"  
  15.             android:layout_width="100dp"  
  16.             android:layout_height="70dp"  
  17.             android:background="#000000"  
  18.             android:gravity="center"  
  19.             android:text="text 1"  
  20.             android:textColor="#FFFFFF"  
  21.             android:textSize="40sp" />  
  22.   
  23.         <TextView  
  24.             android:id="@+id/text2"  
  25.             android:layout_width="100dp"  
  26.             android:layout_height="70dp"  
  27.             <span style="color:#ff0000;">android:layout_marginLeft="30dp"</span>  
  28.             android:background="#000000"  
  29.             android:gravity="center"  
  30.             android:text="text 2"  
  31.             android:textColor="#FFFFFF"  
  32.             android:textSize="40sp" />  
  33.     </LinearLayout>  
  34.   
  35.     <LinearLayout  
  36.         android:layout_width="match_parent"  
  37.         android:layout_height="wrap_content"  
  38.         android:layout_marginTop="30dp"  
  39.         <span style="color:#ff0000;">android:layoutDirection="rtl"</span>  
  40.         android:orientation="horizontal" >  
  41.   
  42.         <TextView  
  43.             android:id="@+id/text3"  
  44.             android:layout_width="100dp"  
  45.             android:layout_height="70dp"  
  46.             android:background="#000000"  
  47.             android:gravity="center"  
  48.             android:text="text 3"  
  49.             android:textColor="#FFFFFF"  
  50.             android:textSize="40sp" />  
  51.   
  52.         <TextView  
  53.             android:id="@+id/text4"  
  54.             android:layout_width="100dp"  
  55.             android:layout_height="70dp"  
  56.             <span style="color:#ff0000;">android:layout_marginRight="30dp"</span>  
  57.             android:background="#000000"  
  58.             android:gravity="center"  
  59.             android:text="text 4"  
  60.             android:textColor="#FFFFFF"  
  61.             android:textSize="40sp" />  
  62.     </LinearLayout>  
  63.   
  64. </LinearLayout>  


   最后看看效果图
   


三。marginStart、marginEnd
从上面例子看出,text1/text2为默认LTR线性布局,text2到text1之间的间距用了属性android:layout_marginLeft="30dp";而text3/text4的RTL线性布局中,text4到text3之间的间距用了属性android:layout_marginRight="30dp"
同样是线性布局,同样是第二个控件到第一个控件之间的间距,一个用marginLeft、一个用marginRight,是不是有点乱?是不是不够统一?
Android当然有解决办法,就是引入marginStart、marginEnd这两个属性。
android:layout_marginStart:如果在LTR布局模式下,该属性等同于android:layout_marginLeft。如果在RTL布局模式下,该属性等同于android:layout_marginRight。
android:layout_marginEnd:如果在LTR布局模式下,该属性等同于android:layout_marginRight。如果在RTL布局模式下,该属性等同于android:layout_marginLeft。



四。警告解决方法
既然warning中提到layout_marginStart比layout_marginLeft好,那么把layout_marginLeft换成layout_marginStart不就可以了吗?
直接报错:
To support older versions than API 17 (project specifies 8) you should *also* add android:layout_marginLeft="30dp"
正如上面提到的,RTL Layout是从Android 4.2开始才支持的,之前的版本当然不兼容,那怎么办呢?

解决办法就是layout_marginStart和layout_marginLeft两个属性同时使用,Android会根据版本选择使用。如下:

[html]  view plain  copy
  1.     <LinearLayout  
  2.         android:layout_width="match_parent"  
  3.         android:layout_height="wrap_content"  
  4.         android:layout_marginTop="30dp"  
  5.         android:orientation="horizontal" >  
  6.   
  7.         <TextView  
  8.             android:id="@+id/text1"  
  9.             android:layout_width="100dp"  
  10.             android:layout_height="70dp"  
  11.             android:background="#000000"  
  12.             android:gravity="center"  
  13.             android:text="text 1"  
  14.             android:textColor="#FFFFFF"  
  15.             android:textSize="40sp" />  
  16.   
  17.         <TextView  
  18.             android:id="@+id/text2"  
  19.             android:layout_width="100dp"  
  20.             android:layout_height="70dp"  
  21. <span style="color:#ff0000;">            android:layout_marginLeft="30dp"  
  22.             android:layout_marginStart="30dp"</span>  
  23.             android:background="#000000"  
  24.             android:gravity="center"  
  25.             android:text="text 2"  
  26.             android:textColor="#FFFFFF"  
  27.             android:textSize="40sp" />  
  28.     </LinearLayout>  

这篇关于RTL Layout由来的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997398

相关文章

ConstraintLayout布局里的一个属性app:layout_constraintDimensionRatio

ConstraintLayout 这是一个约束布局,可以尽可能的减少布局的嵌套。有一个属性特别好用,可以用来动态限制宽或者高app:layout_constraintDimensionRatio 关于app:layout_constraintDimensionRatio参数 app:layout_constraintDimensionRatio=“h,1:1” 表示高度height是动态变化

Vulkan描述符、描述符Pool、Layout概念

1、DescriptorSetLayout为了组织和管理着色器资源(如缓冲区、纹理、采样器等),多个相同类型的Descriptor放在一个Layout中以优化GPU对资源的访问   //DescriptorSetLayout定义了哪些描述符Descriptor类型(Buffers、Textures、Samplers)可以包含在其中 VkDescriptorSetLayoutBinding

【POJ】3169 Layout 【HDU】3592 World Exhibition 差分约束

传送门:  【POJ】3169 Layout、【HDU】3592 World Exhibition 题目分析:我会说我只是凭直觉写的吗。。。。。。。 如果有B-A>=C形式的,则建边(B,A,-C)。 如果有B-A<=C形式的,则建边(A,B,C)。 对所有的点X,建边(X,X-1,0)。 最后跑一遍最短路。如果存在负环输出-1,如果点N不可达输出-2,否则输出点N的值(最短路径长

Scala界面Panel、Layout初探

示例代码: package com.dt.scala.guiimport scala.swing.SimpleSwingApplicationimport scala.swing.MainFrameimport scala.swing.Buttonimport scala.swing.Labelimport scala.swing.Orientationimport scal

flutter RenderConstrainedBox object was given an infinite size during layout.

问题原因  sliapp 加上的 动态设置高度 问题 去掉 就行了 SliverToBoxAdapter(child: SizedBox(height: _getSliverToBox().toDouble()),),

如何在android style/layout文件中使用自定义属性。

自定义属性:      <declare-styleable name="facepanelStyle">         <!-- 底部Tab分割线背景 -->         <attr name="tabSpiltColor" format="color" />  </declare-styleable> Style:引用自定义属性  <style name="test">

Android开发中,fragment无法找到Layout文件问题的原因与解决

这次已经是我第二次遇到这个问题,正所谓“人可以犯错,但是不能犯同样的错误”。所以这次解决问题之后我决定写个笔记防止下次再遇到这个问题不知道怎么解决,顺便也给遇到同样问题的哥们一个帮助。 做项目的时候需要用到Fragment,但是在onCreateView()里面用inflater.inflate(R.layout.activity_main, container, false);为Fragm

HLS报错之:Export RTL报错 “ERROR: [IMPL 213-28] Failed to generate IP.“

原因:官方bug 解决办法:下载补丁(补丁适用于2014年至2021年的多个Vivado版本),并添加到对应路径下即可。 注意:windows下该方法试用。 补丁连接 我这里下载到xilinx的目录下并解压: 点进去找到该文件: 复制到scripts路径下即可 现在export RTL就正常了

Marin说PCB之TP测试的Layout设计要求

提及到TP点这个器件想必诸位道友们肯定不会陌生吧,我们的单板在量产之前都是需要做很多测试的,一般在产品研发的A版本和B版本的时候都是需要在单板上加上这个器件的。小编我最近在做一个改板,项目组为了降本增效,把单板的尺寸缩小了很多,所以很多模块都需要压缩了,小编我在细化压缩一个MCU模块布局,做完了我邮件发给了英国伦敦的同事约翰,他看完飞书给我说了虽然现在的MCU模块的布局看上去是小了很多,到是你的T

Android13 Launcher3修改Workspace布局(layout)

需求:Launcher 最基本的修改就是Workspace Hotseat AllApps的布局及出厂默认设置 修改原理: res/xml/device_profiles.xml 图标的横竖排数量、图标大小、各种尺寸和间距主要是由device_profiles.xml这个配置文件来定义的。 DeviceProfile.java device_profiles.xml是由DeviceProfi