Webview pageUp() über Menü-Button?

  • Antworten:18
  • Bentwortet
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 12:37:56 via Website

Hi,

ich will in meiner Webview über einen Menübutton ( Menü - Nach oben! ) zum Anfang der Webseite gelangen.
Das geht mit der Methode
1pageUp(true);

Aber wie kann ich das jetzt über den Menübutton laufen lassen?
Hier der Code:
1//Menü Items
2 @Override
3 public boolean onCreateOptionsMenu(Menu menu) {
4 super.onCreateOptionsMenu(menu);
5 MenuItem ACTION1 = menu.add(0, 0, 0, "Nach oben!");
6 return true;
7 }
8 //Menü Actions
9 @Override
10 public boolean onOptionsItemSelected(MenuItem item) {
11 switch (item.getItemId()) {
12 case 0:
13 webview.pageUp(true);
14 break;
15 }
16 return false;
17 }
18
19Hier kommt dann die onCreate() mit der Deklaration der Webview...

In der Zeile 13 meckert der Compiler logischerweise über die Webview, weil sie da ja noch nicht "existiert". Wie muss ich das dann machen?

Und nochwas: Kann man mit einer Webview auch eine lokale HTML Datei anzeigen lassen?

lg und Danke schonmal
Ludwig

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.06.2011, 12:41:02 via App

Du könntest du WebView global deklarieren.
Lg Ansgar

Ludwig H.

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 12:43:13 via Website

Ach, ich Depp!
Einfach
1WebView webview = new WebView(this);
vorne hin setzen. *kopfgegendieWandhau* :*)

Weißt du auch, wie ich eine lokale HTML Datei öffnen kann?

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 12:53:05 via Website

Hm, OK. Wenn ich die Webview jetzt global deklariere bekomme ich ein Force Close.
Und zwar eine NullPointerException in Zeile 18, in der ich die Webview deklariert habe.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.06.2011, 13:40:59 via App

Ich würde es so machen (vielleicht hast du es ja auch so?)
1Bla extends Activity{
2 WebView webview;
3
4 @Override
5 public void onCreate(Bundle xy){
6 webview = new WebView(this);
7 }
8}
Lg Ansgar

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.06.2011, 13:52:48 via Website

Am besten packst du das Menü mit all seinen Bestandteilen unter die OnCreate oder in eine eigene Klasse und implementierst diese dann

Gruß Alexander

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 15:37:25 via Website

Meinst du "in" die onCreate()? Das geht ja nicht. Kann ja keine Methoden in eine Methode reinschreiben !?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.06.2011, 16:08:22 via Website

deine onCreate wird als aller erstes ausgeführt

dort instanzierst du deine webview

bis der user den menü button klicken kann ist die Webview schon lange instanziert.

schau mal in der api doku bei der Webview - sie bitte ganz sicher eine methode um eine lokale datei zu laden.

swordiApps Blog - Website

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 16:31:29 via App

Mit dieser Methode kann man anscheinend lokale Daten laden: public void loadData (String data, String mimeType, String encoding) ;

Bleibt aber noch der Menü Button.
Die Methoden für das Menü (z. b. onOptionsItemSelected) sind ja sowieso wie onClickListener, oder?!
Wie kann ich die also in die onCreate mitreinnehmen?

— geändert am 12.06.2011, 16:31:46

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.06.2011, 16:36:14 via Website

am besten nochmal die grundlagen durch arbeiten und dann wirst du eine lösung finden


in der onCreate einfach deine view elemente referenzieren - dann kannst du damit in der onMenuItemSelected damit tun was du willst.

swordiApps Blog - Website

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.06.2011, 16:38:48 via Website

MainActivity.java
1public class MainActivity extends Activity{
2 WebView webview;
3
4 @Override
5 public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.webview);
8
9 webview = (WebView)findViewById(R.id.web)
10
11 webview.getSettings().setJavaScriptEnabled(true);
12
13 webview.loadUrl("http://google.com");
14 }
15}
16
17 @Override
18 public boolean onCreateOptionsMenu(Menu menu) {
19 MenuInflater inflater = getMenuInflater();
20 inflater.inflate(R.menu.menu, menu);
21 return true;
22 }
23
24 @Override
25 public boolean onOptionsItemSelected(MenuItem item) {
26 switch (item.getItemId()) {
27 case R.id.m1:
28 break;
29 case R.id.m2:
30 break;
31 }
32 return true;
33 }
34}

res/menu/menu.xml
1<?xml version="1.0" encoding="utf-8" ?>
2<menu xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:id="@+id/m1" android:title="@string/m1"/>
4 <item android:id="@+id/m2" android:title="@string/m2" />
5</menu>

— geändert am 12.06.2011, 17:06:19

Gruß Alexander

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.06.2011, 17:01:01 via Website

webview = (WebView)findViewById(R.id.web)

scheint zu fehlen.

swordiApps Blog - Website

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 17:13:59 via Website

@Alexander: In deinem Code ist eine "}" zu viel. ;)

Hm, es nützt aber alles nix, ich bekomme immer eine NullpointerException...
Hier mal der komplette Code, vielleicht seht ihr ja was falsch ist:
1public class MeineActivity extends Activity {
2 WebView webview;
3
4
5 /** Called when the activity is first created. */
6 @Override
7 public void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9
10
11 setContentView(R.layout.webview);
12
13 webview.loadUrl("http://adresse.de");
14 }
15
16 @Override
17 public boolean onCreateOptionsMenu(Menu menu) {
18 new MenuInflater(this).inflate(R.menu.menu, menu);
19
20 return(super.onCreateOptionsMenu(menu));
21 }
22
23 @Override
24 public boolean onOptionsItemSelected(MenuItem item) {
25 switch (item.getItemId()) {
26 case R.id.nachoben:
27 nachoben();
28 return(true);
29 }
30
31 return(super.onOptionsItemSelected(item));
32 }
33
34 public void nachoben(){
35 webview.pageUp(true);
36 }
37}
webview.xml:
1<?xml version="1.0" encoding="utf-8"?>
2<WebView xmlns:android="http://schemas.android.com/apk/res/android"
3 android:id="@+id/webview"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6/>

menu.xml:
1<?xml version="1.0" encoding="utf-8"?>
2<menu xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:id="@+id/nachoben"
4 android:icon="@android:drawable/ic_menu_upload"
5 android:title="Nach oben!"></item>
6</menu>

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.06.2011, 17:33:07 via Website

Markus Gursch
webview = (WebView)findViewById(R.id.web)

scheint zu fehlen.

antworten lesen - fehler vermeiden :D

genau meine zeile fehlt dir, und deshalb kommt ein nullpointer -> hätte dir aber auch der logcat gesagt

eigeninitiative ist der erste weg zur app

swordiApps Blog - Website

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

12.06.2011, 17:35:26 via Website

Na klar, das hab ich ja ausprobiert, aber es hilft nicht. Leider. :D

Die zweite Zeile muss ja dann statt "WebView webview;" "WebView webview = (WebView)findViewById(R.id.web);" heißen, oder?
So habe ich es nämlich probiert...

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.06.2011, 17:38:32 via Website

bitte schau dir die grundlagen nochmal genauer an, dann wirds leichter :D

swordiApps Blog - Website

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

13.06.2011, 11:42:28 via Website

Die zweite Zeile muss ja dann statt "WebView webview;" "WebView webview = (WebView)findViewById(R.id.web);" heißen, oder?
So habe ich es nämlich probiert...

...du hast das probiert, aber eigentlich weißt du nicht wirklich, was du da tust, oder?

Die Lösung läßt sich sich doch ganz einfach herleiten - die Zutaten:
1. Du willst ein WebView, in dem man auch was sehen kann; da hilft dir kein new WebView(), sondern das Einbetten eines solchen View in dein Layout;
2. Damit du ganze am Ende auch sehen kannst, brauchst du ein setContentView() im onCreate() mit dem Layout aus 1.
3. Um mit dem View zu interagieren, benötigst du eine Referenz auf diesen: findViewByID()
4. Um die Referenz nicht nur in OnCreate() nutzen zu können, benötigst du einen Classmember, der die Referenz methodenübergreifend speichert: WebView webview;

Zubereitung:
Wenn du den Member nun schon bei der Deklaration initialisierst (wie du es versucht hast), was meinst du wie die Referenz dort gefunden werden kann, wenn onCreate() und setContentView() noch nicht "dran waren"?
Genau, also mußt du die Deklaration an der Stelle lassen, die Zuweisung aber in die richtige zeitliche Reihenfolge einfügen -- nach dem setContentView()

...und war das jetzt Voodoo, Programmlogik für Genies oder doch eher ein Fall von "wenn du mit dem Auto wegfahren willst, dann musst du zuerst mal einsteigen"? ;)

Antworten
Ludwig H.
  • Forum-Beiträge: 3.256

13.06.2011, 17:37:01 via Website

Vielen Danke, and dev! Das hat mir sehr geholfen, vorallem fürs Verständnis! -_-
Für Interessierte hier nun mal der ganze Code. Es wird eine Webview geladen und über den Menübutton "Nach oben!" kommt man wieder ganz nach oben.
1public class MeineActivity extends Activity {
2
3 WebView webview;
4 /** Called when the activity is first created. */
5 @Override
6 public void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8
9 requestWindowFeature(Window.FEATURE_NO_TITLE);
10 setContentView(R.layout.webview);
11 WebView webview = (WebView)findViewById(R.id.webview);
12 webview.loadUrl("http://webseite.de");
13 }
14
15 @Override
16 public boolean onCreateOptionsMenu(Menu menu) {
17 new MenuInflater(this).inflate(R.menu.menu, menu);
18
19 return(super.onCreateOptionsMenu(menu));
20 }
21
22 @Override
23 public boolean onOptionsItemSelected(MenuItem item) {
24 switch (item.getItemId()) {
25 case R.id.nachoben:
26 WebView webview = (WebView)findViewById(R.id.webview);
27 webview.pageUp(true);
28 return(true);
29 }
30
31 return(super.onOptionsItemSelected(item));
32 }

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

13.06.2011, 19:53:55 via Website

wenn du deine webview als member der klasse anlegst, braucht du nicht bei jedem klick auf das menü die view inflaten.

swordiApps Blog - Website

Antworten