kostenloser Webspace werbefrei: lima-city


Android: Selbe ID in mehreren Activities

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    m**********n

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hab auch kurz mal mit Android (insbesondere weil ich gerne Java können würde) gearbeitet. Der Unterschied zwischen den ID's ist ja
    @+id/btn
    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.
    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 :prost:
  4. Autor dieses Themas

    m**********n

    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?
  5. 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
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!