Android'de “@ id /” ve “@ + id /” arasındaki fark


456

Arasındaki ı artışlar nedir @id/ve @+id/?

In @+id/artı sembolü +talimatını Yeni kaynak adı oluşturmak için ve giriş eklemek R.javadosyası ama ne hakkında @id/? Aşağıdakilerin belgelerinden ID: bir Android kaynağına referans verirken ID, artı sembolüne ihtiyacınız yoktur, ancak android paketi ad alanını eklemelisiniz, örneğin:

android:id="@android:id/list"

Ancak aşağıdaki resimde Eclipse herhangi bir şey önermiyor @android:id/.

@ / İd ve ​​@ + / id için öneriyi gösteren resim

Are @id/ve @android:id/aynı?


Android belgelerinden: (bunu bulmak sonsuza dek sürdü ve ilgisiz bir konu arıyordum) developer.android.com/guide/topics/resources/…
Juan Bonfante

Yanıtlar:


351

Eğer başvurmak Android resourcesile zaten Android sisteminde tanımlandıkları, @android:id/..tanımladığınız erişimin kaynaklarına ederken / projenizde oluşturulan, kullanmak@id/..

Daha fazla bilgi

Sohbetteki açıklamalarınıza göre, böyle bir sorununuz olduğunu söylediniz:

Eğer kullanırsak android:id="@id/layout_item_id"işe yaramıyor. Bunun yerine @+id/çalışıyor, buradaki fark nedir? Ve bu benim asıl sorumdu.

Bağlamına bağlı olarak, XML özelliğini kullandığınızda, android:idyeni bir kimlik belirtiyorsunuz ve ayrıştırıcıya (veya oluşturucu olarak adlandırın) yeni bir giriş oluşturmasını R.javasöylüyorsunuz, bu nedenle bir +işaret ekleyin .

Diğer durumda, örneğin android:layout_below="@id/myTextView", önceden oluşturulmuş bir kimliğe başvuruyorsunuz, bu nedenle ayrıştırıcı bunu zaten oluşturulan kimliğe bağlar R.java.

Daha Fazla Bilgi Tekrar

Sohbette dediğin gibi android:layout_below="@id/myTextView", kimliğine sahip bir öğeyi myTextViewkullandığın öğeden sonra yazılmışsa tanımayacağını unutma .


142
"Tekrar Daha Fazla Bilgi" ile ilgili olarak: Pozisyonu ile android:layout_below="@+id/myTextView"tanımlayabilir ve SONRA elemanın kendisini ile tanımlayabilirsiniz android:id="@id/myTextView".
Ocak

1
@MarcoW Bu bana çok yardımcı oldu. Bu soruna çözüm bulmakta zorlandım (ya da daha doğrusu doğru arama girişini formüle ederek). Sanırım kendi başına bir soru + cevabı hak edebilir.
David Miler

Teşekkür ederim! Aynı sorunu yaşadım ve belgeler bu konu hakkında fazla bir şey söylemiyor. Ama belli: Burada yaşadığımız sorun sık değil ...
caw

7
Her zaman @ + id / android'de kullanıyorum: id ve android: layout_below, bu bir sorun mu?
melanke

4
@melanke: Tanmay Mandal'ın güzel (henüz yetersiz) cevabında bahsettiği gibi +içine koymak da gerçekten iyi . Bu nedenle, olumsuz çalışma zamanı etkisi de yoktur (derleme süresinde muhtemelen ölçülemeyecek kadar küçük bir artış ^ ^). layout_belowandroid:idThe '+' means to create the symbol if it doesn't already exist
Levite

86

+ işareti, kimliği kaynak kimlikleri listenize eklemek için kullanılan bir kısayoldur. Aksi takdirde, bunları böyle bir xml dosyasında bulundurmanız gerekir

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@schwiz: Peki bunu mizanpajımızda nasıl kullanabiliriz?
Vikas Patidar

7
cevabımda tanımladığım kaynak dosyasına sahip olduğunuzu hayal edin, o zaman düzeninizde sahip olabilirsiniz <View android:id="@id/my_logo"/> Yukarıda tanımladığım kaynak dosyasına sahip değilseniz, <View android:id="@+id/my_logo"/> not gibi yapmanız gerekir: + kimliğini bir kez yapmanız yeterlidir başka bir düzen dosyasında <Görünüm android: id = "+ id / my_logo" /> bir düzende bir dahaki sefere kullandığınızda '+' karakterini eklemeniz gerekmez.
Nathan Schwermann

@schwiz: Tamam o yararlıdır ama nerede o dosyayı koymak zorunda res/drawable/ya res/layout/ya res/values/o dosyanın adı olacaktır ve ne? Bununla ilgili faydalı bir bağlantınız varsa, lütfen buraya gönderin.
Vikas Patidar

1
Kaynaklarınız için adlandırma kuralları vb. Hakkında bilmeniz gereken her şey. Dosyayı res / değerleri / içine koyarsınız ve kural kimlikleri adlandırmaktır, ancak istediğiniz her şeyi çağırabilirsiniz. developer.android.com/guide/topics/resources/…
Nathan Schwermann

46

Bazen mizanpaj dosyalarınızda referanslar görürsünüz:

<listview id="@+id/android:list">

ve

<listview id="@android:id/list">

Fark ne?

.. ☺'den istediğine sevindim

@+id/foouygulamanızın ad alanında foo adında bir kimlik oluşturduğunuz anlamına gelir. Bunu kullanarak başvurabilirsiniz @id/foo. @android:id/fooandroid ad alanında tanımlanan bir kimliğe başvurduğunuz anlamına gelir.

'+', Henüz mevcut değilse sembolü oluşturmak anlamına gelir. Android: sembollerine referans verirken buna ihtiyacınız yoktur (ve kullanmamalısınız), çünkü bunlar sizin için platform tarafından zaten tanımlanmıştır ve yine de bu ad alanında kendi adınızı oluşturamazsınız.

Bu ad alanı çerçevenin ad alanıdır. Örneğin, kullanmanız gerekir, @android:id/listçünkü bu çerçevenin bulmayı beklediği kimlik .. (çerçeve sadece android ad alanındaki kimlikleri bilir.)

Bu kaynaktan tamamen kopyalandı


6
Vızıldamak!! CTRL + C sonra CTRL + V'yi tamamlayın. Orijinal gönderiye de referans verdiğiniz için memnunum. bu arada blogun mu?
Aman Alam

Eğer Button türünde 1st layout @ + id / mybutton bildirimi varsa, bu yüzden 2. düzende sadece @ id / mybutton gibi kullanılırsa yeni bir örnek oluşturmaya gerek yoktur. doğru mu ?
Hiren Dabhi

39

Kısacası

android:id="@+id/my_button"

+ id Plus işareti, Android'e Kaynaklarda yeni bir kimlik eklemesini veya oluşturmasını söyler.

süre

android:layout_below="@id/my_button"

sadece zaten oluşturulan kimliği referans yardımcı olur ..


9

+Kaynak türünden önceki artı işareti ( ) yalnızca bir kaynak kimliği ilk kez tanımlarken gereklidir. Uygulamayı derlediğinizde, SDK araçları projenizin R.javadosyasında EditTextöğeye başvuran yeni bir kaynak kimliği oluşturmak için kimlik adını kullanır . Kaynak kimliği bu şekilde bir kez bildirildiğinde, kimliğe yapılan diğer referansların artı işaretine ihtiyacı yoktur. Artı işaretini kullanmak yalnızca yeni bir kaynak kimliği belirtirken gereklidir ve dizeler veya düzenler gibi somut kaynaklar için gerekli değildir. Kaynak nesneleri hakkında daha fazla bilgi için yan kutuya bakın.

Gönderen: https://developer.android.com/training/basics/firstapp/building-ui.html



6

Gönderen Geliştirici Kılavuzunda :

android:id="@+id/my_button"

@Dizenin başındaki at-symbol ( ) yöntemi, XML ayrıştırıcısının kimlik dizesinin geri kalanını ayrıştırması ve genişletmesi ve onu bir kimlik kaynağı olarak tanımlaması gerektiğini belirtir. Artı işareti ( +), bunun yaratılması ve kaynaklarımıza ( R.javadosyada) eklenmesi gereken yeni bir kaynak adı olduğu anlamına gelir . Android çerçevesi tarafından sunulan başka kimlik kaynakları da vardır. Bir Android kaynak kimliğine başvururken, artı sembolüne ihtiyacınız yoktur, ancak androidpaket ad alanını aşağıdaki gibi eklemelisiniz :

android:id="@android:id/empty"


4

Eclipse ile ilgili bir hata var, bazen yeni bir tane oluşturduysanız @+id/.., projeyi temizledikten sonra bile R.java dosyasına hemen eklenmeyecek. Çözüm Eclipse'i yeniden başlatmaktır.

Bence bu mümkün olan en kısa sürede çözülmelidir, çünkü bazı geliştiricileri sözdiziminde yanlış bir şey olduğunu düşünmekle karıştırır ve hata ayıklayacak hiçbir şey olmasa bile hata ayıklamaya çalışır.


3
Android Studio'ya geçip asla geriye bakmamamın nedenlerinden biri :) (Cevabınızı yazdığınızda henüz orada olmadığını biliyorum)
Konrad Morawski

4

Android, XML dosyaları için değerlerin depolandığı kaynaklar adı verilen bazı dosyaları kullanır.

Şimdi bir XML nesnesi için @ id / kullandığınızda, zaten değer dosyalarında kayıtlı olan bir kimliğe başvurmaya çalışıyor. Diğer yandan, @ + id / komutunu kullandığınızda, değer dosyalarına '+' sembolünün ima ettiği gibi yeni bir kimlik kaydeder.

Bu yardımcı olur umarım :).


4

@id/ve @android:id/aynı değil.

@id/uygulamanızdaki referans kimliği, @android:id/Android platformundaki bir öğeye referans verme.

Tutulma yanlış.


Yor diyor ki @id/ referencing ID in your applicationAma eclise Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')onu uygulama kaynağına başvurmak için kullandığımızda veriyor . Öyleyse @id/ve arasındaki fark @+id/nedir? Tutulmanın yanlış olduğunu nasıl söyleyebilirsin?
Vikas Patidar

1
Bir @android: id önerisi göstermemeniz durumunda tutulma yanlıştır. Ve yanılıyorsunuz, @ id / myId'yi @ + id / myId ile bir yerde bildirmeden kullanıyorsanız. Tüm @ id / xxx, @ + id / xxx kullanılarak uygulamanızın herhangi bir yerinde bildirilmelidir.
Olegas

Açıklaman için teşekkürler. Burada tutulmanın yanlış olmadığını düşünüyorum, bunun yerine düzen öğelerimizin bağlamına dayalı öneri gösteriyor. Görüldüğü gibi @id/sadece durumundaRelativeLayout
Vikas Patidar

2

Arasındaki fark @+idve @idgeçerli:

  • @+idR.javadosyadaki bir görünüm için bir kimlik oluşturmak amacıyla kullanılır .
  • @id R.java dosyasındaki görünüm için oluşturulan kimliği belirtmek için kullanılır.

Biz kullanmak @+idile android:id="", ama ne kimliği oluşturulmaz ve biz (İleri başvuruda) yaratıldı önce atıfta eğer.

Bu durumda @+idid oluşturmak için kullanmalıyız ve görünümü tanımlarken ona başvurmalıyız.

Lütfen aşağıdaki kodu inceleyin:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

Yukarıdaki kodda, Spinner için id @+id/spinnerdiğer görünümde oluşturulur ve spinner'ı tanımlarken yukarıda oluşturulan kimliğe atıfta bulunuruz.

Bu nedenle, görünüm oluşturulmadan önce görünümü kullanıyorsanız, kimliği oluşturmamız gerekir.


1

Arasındaki fark “@+id/”ve “@id/”Android'de

Birincisi IDbelirli ui bileşenini oluşturmak için kullanılır, diğeri ise belirli bileşeni belirtmek için kullanılır


1

Görünüm öğe aynı işlemi gerçekleştirir ise, kullanabilirsiniz @+id, çünkü çoklu derleme sırasında herhangi düzende her giriş için dosya yalnızca bir numaralandırma oluşturur. Örneğin, aynı işlemi gerçekleştiren her sayfada bir kaydet düğmesi varsa , her düzende kullanırım. R.java dosyasının button_save için yalnızca bir girişi vardır.@+id/fooR.javaandroid:id="@+id/button_save"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.