【问题标题】:How to load url in webview in background while splashscreen is showing?如何在显示启动画面时在后台的 webview 中加载 url?
【发布时间】:2023-04-06 10:14:01
【问题描述】:

这是我的启动画面活动。

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);
    }
}

如果可能的话,我可以设置启动屏幕的时间,只要不给时间就加载 url 吗?

第二次尝试

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);
    }


}

伙计们。问题还是没有解决。需要帮助

【问题讨论】:

  • 结合这两个活动。首先显示初始屏幕并在背景上加载 web 视图。最初将 Web 视图保持为隐藏状态。超时完成后显示 webview。 (它只是一个黑客)
  • @RaviGadipudi 你能详细解释一下吗?我只是一个初学者。所以..

标签: java android android-asynctask


【解决方案1】:

您可以使用简单的技巧 - 我正在显示一个加载微调器,直到页面在后台加载。 因此,我使用了两个 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 正在加载或完成加载。 根据网址,您可以决定是否显示/隐藏启动画面。

【讨论】:

  • 对不起那个人。我已经得到了解决方案。从另一个帖子中得到了解决方案。所以忘了解决。无论如何。解决方案是您答案的一部分。谢谢你。
  • 没关系..最终你找到答案很好..!!
  • 如果您擅长 Java 中的 Web 应用程序,请来这里。那里的给出答案帮助了我。但这仍然存在问题。 stackoverflow.com/questions/32968006/…
  • 我无法回答,因为问题已被搁置。我在我的 android 应用程序中做了同样的事情,但由于字符限制,无法分享此评论中的逻辑。
  • 所以。如果可以,请创建一个聊天室并分享一些代码。我会尝试以我的方式实现它。请
【解决方案2】:

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

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

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

例如: 我为我的应用程序的启动屏幕遵循了这些解决方案。

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);

【讨论】:

  • 它不是这样工作的。当我使用这种代码时,应用程序崩溃了。好的。现在如果我想用 AsyncTask 来做,我应该怎么做?
  • 我在第二次尝试@kesavan的问题中发布了它
  • @Krishna,在您的第二个代码 sn-p 中,我看不到任何使用闪屏的代码。顺便问一下,您是否为启动画面创建单独的活动?
  • 没有。我从清单中删除了 splash.java 活动。当我尝试你的代码时,程序的任何部分都没有指向 Splash.class,
  • 您必须将启动画面图像放在 res/drawable-xxxx 文件夹中,名称为 splash_screen。各种尺寸请参考这里link
【解决方案3】:

为什么喷溅必须是一个活动?

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

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

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2011-09-29
    • 2019-02-01
    • 2013-02-02
    • 1970-01-01
    • 2023-03-27
    • 2015-10-07
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多