我的应用程序完全正常,直到我为我的应用添加了启动画面功能。我试图遵循互联网上提供的一些解决方案。当我在Android模拟器中执行我的应用程序几秒钟它出现一个警告框显示以下语句时出现问题
等待调试程序
Application TestApp(进程com.testapp.mytestapp)正在等待 要附加的调试器。
强制关闭按钮
之后我的应用程序运行绝对正常。我仍然不确定它是错误还是其他因为我的编码技巧不好而我在我的代码中犯了错误或错过了什么。此外,我想增加Splash Image的持续时间(以某种方式可能),因为有时在完成网页加载之前,启动图像会消失,但由于我是Android开发的新手,我无法找到适当的解决方案或参考以下内容。此外,我的模拟器版本是Nexus 4 API 22
这是我的主要MyActivity类
package com.testapp.mytestapp;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import java.io.File;
import static com.testapp.mytestapp.R.*;
public class MyActivity extends Activity {
private WebView webView;
private FrameLayout customViewContainer;
private WebChromeClient.CustomViewCallback customViewCallback;
private View mCustomView;
private myWebChromeClient mWebChromeClient;
private myWebViewClient mWebViewClient;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
webView = (WebView) findViewById(R.id.webView);
ConnectivityManager conMgr = (ConnectivityManager) getApplicationContext().getSystemService(this.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null || !netInfo.isConnected() || !netInfo.isAvailable()) {
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(this, style.AlertDialogCustom).create();
alertDialog.setTitle("Communication Error");
alertDialog.setMessage("Please make sure that internet connection is active.");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
} else {
AppRater appRater = new AppRater(this);
appRater.setDaysBeforePrompt(1);
appRater.setLaunchesBeforePrompt(3);
appRater.setPhrases("Rate This App",
"If you like our App don't forget to rate our application on Google Play. Thanks for your support!",
"Rate Now", "Later", "Ignore");
appRater.setTargetUri("https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName());
appRater.show();
customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
webView = (WebView) findViewById(R.id.webView);
mWebViewClient = new myWebViewClient();
webView.setWebViewClient(mWebViewClient);
mWebChromeClient = new myWebChromeClient();
webView.setWebChromeClient(mWebChromeClient);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setSaveFormData(true);
webView.loadUrl("https://custom-domain-name.com");
webView.setWebViewClient(new MyAppWebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//hide loading image
findViewById(R.id.imageLoading1).setVisibility(View.GONE);
//show webview
findViewById(R.id.customViewContainer).setVisibility(View.VISIBLE);
}
});
}
}
public boolean inCustomView() {
return (mCustomView != null);
}
public void hideCustomView() {
mWebChromeClient.onHideCustomView();
}
@Override
protected void onPause() {
super.onPause(); //To change body of overridden methods use File | Settings | File Templates.
webView.onPause();
}
@Override
protected void onResume() {
super.onResume(); //To change body of overridden methods use File | Settings | File Templates.
webView.onResume();
}
@Override
protected void onStop() {
super.onStop(); //To change body of overridden methods use File | Settings | File Templates.
if (inCustomView()) {
hideCustomView();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (inCustomView()) {
hideCustomView();
return true;
}
if ((mCustomView == null) && webView.canGoBack()) {
webView.goBack();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
class myWebChromeClient extends WebChromeClient {
private Bitmap mDefaultVideoPoster;
private View mVideoProgressView;
@Override
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
onShowCustomView(view, callback); //To change body of overridden methods use File | Settings | File Templates.
}
@Override
public void onShowCustomView(View view,CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mCustomView = view;
webView.setVisibility(View.GONE);
customViewContainer.setVisibility(View.VISIBLE);
customViewContainer.addView(view);
customViewCallback = callback;
}
@Override
public View getVideoLoadingProgressView() {
if (mVideoProgressView == null) {
LayoutInflater inflater = LayoutInflater.from(MyActivity.this);
mVideoProgressView = inflater.inflate(R.layout.video_progress, null);
}
return mVideoProgressView;
}
@Override
public void onHideCustomView() {
super.onHideCustomView(); //To change body of overridden methods use File | Settings | File Templates.
if (mCustomView == null)
return;
webView.setVisibility(View.VISIBLE);
customViewContainer.setVisibility(View.GONE);
// Hide the custom view.
mCustomView.setVisibility(View.GONE);
// Remove the custom view from its container.
customViewContainer.removeView(mCustomView);
customViewCallback.onCustomViewHidden();
mCustomView = null;
}
}
class myWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url); //To change body of overridden methods use File | Settings | File Templates.
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
trimCache(); //if trimCache is static
} catch (Exception e) {
e.printStackTrace();
}
}
public void trimCache() {
try {
File dir = getCacheDir();
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
return dir.delete();
}
return false;
}
}
这是我的 MyAppWebViewClient 类
package com.testapp.mytestapp;
import android.content.Intent;
import android.net.Uri;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MyAppWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(Uri.parse(url).getHost().endsWith("custom-domain-name.com")) {
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
}
}
这是我的 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp.mytestapp" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher"
android:hardwareAccelerated="true">
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
这是我的布局的 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView android:id="@+id/imageLoading1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="visible"
android:src="@drawable/splash_me2"
android:scaleType = "centerCrop" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<WebView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/webView"
android:layout_gravity="center"
/>
<FrameLayout
android:id="@+id/customViewContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
/>
</LinearLayout>
这是我从 LogCat
的日志11-30 16:10:06.709: E/Launcher(1465): Unable to launch. tag=ApplicationInfo(title=TestApp P=UserHandle{0}) intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.testapp.mytestapp/.MyActivity (has extras) }
11-30 16:10:06.709: E/Launcher(1465): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.testapp.mytestapp/com.testapp.mytestapp.MyActivity}; have you declared this activity in your AndroidManifest.xml?
11-30 16:16:20.860: E/InputDispatcher(1244): channel '2fc7fe4c com.testapp.mytestapp/com.testapp.mytestapp.MyActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以忽略来自调试器的消息,有时只需花一点时间在模拟器中运行。
您可以跟踪WebChromeClient上的进度并检查它何时为100。
webView.setWebChromeClient(new myWebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//...page is fully loaded.
findViewById(R.id.imageLoading1).setVisibility(View.GONE);
//show webview
findViewById(R.id.customViewContainer).setVisibility(View.VISIBLE);
}
}
});