它可能会奏效,但这不是一个好主意.如果你没有正确处理Fragment或者你的代码中的某个地方对它的生命周期有点粗心,它很可能会导致崩溃.但有一个简单的方法来解决这个问题.而不是使用静态方法,在实例本身上保存实例和调用方法.这样你可以检查实例是否为null,如果不是,Fragment可以处理对goBack()或canGoBack()本身的调用:
public class MainBrowserActivity extends SingleFragmentActivity {
BrowserFragment browserFragment = null;
@Override
protected Fragment createFragment() {
this.browserFragment = BrowserFragment.newInstance();
return this.browserFragment;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && this.browserFragment != null && this.browserFragment.canGoBack()) {
this.browserFragment.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
如您所见,保存了BrowserFragment实例,然后在BrowserFragment本身上调用goBack()或canGoBack()等方法.当然,您必须在BrowserFragment中实现这些方法,但这不应该是一个问题:
public class BrowserFragment extends Fragment {
public static BrowserFragment newInstance() {
BrowserFragment fragment = new BrowserFragment();
return fragment;
}
private WebView webView;
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 boolean canGoBack() {
return this.webView != null && this.webView.canGoBack();
}
public void goBack() {
if(this.webView != null) {
this.webView.goBack();
}
}
}
我对您的代码进行了一些额外的改进.首先,我添加了空检查以防止任何可能的NullPointerExceptions,其次建议始终使用静态工厂方法来创建新的Fragments实例.这就是我添加到BrowserFragment的静态newInstance()方法.这样做的好处是,您可以实现一种方法,无论您在何处使用它,都可以为您设置BrowserFragment.您可以向newInstance()方法添加参数以将一些值传递给BrowserFragment或添加一些必需的侦听器等,但由于您没有将任何值传递给BrowserFragment,因此newInstance()方法仍然是空的.尽管如此,最好始终使用这样的工厂方法,即使它们只调用新的BrowserFragment().
通常这种方法要好得多.特别是从体系结构的角度来看,因为您没有直接与Activity中的WebView进行交互. WebView与Activity没有任何关系,它是BrowserFragment实现的一部分,因此Activity不应该知道甚至还有WebView.如何实现对goBack()或canGoBack()的调用或者他们究竟做什么对Activity不感兴趣. Activity只是告诉BrowserFragment“我想回去”,BrowserFragment可以完成工作.这样可以更好地分离职责,使代码更易读,更清晰,更易于维护.
编辑:
另外我不知道SingleFragmentActivity,但通常任何Activity都实现onBackPressed()方法.您不必重写onKeyDown()来捕获后退键事件.你可以这样做:
@Override
public void onBackPressed() {
if (this.browserFragment != null && this.browserFragment.canGoBack()) {
this.browserFragment.goBack();
} else {
// The back key event only counts if we execute super.onBackPressed();
super.onBackPressed();
}
}
如果您有任何其他问题,请随时提出!