Java 如何忽略类中的某些方法和代码?基于SDK
我读了一遍,但我真的不明白如何忽略某些代码行。我有这个活动(贴在下面),它是一个简单的网络视图。但是,我希望启用地理定位功能(即使它仅适用于2.0及以上版本的手机),因为这些方法直到SDK 5(android 2.0)才引入,我希望webview至少能够在1.5手机上加载,而不仅仅是崩溃。有没有人可以告诉我,当用户的手机SDK小于SDK 5时,如何使用这段代码并使其忽略我用星号注释指出的代码行Java 如何忽略类中的某些方法和代码?基于SDK,java,android,backwards-compatibility,android-1.5-cupcake,Java,Android,Backwards Compatibility,Android 1.5 Cupcake,我读了一遍,但我真的不明白如何忽略某些代码行。我有这个活动(贴在下面),它是一个简单的网络视图。但是,我希望启用地理定位功能(即使它仅适用于2.0及以上版本的手机),因为这些方法直到SDK 5(android 2.0)才引入,我希望webview至少能够在1.5手机上加载,而不仅仅是崩溃。有没有人可以告诉我,当用户的手机SDK小于SDK 5时,如何使用这段代码并使其忽略我用星号注释指出的代码行 package com.my.app; import com.facebook.android.R;
package com.my.app;
import com.facebook.android.R;
//NEEDS TO BE IGNORED**********************************************************
import android.webkit.GeolocationPermissions;
import android.webkit.GeolocationPermissions.Callback;
//END**************************************************************************
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
//GeolocationPermissionsCallback NEEDS TO BE IGNORED**********************************************************
public class Places extends Activity implements GeolocationPermissions.Callback{
private ProgressDialog progressBar;
public WebView webview;
private static final String TAG = "Main";
String geoWebsiteURL = "http://google.com";
@Override
public void onStart()
{
super.onStart();
CookieSyncManager.getInstance().sync();
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new testClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setPluginsEnabled(true);
webview.loadUrl("http://google.com");
progressBar = ProgressDialog.show(Places.this, "", "Loading Page...");
//THIS NEEDS TO BE IGNORED************************************************************
webview.getSettings().setGeolocationEnabled(true);
GeoClient geo = new GeoClient();
webview.setWebChromeClient(geo);
}
public void invoke(String origin, boolean allow, boolean remember) {
}
final class GeoClient extends WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
//END OF CODE THAT NEEDS TO BE IGNORED************************************************
}
private class testClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "Processing webview url click...");
view.loadUrl(url);
return true;
}
public void onPageFinished(WebView view, String url) {
Log.i(TAG, "Finished loading URL: " +url);
if (progressBar.isShowing()) {
progressBar.dismiss();
}
if (url.startsWith("mailto:") || url.startsWith("geo:") ||
url.startsWith("tel:")) {
Intent intent = new Intent
(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
if (keyCode == KeyEvent.KEYCODE_SEARCH) {
Intent z = new Intent(this, Search.class);
startActivity(z);
}
return super.onKeyDown(keyCode, event);
}
public boolean onCreateOptionsMenu (Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
switch (item.getItemId()) {
case R.id.home:
Intent m = new Intent(this, Home.class);
startActivity(m);
return true;
case R.id.refresh:
webview.reload();
Toast.makeText(this, "Refreshing...", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
public void onStop()
{
super.onStop();
CookieSyncManager.getInstance().sync();
}
}
您的问题有(至少)两种可能的解决方案:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
progressBar = ProgressDialog.show(Places.this, "", "Loading Page...");
if (isGeolocationAvailable()) {
Android20Util.enableGeolocation(webview);
}
}
Android20Util
包含一些静态方法,如:
public static void enableGeolocation(WebView webview) {
webview.getSettings().setGeolocationEnabled(true);
webview.setWebChromeClient(new GeoClient());
}
我基本上只需要该类至少能够在1.5手机上加载。我不一定需要它来实现地理定位功能。我怎样才能开始做选项2?有没有一种方法可以让我制作两个不同的类,然后让它只为2.0及以上的手机加载这个类?然后为1.5 1.6?@brybam加载替代类-使用解决方案2,您可以将所有类分发给每个android。因此,1.5 android的应用程序可能会有一些不兼容的类,但它们永远不会被加载/使用。这是一个折衷办法:您不必进行单独的构建,但可以向应用程序添加一些未使用的数据。