OnKeyDown innen WebView-fragment
Machte ich einen Fragment
mit einem WebView
und ich wollte, um zu definieren, eine onKeyDown()
um wieder von einer web-Seite zu der vorherigen. Ich Tat es, aber der verrückteste Teil war für mich zu teilen WebView
variable aus meiner Fragment
Klasse zu meinem Activity
Klasse, da kann ich nicht definieren onKeyDown()
im Fragment
. Also ich habe gerade definiert eine get-Methode und machte es statisch. Aber ich Frage mich, ob es war ein echter Fehler und meine app kann ernsthaft Absturz in einigen Fällen.
Meine Fragment
code:
public class BrowserFragment extends Fragment {
private static WebView webView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_activity, parent, false);
getActivity().setTitle(R.string.title_rus);
webView = (WebView) v.findViewById(R.id.webView);
webView.setWebViewClient(new SwingBrowserClient());
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
Uri data = Uri.parse("http://www.swinginmoscow.ru/m/");
webView.loadUrl(data.toString());
return v;
}
public static WebView getWebView() {
return webView;
}
}
Und meine Activity
code:
public class MainBrowserActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
return new BrowserFragment();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && BrowserFragment.getWebView().canGoBack()) {
BrowserFragment.getWebView().goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es könnte funktionieren, aber es ist nicht eine gute Idee. Es könnte sehr wohl einen Absturz verursachen, wenn Sie nicht behandeln, die
Fragment
richtig oder sind irgendwo in deinem code ein wenig nachlässig in Bezug auf Ihren Lebenszyklus. Aber es gibt einen einfachen Weg, um dieses. Statt mit einer statischen Methode, die Instanz gespeichert, und rufen Methoden auf die Instanz selbst. Auf diese Weise können Sie überprüfen, wenn die Instanz null ist, und wenn nicht derFragment
telefonieren zugoBack()
odercanGoBack()
selbst:Wie Sie sehen können die
BrowserFragment
- Instanz gespeichert wird, und dann Methoden wiegoBack()
odercanGoBack()
sind aufgerufen, auf dieBrowserFragment
selbst. Natürlich Sie müssen diese Methoden implementieren, die in derBrowserFragment
aber das sollte kein problem sein:Machte ich ein paar Verbesserungen für deinen code. Zunächst fügte ich null überprüft, um zu verhindern, dass mögliche
NullPointerExceptions
und zweitens ist es zu empfehlen immer die Verwendung einer statischen factory-Methode zum erstellen neuer Instanzen vonFragments
. Das ist das, was die statischenewInstance()
Methode ist, dass ich Hinzugefügt, um dieBrowserFragment
. Das hat den Vorteil, dass Sie implementieren eine Methode, die kümmert sich um die Einrichtung derBrowserFragment
für Sie, unabhängig davon, wo Sie es verwenden. Sie können Parameter hinzufügen, umnewInstance()
- Methode übergeben einen Wert für dieBrowserFragment
oder hinzufügen, dass einige benötigte listener etc aber da Sie nicht übergeben Sie alle Werte an denBrowserFragment
dienewInstance()
Methode bleibt ziemlich leer. Dennoch ist es am besten Praxis, um immer mit solchen factory-Methoden, auch wenn Sie nur rufen Sienew BrowserFragment()
.In der Regel dieser Ansatz ist viel besser. Gerade von einem Architektur-Perspektive, weil Sie nicht direkt interagieren mit der
WebView
imActivity
. DieWebView
hat nichts zu tun mit derActivity
es ist Teil der Umsetzung derBrowserFragment
und als solche dieActivity
sollte nicht wissen, dass es überhaupt einenWebView
. Wie AufrufegoBack()
odercanGoBack()
implementiert sind oder was genau Sie tun, ist von keinem Interesse für dieActivity
. DieActivity
nur sagt dieBrowserFragment
"ich will zurück" und dieBrowserFragment
macht die Arbeit. Dies trennt die Verantwortlichkeiten besser und macht den code besser lesbar, übersichtlicher und wartbarer.EDIT:
Weiß ich auch nicht von einem
SingleFragmentActivity
aber in der Regel jedeActivity
implementiertonBackPressed()
Methode. Sie müssen nicht überschreibenonKeyDown()
zu fangen, eine zurück-Taste in der Veranstaltung. Sie können nur tun so etwas wie dieses:Wenn Sie irgendwelche anderen Fragen haben, fühlen Sie sich bitte frei zu Fragen!