Cannot make a static reference to the non-static method

  • 33 Antworten
  • Neuester Beitrag
Diskutiere Cannot make a static reference to the non-static method im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Status
Für weitere Antworten geschlossen.
P

PhillippOh

Fortgeschrittenes Mitglied
Hey,

in meiner App gibt es 4 Webviews, die man mit nem Slide zur Seite durchblättern kann. Wenn ein bestimmter Wert nicht gesetzt ist, sollen die Webviews nicht aktiviert werden sondern 2 TextViews angezeigt bzw mit Text versorgt werden.

Nun meckert er aber rum, fehler steht im Thementitel.

Hier mal mein Code mit den fehlerhaften Zeilen:

Code:
public static class DummySectionFragment extends Fragment {
		/**
		 * The fragment argument representing the section number for this
		 * fragment.
		 */
		public static final String ARG_SECTION_NUMBER = "section_number";
		
		

		public DummySectionFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main_dummy,
					container, false);
			
		
			int nummer = getArguments().getInt(ARG_SECTION_NUMBER);
			
			int currentWeek = new GregorianCalendar().get(Calendar.WEEK_OF_YEAR);
			int lastWeek = currentWeek - 1;
			int nextWeek = currentWeek + 1;
			int nextnextWeek = currentWeek + 2;
			
			[B]tvWelcomeTitel = (TextView) findViewById(R.id.tvWelcomeHead);
			tvWelcomeText = (TextView) findViewById(R.id.tvWelcome);[/B]
			
			String welcomeTitel = getString(R.string.welcome_titel);
			String welcomeText = getString(R.string.welcome_text);
			
			[B]String klassenid = getSharedPreferences("klasse", MODE_PRIVATE).getString("klasse", null);[/B]
			
			if(klassenid == null){
				[B]tvWelcomeTitel.setText(welcomeTitel + " ...");
				tvWelcomeText.setText(welcomeText);[/B]
			}else{
			
			mWebView = (WebView) rootView.findViewById(R.id.wvVPlan);
			mWebView.setInitialScale(100);
			
			if(nummer == 1) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+lastWeek+"/c/c00057.htm");}
			if(nummer == 2) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+currentWeek+"/c/c00057.htm");}
			if(nummer == 3) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextWeek+"/c/c00057.htm");}
			if(nummer == 4) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextnextWeek+"/c/c00057.htm");}
			
			
			}
			
			return rootView;
		}
	}
Nun komme ich nicht weiter bzw weiß nicht, wie ich das Problem lösen kann.

Hoffe jemand kann mir helfen.

Gruß
Phillipp
 
S

steerben

Fortgeschrittenes Mitglied
Ich rate jetzt einfach mal ins blaue hinein:

getSharedPreferences(), musst da nicht den Context angehen? Fragment erbt glaub ich nicht von einer Contextoberklasse. Wäre es ne Activity, dann würd es wohl schon gehen.

Wie gesagt, nur ins blaue hinein geraten, aber bei der Fehlermeldung nimmst du halt ne Klassenmethode her, welche nicht static is, d.h. du musst über das besitzende Objekt darauf zugreifen.
 
P

PhillippOh

Fortgeschrittenes Mitglied
das bringt mir gerade nicht viel, weil ich jetzt auch nicht mehr weiß als vorher.
 
S

steerben

Fortgeschrittenes Mitglied
Den Context angeben? Den musst du dir dann natürlich auch woher holen und dann context.getSharedPreferences(..)

Wenns an dem liegt. Aber wenn ich so drüber schaue wirds wohl an dieser oder einer ähnlichen Methode liegen.
 
DagobertDokate

DagobertDokate

Experte
Logcat?

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
P

PhillippOh

Fortgeschrittenes Mitglied
Wie soll ich dir nen LogCat geben, wenn Eclipse mich die App nicht ausführen lässt?!
 
S

steerben

Fortgeschrittenes Mitglied
Mit dem Fehler wirds wohl kaum kompilieren.
 
DagobertDokate

DagobertDokate

Experte
Woher soll ich wissen wen du mit er meinst? Dein Nachbar?
Und in welcher Zeile meckert eclipse denn?

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
S

steerben

Fortgeschrittenes Mitglied
Ähm aso.
Warum deklarierst du deine Klasse als static? Das geht nicht.
 
P

PhillippOh

Fortgeschrittenes Mitglied
das hat eclipse automatisch so gemacht. wenn ich das static weg nehme, schmiert die app ab, also wird das static schon iwie seinen sinn haben.
 
S

steerben

Fortgeschrittenes Mitglied
Ähm aso.
Warum deklarierst du deine Klasse als static? Das geht nicht.

Und die Fehler müsste es dir in der IDE ja eigentlich anzeigen oder ned? Wird ja gleich alles rot unterstrichen.
 
P

PhillippOh

Fortgeschrittenes Mitglied
Der Fehler, den mir Eclipse anzeigt bei den markierten Zeilen auf der ersten Seite im Code, steht im Thementitel.

Genau gesagt ist das bei den TextViews: Cannot make a static reference to the non-static method findViewById(int) from the type Activity

Und das bei den SharedPreferences: Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper
 
S

steerben

Fortgeschrittenes Mitglied
Wenn du das static wegnimmst, kompiliert die App und schmiert ab. Wenn dus da lässt kompiliert sie nicht mal. Also wirds wohl die Ursache von dem Fehler sein oder nicht? Dass die App abschmiert (wenn sie denn mal kompiliert) hat dann andere Gründe.

Der ursprüngliche Beitrag von 22:29 Uhr wurde um 22:30 Uhr ergänzt:

Ja das geht eben nicht, weil Fragment nicht von Activity erbt. Also existieren diese Methode nicht in deiner Klasse.

Dein Fragment wird ja einer Activity hinzugefügt. D.h. du musst in deinem Fragment diese Activity referenzieren und dann kannst auch die Activity Methoden usw. benutzen mit activity.getSharedPreferences(..)
 
P

PhillippOh

Fortgeschrittenes Mitglied
Nein, wenn ich die Textviews und die SharedPreferences Sachen alle wegnehme, dann funktioniert die App normal. Das static muss da also sein. Es liegt nur an folgenden Zeilen:

Code:
tvWelcomeTitel = (TextView) findViewById(R.id.tvWelcomeHead);
			tvWelcomeText = (TextView) findViewById(R.id.tvWelcome);
			
			String welcomeTitel = getString(R.string.welcome_titel);
			String welcomeText = getString(R.string.welcome_text);
			
			String klassenid = getSharedPreferences("klasse", MODE_PRIVATE).getString("klasse", null);
			
			if(klassenid == null){
				tvWelcomeTitel.setText(welcomeTitel + " ...");
				tvWelcomeText.setText(welcomeText);
			}else{
			
			mWebView = (WebView) rootView.findViewById(R.id.wvVPlan);
			mWebView.setInitialScale(100);
			
			if(nummer == 1) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+lastWeek+"/c/c00057.htm");}
			if(nummer == 2) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+currentWeek+"/c/c00057.htm");}
			if(nummer == 3) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextWeek+"/c/c00057.htm");}
			if(nummer == 4) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextnextWeek+"/c/c00057.htm");}
			
			
			}
Die if-Abfragen bei den webviews waren auch schon vorher da, also nur das if gerüst drum rum is auch neu.

Der ursprüngliche Beitrag von 22:31 Uhr wurde um 22:34 Uhr ergänzt:

und wie mache ich das nun genau?
 
S

steerben

Fortgeschrittenes Mitglied
Die Activity bekommst du mit getActivity().

D.h. getActivity().getSharedPreferences() usw.......
 
P

PhillippOh

Fortgeschrittenes Mitglied
hmm, jetzt zeigt er zwar keine Fehler mehr an, aber die app schmiert beim ausführen ab.

Code:
tvWelcomeTitel = (TextView) getActivity().findViewById(R.id.tvWelcomeHead);
			tvWelcomeText = (TextView) getActivity().findViewById(R.id.tvWelcome);
			
			String welcomeTitel = getString(R.string.welcome_titel);
			String welcomeText = getString(R.string.welcome_text);
			
			String klassenid = getActivity().getSharedPreferences("klasse", MODE_PRIVATE).getString("klasse", null);
			
			if(klassenid == null){
				tvWelcomeTitel.setText(welcomeTitel + " ...");
				tvWelcomeText.setText(welcomeText);
			}else{
			
			mWebView = (WebView) rootView.findViewById(R.id.wvVPlan);
			mWebView.setInitialScale(100);
			
			if(nummer == 1) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+lastWeek+"/c/c00057.htm");}
			if(nummer == 2) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+currentWeek+"/c/c00057.htm");}
			if(nummer == 3) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextWeek+"/c/c00057.htm");}
			if(nummer == 4) {mWebView.loadUrl("http://vplan.jobelmann-schule.de/Schueler/"+nextnextWeek+"/c/c00057.htm");}
			
			
			}
 
S

steerben

Fortgeschrittenes Mitglied
Debuggen, Breakpoints setzen. Welche Fehlermeldung wird angegeben?

Das mit static Klasse hab ich mir jetzt mal angesehen. Stimmt schon, den Sinn versteh ich zwar jetzt grad nicht, warum das so gemacht wurde, aber naja.
 
P

PhillippOh

Fortgeschrittenes Mitglied
Und wie soll ich debuggen? Seh ja nichtmal den LogCat weil Eclipse ihn iwie nich anzeigen will.

Der ursprüngliche Beitrag von 22:47 Uhr wurde um 22:51 Uhr ergänzt:

gut, ich glaube ich habs raus. Wenn ich die if Abfrage if(klassenid == null){ komplett raus nehme und nur noch den inhalt mit den webviews da lasse, dann gehts. wenn ich die if abfrage raus nehme und auch das setText() von den beiden textviews drin lasse, dann schmiert die app ab. weißt du vllt woran es noch liegen kann? es sind ja anscheinend die beiden setText()
 
S

steerben

Fortgeschrittenes Mitglied
...
How to Debug Android application line by line using Eclipse? - Stack Overflow

Vmtl gibts ne NullPointerException. tvWelcomeTitel oder tvWelcomeText wird null sein oder einer der strings die du bei beiden setzen willst.

Der ursprüngliche Beitrag von 22:53 Uhr wurde um 22:58 Uhr ergänzt:

Wenn dus debugst müssts dich da eigentlich wo mit nem Fehler rausschmeißen und du siehst gleich wo es hängt. Mit ausprobieren wirst da bei größeren Projekten ziemlich lang dafür brauchen.
 
P

PhillippOh

Fortgeschrittenes Mitglied
Iwas stimtm auch mit der Abfrage nicht. Da in den preferences schon was gespeichert ist, sollten die Webviews angezeigt werden, aber sie werden nicht angezeigt. Sehr komisch.

Der ursprüngliche Beitrag von 23:03 Uhr wurde um 23:14 Uhr ergänzt:

Ok, die if Abfrage habe ich zum laufen bekommen indem ich den wert aus den preferences im oncreate der activity in die die variable speichere die dann auf public static gestellt ist. das problem mit den textviews hab ich aber weiterhin.
 
Status
Für weitere Antworten geschlossen.