如何在启动splashscreen的同时在webview中加载url?

时间:2015-09-28 18:37:40

标签: java android android-asynctask

这是我的启动画面活动。

public class Splash extends Activity {
  private static int SPLASH_TIME_OUT=10000;
  protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    Timer r=new Timer();
    new Handler().postDelayed(r,SPLASH_TIME_OUT);
  }

  class Timer implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        Intent i=new Intent(Splash.this,MainActivity.class);
        startActivity(i);
        finish();
    }

  }
}

这是我的MainActivity。此活动应在背景中执行,而防溅板在前面。是否可以使用AsyncTask。怎么做?

如果不是AsyncActivity,我可以使用什么?

public class MainActivity extends Activity {
  private WebView webview;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    webview = (WebView)findViewById(R.id.output);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadsImagesAutomatically(true);
    webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    webview.getSettings().setAppCacheEnabled(false);

    webview.setWebViewClient(new WebViewClient(){

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            if(url.startsWith("tel:")) { 
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
                startActivity(intent); 
                return true;
            }
            return false;

        }
    }
            );
    webview.loadUrl("http://www.example.com");
  }
    //this is to go back to previous pages if exists
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                if(webview.canGoBack()){
                    webview.goBack();
                }else{
                    finish();
                }
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

如果可能,我可以设置启动画面的时间,只要网址加载时没有给出时间吗?

第二次尝试

public class MainActivity extends Activity {
WebView webview;
private boolean isSplashOn = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    webview.setBackgroundColor(0);
    webview.setBackgroundResource(R.drawable.activity_splash);

    webview = (WebView)findViewById(R.id.output);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadsImagesAutomatically(true);
    webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    webview.getSettings().setAppCacheEnabled(false);
    webview.setWebViewClient(new WebViewClient(){
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);

            if(url.startsWith("tel:")) { 
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(intent); 
                return true;
            }
            return false;

        }

        public void onPageFinished(WebView view, String url) {
            if(isSplashOn) { 
                webview.setBackgroundDrawable(null);             
                webview.setBackgroundColor(0);

                isSplashOn = false;
            }

            super.onPageFinished(view, url);
        }
    }
            );
    webview.loadUrl("http://www.example.com");
}
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                if(webview.canGoBack()){
                    webview.goBack();
                }else{
                    finish();
                }
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }


}

专家。问题仍未解决。需要一些帮助

3 个答案:

答案 0 :(得分:2)

你可以使用简单的技巧 - 我正在显示一个加载微调器,直到页面被加载到后台。 因此我使用了两个Web视图。 在您的情况下,您可以使用ImageView或任何其他视图。

XML 文件会喜欢这个 -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

//Actual webview
    <WebView
        android:id="@+id/actual_webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

//Any view you want to show while webpage is loading
    <WebView
        android:id="@+id/spinner_webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />
...
</RelativeLayout>

现在,在 JAVA 文件 -

//initially, make actual_webview invisible
        actual_webview.setVisibility(View.INVISIBLE);

另外,

     @Override
        public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);

// make spinner_webview invisible
    spinner_webview.setVisibility(View.INVISIBLE);

// make actual_webview visible
    actual_webview.setVisibility(View.VISIBLE);
    }

此外,

shouldOverrideUrlLoading(...)
onPageStarted(...)
onPageFinished(...)

在所有这些方法中,您获取URL并可以检查正在加载或完成加载的URL。 根据URL,您可以决定是否显示/隐藏启动画面。

答案 1 :(得分:1)

您可以在没有AsyncTask的情况下执行此操作,并且可以在没有计时器的情况下加载页面时隐藏启动画面。

WebViewClient 类有一个方法onPageFinished(),一旦页面加载就会调用它。你可以利用它。

在项目文件夹中,放置名为“splash_screen.png”的闪屏图像(或任何您想要的名称。如果您想使用其他名称,请更改此行webView.setBackgroundResource(R.drawable.splash_screen);以映射到您的初始屏幕图像文件)在 res / drawable-xxx 下具有相应的分辨率。

对于Eg: 我按照这些分辨率为我的应用程序的启动画面。

hdpi - 400x800
ldpi - 240x320
mdpi - 320x480
xdpi - 640x960

试试这段代码:

public class MainActivity extends Activity {
    final Activity activity = this;

    private WebView webView;

    private boolean isSplashOn = false;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webView);

        webView.setBackgroundColor(0);
        webView.setBackgroundResource(R.drawable.splash_screen);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        webView.getSettings().setAppCacheEnabled(false);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setPluginsEnabled(true);
        webView.getSettings().setPluginState(PluginState.ON);
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(false);

        webView.setWebViewClient(new MyWebClient());

        webView.loadUrl("http://www.google.com");
    }

    public class MyWebClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);

            if(url.startsWith("tel:")) {
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(intent);

                return true;
            }

            return false;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if(!isSplashOn) {               
                webView.setBackgroundDrawable(null);
                webView.setBackgroundColor(0);

                isSplashOn = true;
            }

            super.onPageFinished(view, url);
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            if(webView.canGoBack()) {
                webView.goBack();

                return true;
            }else {
                activity.finish();
            }
        }

        return super.onKeyDown(keyCode, event);
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="fitXY" />

</LinearLayout>

修改

顺便说一句,我发现你的代码存在问题。您正在尝试在实例化之前将初始屏幕设置为webview。

从此处更改您的代码:

webview.setBackgroundColor(0);
webview.setBackgroundResource(R.drawable.activity_splash);

webview = (WebView)findViewById(R.id.output);

到此:

webview = (WebView)findViewById(R.id.output);

webview.setBackgroundColor(0);
webview.setBackgroundResource(R.drawable.activity_splash);

答案 2 :(得分:1)

为什么启动必须是活动?

您可以在布局底部将其设为全屏幕ImageView,并使用处理程序隐藏它:

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (isDestroyed())
                return;
            mSplashView.setVisibility(View.GONE);
        }
    },2000);