当我选择操作栏返回时冻结或制作稳定的 Web 视图?防止每次加载/重新加载

Posted

技术标签:

【中文标题】当我选择操作栏返回时冻结或制作稳定的 Web 视图?防止每次加载/重新加载【英文标题】:Freeze or make Stable Web-view When I Select Action Bar Back?Prevent Loading/reloading every time 【发布时间】:2017-09-02 11:45:04 【问题描述】:

当我从选项菜单中选择任何菜单时,我想阻止页面重新加载或冻结当前的 Web 视图

这是我的网页视图

    public class MyWebV extends AppCompatActivity 

    private WebView webView;

    public void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.mwview);


        Toolbar toolbar = (Toolbar) findViewById(R.id.tb1);
        setSupportActionBar(toolbar);

        webView = (WebView) findViewById(R.id.web5);
        WebSettings set = webView.getSettings();
        webView.setWebViewClient(new WebViewClient());
        webView.setWebChromeClient(new WebChromeClient());
        set.setjavascriptEnabled(true);
        set.setJavaScriptCanOpenWindowsAutomatically(true);
        set.setLoadWithOverviewMode(true);
        set.setUseWideViewPort(true);
        set.setDomStorageEnabled(true);
        set.setAllowUniversalAccessFromFileURLs(true);
        set.setJavaScriptCanOpenWindowsAutomatically(true);
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        final ProgressDialog progressBar = ProgressDialog.show(MyWebV.this, "Please Wait", "Loading...");
        webView.requestFocusFromTouch();
        webView.setWebViewClient(new WebViewClient()
        

           public void onLoadResource (WebView view, String url) 
                if (progressBar == null) 

                    progressBar.setTitle("Please Wait !");
                    progressBar.setMessage("Loading...");
                    progressBar.show();
                
            

            public void onPageFinished(WebView view, String url) 

                try
                    if (progressBar.isShowing()) 
                        progressBar.dismiss();
                    
                catch(Exception exception)
                    exception.printStackTrace();
                
            

        );

        webView.setWebChromeClient(new WebChromeClient() 


        String url = "www.example.com/login.php";
        webView.loadUrl(url);

    

    @Override
    protected void onSaveInstanceState(Bundle outState)
        super.onSaveInstanceState(outState);

        webView.saveState(outState);
    

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) 
        super.onRestoreInstanceState(savedInstanceState);
        webView.restoreState(savedInstanceState);
    

    @Override
    public void onConfigurationChanged(Configuration newConfig)
        super.onConfigurationChanged(newConfig);
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 

        getMenuInflater().inflate(R.menu.m_MyWebV, menu);


        return true;

    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 

        int id = item.getItemId();

        if (id == R.id.about1) 
            Intent aboutIntent = new Intent(this, About.class);
            startActivity(aboutIntent);
            return true;
        
        else if (id == R.id.set1) 
            Intent webIntent = new Intent(this, Settings.class);
            startActivity(webIntent);
            return true;
        

        return super.onOptionsItemSelected(item);
    



我的 Web 视图我有一些菜单,所以当我点击任何菜单(如设置或关于...重新加载

所以我需要登录并检查上一页每次都很困难..谁能建议我如何冻结网络视图或如何防止使用相同的应用程序菜单重新加载...

更新

这是关于我们的课程

public class About extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aboutus);

    Toolbar toolbar = (Toolbar) findViewById(R.id.tb3);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);



@Override
public boolean onCreateOptionsMenu(Menu menu) 

    getMenuInflater().inflate(R.menu.m_about, menu);

     /*something*/
     return true;


@Override
public boolean onOptionsItemSelected(MenuItem item) 

    int id = item.getItemId();

    if (id == R.id.home) 
        Intent mypIntent = new Intent(this, MyWebV.class);
        About.this.finish();
        startActivity(mypIntent);
        return true;
    
    else if (id == R.id.about1) 
        Intent aboutIntent = new Intent(this, About.class);
        About.this.finish();
        startActivity(aboutIntent);
        return true;
    

    return super.onOptionsItemSelected(item);

例如,如果这是操作栏返回

所以当我单击箭头时,它正在重新加载 webview.. 在设备硬件上我已禁用...在硬件上它很好但是...在操作栏上它正在重新加载

【问题讨论】:

试试这个:webview.canGoBack() 如果它是真的然后把这个代码 webview.goBack() 否则完成。在您的情况下,您可以在 canGoBack 返回 true 时直接完成您的应用程序。 你能回答..拜托我没有得到...... 我理解你的问题是你点击一些菜单并选择选项,这样你的网页浏览页面就可以加载了。现在的问题是,当您单击返回按钮时,您想退出该屏幕,但您不能正确。 noo... 实际上... Web 工作正常... 但是当我选择关于我们和设置页面时,它们也工作正常但是当我选择操作返回按钮...而不是设备时。 . 后退按钮 .. 它进入网页查看页面,但是网页查看页面中的数据正在重新加载......我需要再次从登录开始.. 有没有办法停止重新加载......并检查关于我们和设置菜单然后返回到相同的 webstate....无需重新加载...注意:我的硬件后退按钮导致退出并发出警报...所以我在操作栏中添加了操作后退按钮... 是的,这是可能的。您可以通过使用 startActivityForResult 而不是普通的 startActivity 来实现这一点 【参考方案1】:

我刚刚使用两个活动进行了测试,一个包含 webView 的 MainActivity 就像您的一样,以及一个打开第二个活动 (About.java) 的菜单按钮,使用与您在 onOptionsItemSelected() 中使用的完全相同的意图。

从菜单中打开关于活动后,如果我按下手机的硬件返回按钮,它会返回到 MainActivity 而不会重新加载 WebView 的内容,因此它可以正常工作

我认为您遇到的问题是您用于返回主要活动的代码。您可能正在使用 Intent 从您的辅助活动再次打开您的主要活动,导致创建主要活动的新实例,触发 onCreate(),从而重新创建您的 WebView 并重新加载页面。

要测试是否是这种情况,您可以使用 Log.d()System.out.println() 在 onCreate() 中添加一些调试语句,以当您尝试返回主要活动 (MyWebV) 时,检查它是否被调用。如果您在日志中看到调试消息,那是因为您没有正确返回 Main Activity

您应该关闭次要活动以返回主要活动的方式是调用:

finish()

该方法将关闭当前活动并恢复堆栈中的前一个活动(在本例中为您的 MyWebV 活动),无需重新创建它,只需调用 onStart() 和 onResume(),这不会重新创建您的WebView 或重新加载页面。

【讨论】:

我已经添加了这个finish();关于但是当我按下操作栏后退按钮时,它正在重新加载网页..在硬件上还可以...但是我需要操作栏后退按钮来防止 Webview 重新加载...大多数用户都选择操作栏后退按钮 在您更新的问题中,您正在创建一个启动 MyWebV 的意图,当用户单击“R.id.home”时,您将创建一个新的 MyWebV 实例。仅使用 finish() 将转到以前打开的活动。我还建议让您的辅助活动在 ActionBar 中只有后退按钮,以返回 MainActivity,而不允许打开其他活动。所以用户只需访问一个activity并返回主activity,应用导航和结构更容易理解。 如果您更喜欢在 About 和 Settings 中保留菜单,您可以检查 Intent 标志,例如 FLAG_ACTIVITY_SINGLE_TOP 和许多其他更改意图行为以重用打开的活动或将其置于前面的标志,并查看您需要哪些标志才能获得正确的行为。 另外,您是否在 onCreate() 中添加了调试语句,如果添加了,您可以检查“如果”或“何时”重新创建 web 视图。【参考方案2】:

关于我们或设置您使用自定义后退事件或硬件后退事件的页面代码。我认为您正在您的后退事件中再次创建活动,这不需要您只需调用您的设置或关于我们的完成方法页面在那里完成,Webview 页面保持不变。这就是为什么我要求您发布您的页面之一的代码,至少我可以理解您到底做了什么。

 public class About extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aboutus);

        Toolbar toolbar = (Toolbar) findViewById(R.id.tb3);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 

        getMenuInflater().inflate(R.menu.m_about, menu);

         /*something*/
         return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 

        int id = item.getItemId();

        if (id == R.id.home) 
            finish();
            return true;
        
        else if (id == R.id.about1) 
            Intent aboutIntent = new Intent(this, About.class);
            About.this.finish();
            startActivity(aboutIntent);
            return true;
        

        return super.onOptionsItemSelected(item);
    

    

@Override public boolean onOptionsItemSelected(MenuItem item) 
 int id = item.getItemId(); 
   if (id == android.R.id.home)  
                                  finish(); 
                                 return true; 
             
        return super.onOptionsItemSelected(item); 
  

【讨论】:

我已经添加了这个finish();关于但是当我按下操作栏后退按钮时,它正在重新加载网页..在硬件上还可以...但是我需要操作栏后退按钮来防止 Webview 重新加载...大多数用户都选择操作栏后退按钮 能否请您发布您的代码 AboutUs.java 或 Setteing.java 在这里if (id == R.id.home) finish(); return true; 很好,但它在操作栏后面不起作用

以上是关于当我选择操作栏返回时冻结或制作稳定的 Web 视图?防止每次加载/重新加载的主要内容,如果未能解决你的问题,请参考以下文章

excel如何设置固定表头

向后滑动时嵌套推送动画可能导致导航栏损坏

iOS应用轮换导致冻结[关闭]

iAD 视图在广告关闭时冻结

excel如何冻结首行或首列及首行首列同时冻结

导航控制器弹出动画时导航栏向上移动