android:id和android:labelFor之间的区别?

时间:2014-07-14 07:01:37

标签: android xml-attribute editbox

我写了一个简单的布局,其中有EditText,但它显示以下警告信息:

  

“没有标签视图指向此文本字段”

搜索时我发现this并解决了该警告信息, 但两个属性android:idandroid:labelFor之间没有区别。有任何澄清吗?

6 个答案:

答案 0 :(得分:47)

  

<强>机器人:ID

     

为此视图提供标识符名称,以便稍后检索它   View.findViewById()Activity.findViewById()。这必须是一个   资源参考;通常你使用@ +语法来设置它   创建新的ID资源。例如:android:id =&#34; @ + id / my_id&#34;哪一个   允许您稍后使用findViewById(R.id.my_id)检索视图。

     

必须是表单中对其他资源的引用   "@[+][package:]type:name"或表单中的主题属性   &#34; [包:] [类型:]。名&#34;

     

这对应于全局属性资源符号id。


  

<强>机器人:labelFor

     
    

public static final int labelFor

         

指定此视图用作其标签的视图的ID     可达性目的。例如,在EditText之前的TextView     UI通常指定EditText中包含的信息。     因此,TextView是EditText的标签。

         

必须是整数值,例如&#34; 100&#34;。

         

这也可能是对资源的引用(在表单中)     &#34; @ [package:] type:name&#34;)或theme属性(在表单中     &#34;?[package:] [type:] name&#34;)包含此类型的值。

         

常数值:16843718(0x010103c6)

  

<强>更新

例如 -

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical">
    <LinearLayout android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_width="match_parent">
     <TextView android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:labelFor="@+id/edit_item_name" 
    android:text="Item Name"/>
     <EditText android:id="@+id/edit_item_name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Item Name"/>
    </LinearLayout>
  </LinearLayout>

参考:android:idandroid:labelFor

答案 1 :(得分:12)

labelFor是辅助功能选项的属性。您将其分配给标签,以便在表单上,​​用户单击EditText字段时,android可以知道要向用户阅读的内容(针对低视力用户的TalkBack)。

id为此视图提供标识符名称,以便稍后使用View.findViewById()Activity.findViewById()进行检索。

答案 2 :(得分:2)

android:id定义此视图的ID。

android:labelFor引用另一个视图的ID。

答案 3 :(得分:1)

  

如果应用的用户界面已经为   可编辑项,在标签android:labelFor上定义View   指出标签描述的项目。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/email_subject_label"
        android:labelFor="@id/email_subject" />
    <EditText
        android:id="@+id/email_subject"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

有关更多详细信息:Android Accessibility - How to provide content labels

答案 4 :(得分:0)

除了所有答案之外,如果您不对应用程序使用xml文件,这只是对服务VIEW ID的简要说明:

(在我看来使用xml糟透了 - 我唯一的xml文件是显示:由gradle生成的D)

@IdRes - 资源ID的注释

/** define resource id for view */
@IdRes 
int TEXT_VIEW_ID  = "111111";

/** create edit tex in code */
EditText myTextView = new EditText(Context);
/** set view id */
myTextView.setID(TEXT_VIEW_ID);
/** set layout params etc then attach or inflate as u wish to view hierarchy */    

/** use view id to find view */
EditText etFound = (EditText) View.findViewById(TEXT_VIEW_ID);

PS。当使用Activity.onSaveInstanceState(Bundle)时,ID必须保留层次结构视图的状态 - 因此,如果您在代码中创建(VIEW / WIDGET / LAYOUT等),请不要忘记设置它。

答案 5 :(得分:0)

android:id 只是用于(以编程方式)访问视图的视图 ID。

android:labelFor 有时会与 lint 警告一起弹出:

<块引用>

缺少可访问性标签:提供带有 'android:labelFor' 引用此视图或提供 '安卓:提示'

因此,例如:如果您有一个不描述自身的 EditText,Android 想知道您是否可能有一些标题或文本 (TextView) 可以描述 EditText 的用途。 因此,引用 TextView 的 id 基本上可以让您了解在无障碍模式下将什么内容放入 EditText 及其文本中。

见: https://developer.android.com/guide/topics/ui/accessibility/principles#editable