NullPointerException bei Zuweisungen zum SeekBar-Objekt

G

Gast2

Gast
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...
Java:
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

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

Gast2

Gast
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
 
G

Gast2

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

SlaterB

Gast
> 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();
 
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
> setContentView habe ich aufgerufen.
meinst du anderen nicht geposteten Code oder den Aufruf in getCount() im geposteten Code?
Java:
setContentView(R.layout.activity_main);
steht zwischen Zeile 5 und 6


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:
Java:
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:

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

Gesperrter Benutzer
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 ;-)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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?
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Zeig einmal den ganzen onCreate-Code.

Java:
	@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();
	}
 
S

SlaterB

Gast
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
 
G

Gast2

Gast
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"
android:eek:rientation="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"
android:padding="@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"
android:padding="@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"
android:padding="@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"
android:padding="@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"
android:padding="@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"
android:eek:rientation="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"
android:padding="@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"
android:padding="@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"
android:padding="@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"
android:padding="@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"
android:eek:rientation="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]
 
Zuletzt bearbeitet von einem Moderator:
M

MiDniGG

Gast
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

Gesperrter Benutzer
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?
 
G

Gast2

Gast
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.
Java:
	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.
 
G

Gast2

Gast
Java:
	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!!!
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> 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

Gesperrter Benutzer
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.
 
G

Gast2

Gast
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

Gesperrter Benutzer
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.
 

Ähnliche Java Themen

Neue Themen


Oben