FindViewById funktioniert innerhalb einer Inner Klassen nicht

  • 9 Antworten
  • Letztes Antwortdatum
L

Lillitopf

Neues Mitglied
0
Hallo,

Ich bin noch ziemlich neu im Android programmieren uns steh grad voll an, evtl. könnt ihr mir hier helfen.

Ich versuche gerade eine Activity aus mehreren Fragmenten mit Tab zu erstellen, was auch funktioniert. Nun möchte ich im fragment_main Button (button1) ansprechen.

Wie kann ich aus einer innerClass auf Methoden zugreifen bzw. woran kann es liegen dass "rootView.findViewById(R.id.button1)..." nicht funktioniert?
Ich denke das das Fragment zu beginn nicht gefunden wird oder?

PHP:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
	static View v;
	static Activity activity;
	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	...
	
	final static OnClickListener buttonListener = new OnClickListener() {
		public void onClick(View v) {
			Toast.makeText(context, getString(R.string.settings_error_message_1), Toast.LENGTH_LONG).show();
		}
	};
	
	public static class TabFragment extends Fragment {

		public static final String ARG_OBJECT = "object";
 
		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
 
				Bundle args = getArguments();
				int position = args.getInt(ARG_OBJECT);
 
				int tabLayout = 0;
				switch (position) {
					case 0:
					tabLayout = R.layout.fragment_main;
					break;
					case 1:
					tabLayout = R.layout.fragment_second;
					break;
					case 2:
					tabLayout = R.layout.fragment_third;
					break;
				}
 
				View rootView = inflater.inflate(tabLayout, container, false);

				rootView.findViewById(R.id.button1).setOnClickListener(buttonListener); // this row
 
				return rootView;
		}
	}
}

Vielen Dank
 
Schicke mal dein Layout und dein Logcat.

Es ist nur eine Vermutung, aber wenn du mehrere id button1 hast, dürfte das Programm abstürzen.

Noch eine Anmerkung zu deinen Code. Java ist eine Sprache, die auf Kapselung beruht. Den Modifikator static sollte man mit bedacht benutzen! Sonst erzeugt man Unmengen an globale Variablen und Methoden. Ganz böse wird es, wenn vor static noch public steht. Dann hebt du jede Art von Kapselung auf


Guido Krüger - JAVA 1.1 lernen - Kapitel 7 Klassen mit static-Elementen
Chapter*8.*Classes
Controlling Access to Members of a Class (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
 
Welches Layoutfile hast Du bearbeitet? Es müsste das *_fragment.xml sein. Wenn d
Du es in das ganz normale gepackt hast, kann es nicht funktionieren.

Gesendet von meinem GT-I8150 mit der Android-Hilfe.de App
 
hallo.

@ markus.tallius,

also ich hatte auch bereits ein framelayout als id angegeb, dass auch über den eventlistener gut fibktioniert hatte. nun habe ich die mit fragmenten und tabs erweitert. da nun das eigentliche layout nicht mehr in der main_activity.xml (nun pager) liegt, sondern in der fragment_main.xml, habe ich probleme diese objekte anzusprechen.

Macht es sinn nun alle Methoden in die Inner Class zu verschieben?

Das Logcat sende ich noch.

@ Linux4ever

Ich habe 4 .xml dateien:
main_activity.xml (dient als pager)
fragment_main.xml (das ist das eigentliche layout)
fragment_second.xml (hier ist der button mit id button1)
fragment_third.xml

Vielen Dank
 
@ markus.tillius

anbei das Logcat

Code:
04-21 21:53:48.549: I/dalvikvm(833): threadid=3: reacting to signal 3
04-21 21:53:48.700: I/dalvikvm(833): Wrote stack traces to '/data/anr/traces.txt'
04-21 21:53:48.959: D/AndroidRuntime(833): Shutting down VM
04-21 21:53:48.959: W/dalvikvm(833): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-21 21:53:48.969: E/AndroidRuntime(833): FATAL EXCEPTION: main
04-21 21:53:48.969: E/AndroidRuntime(833): java.lang.RuntimeException: Unable to start activity ComponentInfo{at.bk.sauna/at.bk.sauna.MainActivity}: java.lang.NullPointerException
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread.access$600(ActivityThread.java:123)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.os.Handler.dispatchMessage(Handler.java:99)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.os.Looper.loop(Looper.java:137)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at java.lang.reflect.Method.invoke(Method.java:511)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at dalvik.system.NativeStart.main(Native Method)
04-21 21:53:48.969: E/AndroidRuntime(833): Caused by: java.lang.NullPointerException
04-21 21:53:48.969: E/AndroidRuntime(833): 	at at.bk.sauna.MainActivity.onCreate(MainActivity.java:91)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.Activity.performCreate(Activity.java:4465)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-21 21:53:48.969: E/AndroidRuntime(833): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
04-21 21:53:48.969: E/AndroidRuntime(833): 	... 11 more
04-21 21:53:49.059: I/dalvikvm(833): threadid=3: reacting to signal 3
04-21 21:53:49.069: I/dalvikvm(833): Wrote stack traces to '/data/anr/traces.txt'
04-21 21:53:49.508: I/dalvikvm(833): threadid=3: reacting to signal 3
04-21 21:53:49.519: I/dalvikvm(833): Wrote stack traces to '/data/anr/traces.txt'
04-21 21:53:51.518: I/Process(833): Sending signal. PID: 833 SIG: 9

Danke
 
Du versuchst, in jedem deiner Fragmente den Button anzusprechen. Wenn er nicht in jedem da ist, muss es ja krachen.
 
Hi DieGoldeneMitte,

vielen Dank für die Info. Ich weiß trotzdem nicht weiter.

Ich habe 3 Fragmente die man Swipen kann und auch per Tab erreichen kann.
Ich habe mich da ein wenig an die Vorgaben von einem Tutorial und Google gehalten, die auch wie ich das mit den Inneren Klassen so machen.
Mein Problem ist jedoch, dass ich nicht ganz weiß, wo ich jetzt die Zeilen schreiben muss, womit ich die FrameLayouts (=Buttons) in den richtigen Fragmenten erreichen kann.

Evtl. hast du da eine bessere Idee?
 
In deinem createView hast du einen switch, indem du deine Tabs unterscheidest (nehme ich zumindest mal an, weil du deine Resourcen uns ja nicht zeigst). Der code hinter dem switch{...}, also da wo du findViewById machst, wird für alle Tabs ausgeführt also auch für die ohne den Button. Deshalb kracht es bei dir (vermutlich).

Du musst den Code schon irgendwie umstellen, damit in den anderen Tabs dieser Code nicht ausgeführt wird. Vielleicht solltest du für jeden Tab eine eigene Fragementklasse einrichten (musst dann natürlich deine Resroucen anpassen) - das ist m.E. anfängerfreundlicher und erspart dir (zumindest für das konkrete Problem) die Komplikationen mit dem getArgument() und dem switch. :)
 
Die Methode findViewById() liefert den Wert null, wenn sie die id im Layout, welches mit setContentView() zugewiesen wurde, nicht findet. Ein null-Objekt hat keine Methoden. Bei ein Methodenaufruf wirft es ein NullPointerException.

So wie du es zur Zeit versucht, geht es nicht!!! :(

Du kannst nur vom Fragment mit dem Layout fragment_second.xml auf den Button zugreifen. Die beste und einfachste Lösung ist du tauscht in deiner switch - Anweisung nicht die Layout, sondern die Fragmente (die jeweils ein Layout haben) mit FragmentTransaction.replace()

Building a Dynamic UI with Fragments | Android Developers.

Im Endeffekt braucht du 4 Klassen und 4 Layouts. (1 Activity und 3 Fragments). Jede Klasse hat genau ein Layout. Und nur in der Klasse kann man ohne Aufwand auf des dazugehörige Layout zugreifen (Kapselung).
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
487
AnnaBauer21
AnnaBauer21
AnnaBauer21
Antworten
6
Aufrufe
987
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten