# NullPointerException bei Zuweisungen zum SeekBar-Objekt



## Gast2 (2. Okt 2012)

Hi,

Ich habe eine *SeekBar *angelegt und das Objekt erzeugt (skb_regler = ...).
Aber sobald ich dem Objekt etwas übergeben möchte
(siehe *Zeilen 12, 13 und 29*), 
erhalte ich ein *NPE*.

Hier die xml:
[XML]    <SeekBar
        android:id="@+id/seekBar_counter1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:max="@integer/max_skb_sensorsensibility" />[/XML]

In meiner Main_Activity.java habe ich...

```
public class MainActivity extends Activity implements OnClickListener,
OnSeekBarChangeListener { ...
	SeekBar skb_regler;

	public void onCreate(Bundle savedInstanceState) {
		seekbarData();
        }


	private void seekbarData() {
		skb_regler = (SeekBar) findViewById(R.id.seekBar_counter1);
//		skb_regler.setMax(5);
//		skb_regler.setProgress(inFrontCountSeconts);
	}


	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.mnu_count1:
			getCount();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private void getCount() {
		setContentView(R.layout.before_count_down);
//		skb_regler.setOnSeekBarChangeListener(this);
		btn_menu_info_back = (Button) findViewById(R.id.btn_mnu_zu_start);
		btn_menu_info_back.setOnClickListener(this);
		txv_skb_sec = (TextView) findViewById(R.id.txv_skb_sec);
		txv_skb_sec.setText(mainCountSeconds + "");
	}
```

*Warum kann ich nix zuweisen???* ???:L


----------



## schlingel (2. Okt 2012)

Weil du kein setContentView im onCreate aufrufst und dementsprechend kein Layout gesetzt ist. Ohne Layout liefert findViewById immer null zurück.


----------



## Gast2 (2. Okt 2012)

Ne, 
ich mein doch,
setContentView habe ich aufgerufen.

Die an sich selbstverständlichen Dinge habe ich weggelassen zu zeigen.
So wie der Code oben zu sehen ist (plus dem, was ich aus Platzgründen nicht mit reingestellt habe),
läuft das Programm durch,
da die drei Zeilen, welchen die NPE liefern,
auskommentiert sind.

Nur wenn ich eine der drei Zeilen wieder zum Programm hinzunehme, gibt es eine NPE.

Frank


----------



## Gast2 (2. Okt 2012)

und nebenbei,
ich habe auch weitere Menüpunkte, die alle funktionieren
(jedes in eigener layout.xml).


----------



## SlaterB (2. Okt 2012)

> setContentView habe ich aufgerufen.
meinst du anderen nicht geposteten Code oder den Aufruf in getCount() im geposteten Code?
der wird doch sicher erst relativ spät ausgeführt wenn onOptionsItemSelected() drankommt,

onCreate() klingt nach früher/ vorher


die findViewById() in Zeile 30 und 32 funktionieren?
dort würde dann vielleicht auch findViewById(R.id.seekBar_counter1) etwas != null liefert, ausprobieren

vielleicht genau wie schlingel sagt, setContentView im onCreate aufrufen? 
VOR seekbarData();


----------



## SlaterB (2. Okt 2012)

funktioniert ein Standard-Beispiel a la
http://www.coderzheaven.com/2011/06/21/how-to-use-seekbar-in-android/
?

wenn ja, dann daran halten, 
> super.onCreate(savedInstanceState);
klingt auch nicht schlecht, wobei bei dir vielleicht auch nur weggelassen

aber ob nun dein XML in der richtigen Layout-Datei steht usw., 
das kann ja in solchen Kürzungen keiner nachvollziehen,

ganz behutsam arbeiten, nach und nach Untermethoden einbauen, testen vorher/ nachher was geht und was vielleicht nicht mehr,
bei Unterlayouts/ Wechseln erst mit einfachen Komponenten testen usw.

-----

um spasseshalber noch an der Sprache zu feilen:
> Ich habe eine SeekBar angelegt und das Objekt erzeugt (skb_regler = ...).

hier erfolgt eine Zuweisung, keine Erzeugung, das passiert irgendwo intern,
und zugewiesen werden kann auch null, wie schon oft genug vorher der Fall

angelegt hast du eine Variable, 
'eine SeekBar anlegen' wäre sprachlich inoffiziell eher ein kompletter Vorgang: Variable + Initiaisierung (Zuweisung) durch Neuerzeugung


> Warum kann ich nix zuweisen??? 

die anderen Zeilen sind Methoden-Aufrufe am Objekt, dabei treten NPEs auf, 
zu Zuweisungen passt die Exception weniger


----------



## Gast2 (2. Okt 2012)

SlaterB hat gesagt.:


> > setContentView habe ich aufgerufen.
> meinst du anderen nicht geposteten Code oder den Aufruf in getCount() im geposteten Code?




```
setContentView(R.layout.activity_main);
```
steht zwischen Zeile 5 und 6




SlaterB hat gesagt.:


> die findViewById() in Zeile 30 und 32 funktionieren?
> dort würde dann vielleicht auch findViewById(R.id.seekBar_counter1) etwas != null liefert, ausprobieren



mein Test:

```
skb_regler = (SeekBar) findViewById(R.id.seekBar_counter1);
		if (skb_regler == null)  {txv_start_info.setText("null");} else{txv_start_info.setText("not null");}
```

Ergebnis:


> null



Das wundert mich, dass das Programm durchläuft, obwohl die Zuweisung gar nicht passiert ist. Ein aufschlussreicher Test.
Wie kann es dazu kommen, dass skb_regler nicht ordentlich zugewiesen wird?
Die SeekBar ist angelegt und auch in R.java zu finden.
? ? ?


----------



## schlingel (2. Okt 2012)

Zeig einmal den ganzen onCreate-Code.

Übrigens: Bei solchen Sachen lass Code aus der sicher nicht damit zu tun haben kann. setContentView gehört nicht in diese Kategorie ;-)


----------



## SlaterB (2. Okt 2012)

dass das Objekt null ist, dass findViewById() null zurückgibt war von Anfang an als Ursache klar,
daran solltest du dich langsam gewöhnen, das ist dann auch keine Exception/ kein Abbruch,
einfach Rückgabe null

vielleicht verwechsle ich dich mit jemand anderen, in deiner Unmenge Themen auf die Schnelle nichts gefunden,
aber für mich Android-unbedarften hier im Forum ist ein Programm mit findViewById() + Fehler praktisch synonym zu 
'na da wird findViewById() wohl einmal mehr null zurückgeben' 

ich sehe immerhin, dass du in
http://www.java-forum.org/mobile-geraete/141136-seekbar-einsetzen.html
es anscheinend schon laufen hattest, dort ohne setContentView()?

wie im letzten Posting von 14:13 geschrieben vielleicht eine Frage des Layouts, falsch einsortiert, 
sofern es da mehrere Ebenen zu wechseln gibt?

gibt es die Möglichkeit des Zurückgehens auf einfachere Beispiele?


----------



## Gast2 (2. Okt 2012)

schlingel hat gesagt.:


> Zeig einmal den ganzen onCreate-Code.




```
@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		inFrontCountSeconts = 1;
		mainCountSeconds = 1;
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		beginnFromStart();
		sensor[0] = "linear accelerometer";
		sensor[1] = "3d accelerometer";
		sensor[2] = "gravity sensor";
		sensor[3] = "orientation sensor";
		sensor[4] = "gyroscope sensor";	
		for (int i = 0; i < 500; i++) {
			graph[0][i] = i;
		}		
		Display display = getWindowManager().getDefaultDisplay();
		Point size = new Point();
		display.getSize(size);
		width = size.x;
		txv_start_info = (TextView) findViewById(R.id.txv_start_info);	
		seekbarData();		
	}

	private void beginnFromStart() {
		setContentView(R.layout.activity_main);
		allButtons();
	}
```


----------



## SlaterB (2. Okt 2012)

zeige bitte XML, welches die Seekbar sowie 'txv_start_info' enthält, letztes wird ja anscheinend gefunden? (prüfen!, Ausgabe)
beide müsste doch auf der gleichen Stufe stehen, oder?
vieleicht sind Unterschiede erkennbar


----------



## Gast2 (2. Okt 2012)

SlaterB hat gesagt.:


> zeige bitte XML, welches die Seekbar sowie 'txv_start_info' enthält, letztes wird ja anscheinend gefunden? (prüfen!, Ausgabe)
> beide müsste doch auf der gleichen Stufe stehen, oder?
> vieleicht sind Unterschiede erkennbar



Nein, txv_start_info steht in der activity_main.xml, das ist mein Start-Layout.
seekBar_counter1 hingegen steht in der before_count_down.xml,
welche mittels Menü aufgerufen wird.

Beide xml's werden auch vorbildlich angezeigt.
Auch die SeekBar ist zu sehen und man kann den Regler bewegen.
Auf beiden Ansichten werden Text und (klickbare) Buttons angezeigt.

*activity_main.xml*
[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:layout_margin="@dimen/rahmen"
    androidrientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/txt_p1_h1"
        android:textSize="@dimen/h1"
        android:textColor="@color/gruen" />

    <TextView
        android:id="@+id/txv_start_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        android:text="@string/txt_erklaerung" />

    <Button
        android:id="@+id/btn_lac"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        androidadding="@dimen/btn_padding"
        android:text="@string/txt_lac" />

    <Button
        android:id="@+id/btn_3da"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        androidadding="@dimen/btn_padding"
        android:text="@string/txt_3da" />

    <Button
        android:id="@+id/btn_gra"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        androidadding="@dimen/btn_padding"
        android:text="@string/txt_gra" />

    <Button
        android:id="@+id/btn_ori"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        androidadding="@dimen/btn_padding"
        android:text="@string/txt_ori" />

    <Button
        android:id="@+id/btn_gyr"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        androidadding="@dimen/btn_padding"
        android:text="@string/txt_gyr" />    

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_top"
        android:text="@string/txt_dauer_der_messung_in_sekunden" />    

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        androidrientation="horizontal" >

        <Button
            android:id="@+id/btn_1sec"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_top"
            android:minWidth="@dimen/btn_sec_breite"
            androidadding="@dimen/btn_padding"
            android:text="@string/txt_1sec" />

        <Button
            android:id="@+id/btn_2sec"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_top"
            android:minWidth="@dimen/btn_sec_breite"
            androidadding="@dimen/btn_padding"
            android:text="@string/txt_2sec" />

        <Button
            android:id="@+id/btn_3sec"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_top"
            android:minWidth="@dimen/btn_sec_breite"
            androidadding="@dimen/btn_padding"
            android:text="@string/txt_3sec" />

        <Button
            android:id="@+id/btn_4sec"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_top"
            android:minWidth="@dimen/btn_sec_breite"
            androidadding="@dimen/btn_padding"
            android:text="@string/txt_4sec" />        
    </LinearLayout>

</LinearLayout>[/XML]

*before_count_down.xml*
[XML]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/rahmen"
    androidrientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/txt_counter_h1"
        android:textColor="@color/gruen"
        android:textSize="@dimen/h1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="@string/txt_counter_txt" />

    <SeekBar
        android:id="@+id/seekBar_counter1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:max="@integer/max_skb_sensorsensibility" />

    <TextView
        android:id="@+id/txv_skb_sec"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center" />

    <TextView
        android:id="@+id/link"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:autoLink="web"
        android:gravity="center"
        android:text="@string/text_link"
        android:textColor="@color/gruen"
        android:textSize="@dimen/h1" />

    <Button
        android:id="@+id/btn_mnu_zu_start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/txt_zurueck" />

</LinearLayout>[/XML]


----------



## Gast2 (2. Okt 2012)

Sowohl zu 

http://www.coderzheaven.com/2011/06/...ar-in-android/

als auch zu (meinen eigenen Beitrag)

http://www.java-forum.org/mobile-geraete/141136-seekbar-einsetzen.html

finde ich keine Unterschiede. 

ok, ich suche weiter...


----------



## MiDniGG (2. Okt 2012)

Aber dieses Menü muss doch erst sichtbar sein, bevor Du auf die Seekbar zugreifen kannst... Wieso machst Du das nicht in der onMenu...irgendwas. Weiß gerade nicht, wie die Methode heißt.
Die die das Menü halt sichtbar macht.


----------



## schlingel (2. Okt 2012)

Das ist aber sowieso ein *Anti-Pattern* während dem Betrieb die Content-View zu ändern. Damit schiebst du dir ja alle Referenzen auf Views ins Nirvana.

Aber jetzt mal logisch betrachtet: Du setzt ein Layout in dem die SeekBar nicht vorkommt und suchst gleich darauf nach einer Referenz für die SeekBar in eben diesem Layout. Kann das deiner Meinung nach funktionieren?


----------



## Gast2 (2. Okt 2012)

MiDniGG hat gesagt.:


> Wieso machst Du das nicht in der onMenu...irgendwas.


onCreateOptionsMenu meinst Du?!

Habe ich ausprobiert, 
von dort aus seekbarData() aufgerufen
und sogar die Anweisungen aus seekbarData()
nach onCreateOptionsMenu kopiert.

Half leider auch nicht.
Selber Fehler (nichts zugewiesen).


----------



## Gast2 (2. Okt 2012)

schlingel hat gesagt.:


> Aber jetzt mal logisch betrachtet: Du setzt ein Layout in dem die SeekBar nicht vorkommt und suchst gleich darauf nach einer Referenz für die SeekBar in eben diesem Layout. Kann das deiner Meinung nach funktionieren?



JA.

```
private void getCount() {
		setContentView(R.layout.before_count_down);
//		skb_regler.setOnSeekBarChangeListener(this);
		btn_menu_info_back = (Button) findViewById(R.id.btn_mnu_zu_start);
		btn_menu_info_back.setOnClickListener(this);
		txv_skb_sec = (TextView) findViewById(R.id.txv_skb_sec);
		txv_skb_sec.setText(mainCountSeconds + "");
	}
```

Der Button und der Text im selben Layout wie die SeekBar lassen sich auch handhaben.

Was ein Anti-Pattern ist schau ich mir mal an.


----------



## Gast2 (2. Okt 2012)

```
private void getCount() {
		setContentView(R.layout.before_count_down);
		skb_regler = (SeekBar) findViewById(R.id.seekBar_counter1);
		skb_regler.setMax(5);
		skb_regler.setProgress(inFrontCountSeconts);
		skb_regler.setOnSeekBarChangeListener(this);
		btn_menu_info_back = (Button) findViewById(R.id.btn_mnu_zu_start);
		btn_menu_info_back.setOnClickListener(this);
		txv_skb_sec = (TextView) findViewById(R.id.txv_skb_sec);
		txv_skb_sec.setText(mainCountSeconds + "");
	}
```

HA HA!

So wird ein Schuh draus! 

Die Methode seekbarData() kann ich wegschmeißen. 
Und wie Ihr auf der richtigen Spur gewesen seit, 
ich muss zu erst die entsprechende View aufrufen und dann die Variablen (oh, wie heißt das jetzt?  zuweisen und deren Methoden aufrufen.

ICH DANKE EUCH ALLEN!!!


----------



## SlaterB (2. Okt 2012)

> finde ich keine Unterschiede. 

dass die SeekBar einmal im Main-Layout und einmal in einem Unter-Layout steht war kein direkt wichtiger Unterschied?
na nun ja geklärt,
nur wenn richtiges Layout, dann zugehörige Elemente zu finden,

ich lerne langsam selber Android


----------



## schlingel (2. Okt 2012)

> Und wie Ihr auf der richtigen Spur gewesen seit


Ich hab dir die Antwort vor 4 Posts gesagt ... Es ist klar, dass die View nicht gefunden werden kann wenn sie nicht im Layout ist. Aber wie gesagt. Lass das mit dem setContentView bleiben. Das ist nicht schön. Du vermengst da Zuständigkeiten miteinander und bringst Unordnung in den Code. 

Du würdest in Swing ja auch nicht ein Form verwenden und dort in der selben Form-Klasse zwei verschiedene Ansichten zusammenschustern.


----------



## Gast2 (2. Okt 2012)

schlingel hat gesagt.:


> Lass das mit dem setContentView bleiben. Das ist nicht schön. Du vermengst da Zuständigkeiten miteinander und bringst Unordnung in den Code.



Jetzt im Zusammenhang mit Android arbeite ich das erste Mal mit Oberflächen, daher habe ich noch keine Ahnung von Swing und GUI's im allgemeinen.

Aber wie soll ich denn neue Oberflächen aufrufen, wenn nicht mit setContentView?
Bzw. wie sieht denn eine saubere Lösung aus?  ???:L
Mit eigenen Klassen pro View? 

Einmal habe ich es so gemacht, dass ich alle für den Ablauf nötigen Elemente auf einen View gebabschd habe und diese abwechseln Visible.GONE und .VISIBLE gesetzt habe. Das war erst einmal ein Chaos. :lol:

Liebe Grüße!
Frank


----------



## schlingel (2. Okt 2012)

Für jeden Task den der Benutzer erledigen können soll, baust du eine Activity. So möchte Google es sehen.



> An activity is a single, focused thing that the user can do.


Quelle: android.developer.com

Besser auf den Punkt kann man es glaub ich nicht bringen. Das spart viele Nerven da so der Code auch viel leichter zu lesen ist und nicht - wie in deinem Fall - zwei verschiedene Activities in einer zusammen gewachsen sind.


----------

