@id和@ + id有什么区别?

Jui*_*iCe 28 xml android

我刚刚开始使用android,并完成了大约5个布局文件.但是,我才意识到我一直在使用@id和@ + id,但我不确定两者之间的确切区别.

Sim*_*iak 44

您需要在@+id为视图定义自己的Id时使用.

完全来自docs:

字符串开头的at符号(@)表示XML解析器应解析并扩展ID字符串的其余部分,并将其标识为ID资源.加号(+)表示这是一个新的资源名称,必须创建并添加到我们的资源中(在R.java文件中).Android框架提供了许多其他ID资源.引用Android资源ID时,您不需要加号,但必须添加android包命名空间.

现在我为你添加实际例子:

<Button 
   android:id="@+id/start"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
/>

<Button 
   android:id="@+id/check"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_below="@id/start"
/>
Run Code Online (Sandbox Code Playgroud)

所以在这里,你创建了两个IDs,开始和检查.然后,在您的应用程序中,您可以使用它连接到它们findViewById(R.id.start).

android:layout_below="@id/start"指的是现有的id.start,意味着你Button的id 检查将位于Buttonid start的下方.

  • 这些ID是在编译时一起生成的,还是在某种意义上命令重要?我习惯只使用+作为新id的第一个实例,但是当我有类似`android:layout_below ="@ + id/start"`的东西后面跟``android:id ="@ id的实际视图/ start"`,预览器容易混淆,不会创建显示.解决方法是要么既要有`@ + id`,要么在@ + id/start`之前有`@ id` (2认同)

Shi*_*yal 5

所有其他答案都忘记提及这件小事。

当使用@id/来引用一个已经生成的android 资源时,请确保你引用的资源是早先而不是晚定义的。

那不是这个:

<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start" 
 />
<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
Run Code Online (Sandbox Code Playgroud)

用这个:

<Button 
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
<Button 
 android:id="@+id/check"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_below="@id/start"
 />
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您指的是在访问它后生成的资源@id/start。虽然这适用于原生 android,但如果您打算在 react-native 或 ionic 或任何其他混合平台中使用此代码,则会生成资源未找到错误。

所以在使用它作为@id/之前要小心生成资源id