Android: Selbe ID in mehreren Activities
lima-city → Forum → Programmiersprachen → Java
adresse
button
code
datei
gleichen button
idee
import
item
komischen zahl
layout
machen
test
unterschied
unterschiedliche objekte
unterschiedliche ressourcen
url
verschiedene ressourcen
zahl
zeichen
zugreifen
-
Servus,
ich beschäftige mich seit kurzem mit Android Programmierung und ich verstehe eine Saceh bezüglich IDs nicht:
Warum kann ich in mehreren Layouts die selbe ID definieren und trotzdem problemlos darauf zugreifen?
Also ein Beispielcode:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Next" /> </LinearLayout>
MainActivity.java
package com.example.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity2.class); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
activity_main2.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Previous" /> </LinearLayout>
MainActivity2.java
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_activity2); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main_activity2, menu); return true; } }
Ich verwende in beiden Activities die ID "btn", das heißt, es wird in der R.java in eine Adresse umgewandelt. Aber wenn ich doch nur eine Adresse habe, warum kann ich dann auf zwei unterschiedliche Objekte zugreifen? Ich verstehe das nicht...
Grüße
Mator -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hab auch kurz mal mit Android (insbesondere weil ich gerne Java können würde) gearbeitet. Der Unterschied zwischen den ID's ist ja
und@+id/btn
wie du noch merken wirst, nimmt Java alles extremst genau. So ist auch das fehlende Plus ein Zeichen, dass du auf 2 verschiedene Ressourcen zugreifst, die unabhängig voneinander sind.@id/btn
In diesem Stackoverflow-Post wird das ins Detail geklärt. Ein Kommentar sagt aus, dass Ecplise manchmal buggt, und einfach beim Neuanlegen ein "+" hinschummelt.
Hoffe, das hilft Dir ein bisschen,
Grüße -
Ich weiß, dass Java alles sehr genau nimmt (Programmiere ja schon seit mehreren Jahren). Und das fehlende Plus ist ein Zeichen, dass auf die selbe Adresse gezeigt wird, weil ich die ID ja in der ersten Activity erstelle. Es macht aber auch keinen Unterschied, ob ich in der zweiten das Plus verwende oder nicht. Mit getElementById bekomme ich dennoch immer das aus der aktuellen Activity. Wieso kann ich auf zwei unterschiedliche Ressourcen mit einer ID zugreifen?
-
Wow darauf wäre ich nie gekommen. Hätte gedacht in der R.java Datei würden dann zwei ID's angelegt werden. Könnte aber daran liegen, dass die Activity schaut, welche xml-Datei du als ContenView gesetzt hast. Also wie mit den Intentfiltern. Ich versuche meinen Gedankenansazt zu erklären:
In der R.java wird die ID abgelegt und mit einer komischen Zahl (0x7f....) initialisiert. Der Button bekommt sozusagen diese Zahl, wenn man ihm die ID gibt. Wenn du nun aus deiner Activity auf einen der beiden "gleichen" Button zugreifst, wird die ID bzw. die Zahl an die xml-Datei weitergegeben. Diese hat nur einen Button mit dieser ID, da sich der zweite Button ja in einer anderen xml-Datei befindet.
Weiß nicht ob ich meine Idee verständlich erklären konnte. Ist aber sowieso nur eine Idee und keine Tatsache, ob es wirklich so ist, weiß ich nämlich nicht genau -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage