问题
I wrote a simple layout which has an EditText, but it's showing the following warning message:
“No label views point to this text field”
While searching I found this and it solved that warning message,
but did not get difference between both attributes android:id and android:labelFor. Any clarification?
回答1:
android:id
Supply an identifier name for this view, to later retrieve it with
View.findViewById()orActivity.findViewById(). This must be a resource reference; typically you set this using the @+ syntax to create a new ID resources. For example: android:id="@+id/my_id" which allows you to later retrieve the view withfindViewById(R.id.my_id).Must be a reference to another resource, in the form
"@[+][package:]type:name"or to a theme attribute in the form "?[package:][type:]name".This corresponds to the global attribute resource symbol id.
android:labelFor
public static final int labelFor
Specifies the id of a view for which this view serves as a label for accessibility purposes. For example, a TextView before an EditText in the UI usually specifies what infomation is contained in the EditText. Hence, the TextView is a label for the EditText.
Must be an integer value, such as "100".
This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.
Constant Value: 16843718 (0x010103c6)
UPDATE:
For example -
<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>
Reference: android:id and android:labelFor.
回答2:
The labelFor is an attribute for accessibility options. You assign this to a label so that if, on a form , user clicks a EditText field , android can know what to read (TalkBack for low vision users) to user.
The id Supply an identifier name for this view, to later retrieve it with View.findViewById() or Activity.findViewById().
回答3:
android:id defines the ID of this view.
android:labelFor references the ID of another view.
回答4:
If an app’s user interface already provides a text label for the editable item, define
android:labelForon the labelingViewto indicate which item the label describes.
<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>
For more details: Android Accessibility - How to provide content labels
回答5:
in addition to all answers if u don't use xml files for apps this is a brief explanation what for serves VIEW ID :
(btw in my opinion using xml sucks - my only xml file is manifest :D generated by gradle)
@IdRes - annotation for resource 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. ID is mandatory to preserve state of hierarchy view when Activity.onSaveInstanceState(Bundle) is used - so if u create in code (VIEW / WIDGET / LAYOUT etc.) don't forget to set it.
来源:https://stackoverflow.com/questions/24731137/difference-between-androidid-and-androidlabelfor