# XML Layout: wann wird geladen?



## Warrior7777 (12. Sep 2012)

Hallo miteinander!

Entschuldigung für den spartanischen Titel, ich hoffe, man versteht trotzdem, was ich meine...  Nun die ausformulierte Frage: Werden XML-Layouts beim Starten der App geladen oder zu einem anderen Zeitpunkt? Also: wenn ich eine Root ViewGroup mit findViewById() lade, erreiche ich mit getViewById() eine Referenz auf die bereits instanzierten Child Views?


----------



## schlingel (13. Sep 2012)

> Werden XML-Layouts beim Starten der App geladen oder zu einem anderen Zeitpunkt?


Kommt drauf an. Du kannst auf 3 verschiedene Arten (die mir bekannt sind) Views bzw. ViewGroups laden:
1. setContentView in der Activity
2. per LayoutInflater#inflate
3. per Java-Code instanzieren.

Sobald die ViewGroup mit Option 1 oder 2 ins Leben gerufen wurde, existieren auch ihre Kinder sofern sie im XML definiert sind.

findViewById lädt nichts sondern sucht dir nur die Referenz aus dem bereits bestehenden View-Baum heraus.


----------



## Warrior7777 (13. Sep 2012)

Ok danke genau das hatte ich gemeint! 

Also:

```
RelativeLayout root=(RelativeLayout) getLayoutInflater().inflate(R.layout.main);
View child=findViewById(R.id.child);
```
Dann ist jetzt in child eine Referenz auf das mit inflate() instanzierte Kind-Objekt vorhanden, oder?

Leider hab ich moch ein Problem. Ich habe eine Activity, die eine ListView anzeigt. Bei setAdapter() erscheint eine Fehlermeldung:
java.lang.RuntimeException: Unable to start activity ComponentInfo{[appname]/[activityname]}: java.lang.NullPointerException

Nun, der Adapter wurde durch Übergabe einer List an den Konstruktor instanziert. Ich hab das mit Breakpoint geprüft, der Adapter ist nicht leer. Daher habe ich einen anderen Verdacht. Könnte es evt. an der angegebenen Layout-Datei liegen? Hier ist sie:

[XML]<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
   	android:layout_height="wrap_content"
/>[/XML]

Hier noch der Adapter-Konstruktor:

```
adapter=new ArrayAdapter<SensorWrapper>(this, R.layout.textview, list);
```

Ich hoffe ich hab genug Infos gegeben und Ihr könnt mir helfen! 

Noch einen schönen Abend!


----------



## schlingel (14. Sep 2012)

Zeig mal den Code von der ganzen getView, vom Konstruktor des Adapters, der Stelle wo du ihn instanzierst und der Stelle wo du ihn per setAdapter der ListView zuweist.


----------



## Warrior7777 (14. Sep 2012)

Ok hier der ganze Code der Activity bis zum Fehler:

```
package ch.renatobellotti.firstapp;

//imports
//...

public class StartActivity extends Activity implements OnItemClickListener{
    
	private ArrayAdapter<SensorWrapper> adapter;
	private ListView listView;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //set the ListView
        Log.d(TAG, "test");
        setContentView(R.layout.main);
        
        Log.d(TAG, "Test");
        
        //get a list of all sensors
        SensorManager manager=(SensorManager) getSystemService(SENSOR_SERVICE);
        List<Sensor> sensors=manager.getSensorList(Sensor.TYPE_ALL);
        
        //wrap the sensors
        List<SensorWrapper> list=new LinkedList<SensorWrapper>();
        for(Sensor s: sensors){
        	list.add(new SensorWrapper(s));
        }
        
        //get the adapter
        adapter=new ArrayAdapter<SensorWrapper>(this, R.layout.textview, list);

        //set the adapter
        Log.d(TAG, "vor listView.setAdapter()");
        listView.setAdapter(adapter);
        Log.d(TAG, "nach listView.setAdapter()");
        
        listView.setOnItemClickListener(this);
    }
}
```
Die letzte Ausgabe vor der Fehlermeldung ist "vor listView.setAdapter()". Danach kommen Fehlermeldungen. Die erste habe ich oben gepostet, die anderen ergeben sich wahrscheinlich als Folge.

textview.xml hab ich auch oben gepostet. Hier ist noch main.xml:
[XML]<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    androidrientation="vertical" />[/XML]

Mir ist noch ein anderer Gedanke gekommen: Brauche ich für Sensoren eine Permission?

Wenn etwas fehlt, sagt es mir bitte! Ich hoffe Ihr wisst, was ich falsch mache. 

Noch ein schönes Wochenende!


----------



## schlingel (14. Sep 2012)

Du holst dir nirgends die Referenz auf die Listview. Deswegen ist die auch null und deswegen bekommst du eine NPE.

Die wurde zwar geladen aber du hast keine Referenz darauf um damit arbeiten zu können.

Da fehlt noch das:

listView = (ListView)findViewById(R.id.deineListview);


----------



## Warrior7777 (14. Sep 2012)

Natürlich! Dass ich das nicht selbst gesehen habe... 
Vielen Dank! Genau wegen solchen Dingen sollte man mit kleinen Probe-Apps anfangen. Dabei lernt man die Basics. Bei grösseren Programmen sollte man sich dann nicht auch noch um die Basics kümmern müssen. Nochmals vielen Dank, jetzt geht es!


----------



## Warrior7777 (15. Sep 2012)

Hab leider noch ein Problem... Ich denke mal, das geht in dasselbe hinein; ich seh aber nicht, wo der Hund begraben liegt. 


```
LayoutInflater inflater=getLayoutInflater();
    	RelativeLayout result=(RelativeLayout) inflater.inflate(R.layout.sensorinfoscreen, null);
    	TextView namecontent=(TextView) findViewById(R.id.namecontent);
```

Das Problem: result ist ok, aber namecontent ist ==null. woran könnte das liegen?:bahnhof: Die Child-Views sind nicht null, das hab ich mit Breakpoints rausgefunden. Nützlich, diese Haltpunkte! 

Ich hoffe Ihr könnt mir helfen!


----------



## schlingel (16. Sep 2012)

Wie sieht denn der Inhalt von sensorinfoscreen.xml aus?


----------



## Warrior7777 (16. Sep 2012)

[XML]<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootlayout"
    android_layout_height="fill_parent"
    android:layout_width="fill_parent">

	<!-- the name -->
	<TextView
	    android:id="@+id/name"
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:text="@string/sensor_name" />

	<TextView
	    android:id="@+id/namecontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/name"
	    android:text="@string/default_name" />

	<!-- the version -->
	<TextView
	    android:id="@+id/version"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/name"
	    android:text="@string/sensor_version" />

	<TextView
	    android:id="@+id/versioncontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/version" />

	<!--  the vendor -->
	<TextView
	    android:id="@+id/vendor"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/version"
	    android:text="@string/sensor_vendor" />

	<TextView
	    android:id="@+id/vendorcontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/vendor" />

	<!-- the type -->
	<TextView
	    android:id="@+id/type"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/vendor"
	    android:text="@string/sensor_type" />

	<TextView
	    android:id="@+id/typecontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/type" />

	<!-- the battery power -->
	<TextView
	    android:id="@+id/power"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/type"
	    android:text="@string/sensor_power" />

	<TextView
	    android:id="@+id/powercontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/power" />

	<!-- the resolution -->
	<TextView
	    android:id="@+id/resolution"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/power"
	    android:text="@string/sensor_resolution" />

	<TextView
	    android:id="@+id/resolutioncontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/resolution" />

	<!-- the maximum range -->
	<TextView
	    android:id="@+id/range"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/resolution"
	    android:text="@string/sensor_range" />

	<TextView
	    android:id="@+id/rangecontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/range" />

	<!-- the minimum delay -->
	<TextView
	    android:id="@+id/delay"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_below="@id/range"
	    android:text="@string/sensor_delay" />

	<TextView
	    android:id="@+id/delaycontent"
	    android:layout_height="wrap_content"
	    android:layout_width="fill_parent"
	    android:layout_toRightOf="@id/delay" />

	<!-- the button to return to the sensor overview -->
	<Button 
	    android:id="@+id/back"
	    android:layout_height="wrap_content"
	    android:layout_width="wrap_content"
	    android:layout_below="@id/delay"
	    android:text="@string/back_text" />
</RelativeLayout>[/XML]
Danke für Dein Interesse und Deine Hilfsbereitschaft!


----------



## schlingel (17. Sep 2012)

```
TextView namecontent=(TextView) findViewById(R.id.namecontent);
```

Ich weiß nicht genau wo das aufgerufen wird aber es sieht danach aus, als würde es innerhalb einer Activity aufgerufen. Wenn du in einer Activity findViewById aufrufst, bekommst du die View von der aktuellen Content-View zurück.

Du möchtest aber eine View aus der result-ViewGroup haben. Also musst du das so aufrufen:


```
TextView namecontent=(TextView) [B]result[/B].findViewById(R.id.namecontent);
```


----------

