热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求助一下为什么子类没法操作Webview的任何东西

这个是父类这个是子类求助一下子类内为什么设置webView无效啊
这个是父类


这个是子类


求助一下子类内为什么设置webView无效啊

23 个解决方案

#1


建议一下,您去移动的模块去提这个问题,这个是android的问题,在java web模块提,很少有人会解答的。

#2


那请问下该怎么弄啊,这个分已经给了 。。。能移动吗

#3


你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

#4


引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我试试啊明天 谢谢!

#5


引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。

#6


引用 5 楼 vincent1997 的回复:
Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);

#7


webview的问题为什么不在webview页操作,为什么要在别的页操作,又不是adapter,为何非要这么写。。。

#8


引用 7 楼 lx912356858的回复:
webview的问题为什么不在webview页操作,为什么要在别的页操作,又不是adapter,为何非要这么写。。。

强迫症。。想把js接口模块化。。。

#9


引用 6 楼 睡精灵的回复:
Quote: 引用 5 楼 vincent1997 的回复:

Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);


谢谢您 我试试。。

#10


引用 6 楼 睡精灵的回复:
Quote: 引用 5 楼 vincent1997 的回复:

Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);


按照您的写法写了,还是没反应。。页面不会跳转

#11


引用 10 楼 vincent1997 的回复:
Quote: 引用 6 楼 睡精灵的回复:
Quote: 引用 5 楼 vincent1997 的回复:

Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);


按照您的写法写了,还是没反应。。页面不会跳转


晕了,你以前没写过Android代码吗?可以的话把代码和需求贴出来。

#12


引用 11 楼 睡精灵的回复:
Quote: 引用 10 楼 vincent1997 的回复:

Quote: 引用 6 楼 睡精灵的回复:
Quote: 引用 5 楼 vincent1997 的回复:

Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);


按照您的写法写了,还是没反应。。页面不会跳转


晕了,你以前没写过Android代码吗?可以的话把代码和需求贴出来。

稍等我回去给您完整的贴出代码,才学习第三天java。。。公司要求做app 没办法

#13


引用 6 楼 shuijinglingsos 的回复:
Quote: 引用 5 楼 vincent1997 的回复:

Quote: 引用 3 楼 睡精灵的回复:
你的JsInterface子类是new出来的,里面的webview没有初始化,当然不能用了,
你的子类没有必要继承mainActivity,可以在构造函数里将webview传入到子类,就可以用了。

我在构造函数传入了webview还是无法使用。。




private Webview mWebview;

public JsInterface(Webview webview,Context context){
         mWebview=webView;
}

使用:new JsInterface(webview,this);



父类完整代码:

package com.example.gibub_app;

import com.example.gibub_app.JsInterface;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends Activity {
public  WebView webView;
public  Object wv;
private ProgressBar progressbar;
private long mExitTime;
final Activity context = this;
Context mContext;
@SuppressLint({ "JavascriptInterface", "SetJavascriptEnabled" })
    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();

webView = (WebView) findViewById(R.id.wv_js2java);
webView.addJavascriptInterface(new JsInterface(this,webView), "javaObj");  

WebSettings wv = webView.getSettings();
wv.setJavascriptEnabled(true);
wv.setUseWideViewPort(true);
        wv.setDisplayZoomControls(false);
        

    webView.setWebViewClient(new webviewClient());  
    webView.loadUrl("http://www.zangyixue.cn/app/");
 
    progressbar = (ProgressBar) findViewById(R.id.progressbar);
    
    new Thread(new Runnable() {
        @Override
        public void run() {
         setTitle("fengyi.hua");
        }
       }); 
    


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}



@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}


 public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode==KeyEvent.KEYCODE_BACK)
        {
              if(webView.canGoBack()){
                  webView.goBack();
                  return false;
              }else{
               if ((System.currentTimeMillis() - mExitTime) > 2000) {
                     Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
                     mExitTime = System.currentTimeMillis();
                     return false;
               }else{
               Intent intent = new Intent(Intent.ACTION_MAIN);  
                        intent.addCategory(Intent.CATEGORY_HOME);  
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
                        startActivity(intent);  
                        android.os.Process.killProcess(android.os.Process.myPid());
               }
              }
        }
        return super.onKeyDown(keyCode, event);
    }

 
 class webviewClient extends WebViewClient {  
 
 @Override  
         public void onPageStarted(WebView view, String url, Bitmap favicon)   
         {  
 //if(ShowImage == 1){
//  webView.getSettings().setLoadsImagesAutomatically(true);
// }else{
//  webView.getSettings().setLoadsImagesAutomatically(false);
// }
 progressbar.setVisibility(View.VISIBLE);
             super.onPageStarted(view, url, favicon); 
         } 
 @Override  
 public void onPageFinished(WebView view, String url) {  
 progressbar.setVisibility(View.INVISIBLE);
 super.onPageFinished(view, url);
 //加载完成后执行交互任务
 Version ver = new Version(getApplicationContext());
       webView.loadUrl("Javascript:checkVersionShow(" + ver.GetVersion().toString() + ")");
 }
 
 } 

}







子类完整代码:

package com.example.gibub_app;
import android.content.Context;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Toast;
public class JsInterface{
Context mContxt;
    private WebView mWebView;
    //private View view;
    
public JsInterface(Context mContxt,WebView webview) {
        this.mContxt = mContxt;
        mWebView = webview;
    }
    @JavascriptInterface
    public void Msg(String name) {
     switch(name){
     case "1":
     checkVersion(name);
     break;
     }
        
    }
     
    
    @JavascriptInterface
    public String checkVersion(String name) {
     return "1.1";
    }
    @JavascriptInterface
    public void setDisplayImage(String name) {
if(name.equals("1")){
mWebView.loadUrl("http://www.baidu.com");
//().setLoadsImagesAutomatically(false);
         Toast.makeText(mContxt, "已开启", Toast.LENGTH_LONG).show();
     }else{
         Toast.makeText(mContxt, "已关闭", Toast.LENGTH_LONG).show();
     }

    }
 

    
    
}
//Toast.makeText(mContxt, "asdasadsa:" + name, Toast.LENGTH_SHORT).show();
//Toast.makeText(mContxt, "1.1", Toast.LENGTH_LONG).show();

#14


给楼主一个建议,不要把webView传进去,这样会在接口类里面处理业务。可以传入一个自定义Handler,通过Handler对象发送消息,然后在Handler类里面去处理对应的业务。

#15


因为电脑要炸了 赶紧关机重启

#16


你的代码应该是没有问题的啊,你是怎么调用的setDisplayImage的方法的,在HTML界面上这样调用:


window.javaObj.setDisplayImage("1");

#17


引用 16 楼 睡精灵的回复:
你的代码应该是没有问题的啊,你是怎么调用的setDisplayImage的方法的,在HTML界面上这样调用:


window.javaObj.setDisplayImage("1");

要加window啊?

#18


上面都在回答些什么啊。。。。。。你的webview是在oncreate方法里才初始化的,子类继承了父类,可以使用父类非私有的成员变量,但是,你的webview在父类定义的时候没有初始化,所以子类当然不能用啊。

#19


引用 18 楼 wlwlxgg的回复:
上面都在回答些什么啊。。。。。。你的webview是在oncreate方法里才初始化的,子类继承了父类,可以使用父类非私有的成员变量,但是,你的webview在父类定义的时候没有初始化,所以子类当然不能用啊。

请问一下如何在父类定义时初始化,感激不尽

#20


引用 18 楼 wlwlxgg 的回复:
上面都在回答些什么啊。。。。。。你的webview是在oncreate方法里才初始化的,子类继承了父类,可以使用父类非私有的成员变量,但是,你的webview在父类定义的时候没有初始化,所以子类当然不能用啊。


同问,要是按照楼主最开始的代码,如何在父类里面定义webview的时候初始化?

#21


引用 17 楼 vincent1997 的回复:
Quote: 引用 16 楼 睡精灵的回复:
你的代码应该是没有问题的啊,你是怎么调用的setDisplayImage的方法的,在HTML界面上这样调用:


window.javaObj.setDisplayImage("1");

要加window啊?


找到问题了,其实js调用java方法跟ui不是一个线程,所以直接调用webview.load会报错,使用handler过度一下就行了,用你的代码修改了一下写了个测试,handler简单写了一下,你可以在activity构建handler,传入js接口,需要在ui线程运行的,就发消息过去。


package com.elf.demo;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class WebViewTestActivity extends AppCompatActivity {

    WebView webView;

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


        webView = (WebView) findViewById(R.id.webView1);
        webView.addJavascriptInterface(new JsInterface(this,webView), "javaObj");

        WebSettings wv = webView.getSettings();
        wv.setJavascriptEnabled(true);
        wv.setUseWideViewPort(true);
        wv.setDisplayZoomControls(false);

        webView.loadUrl("file:///android_asset/webview1.html");
    }

    @Override
    public void onBackPressed() {
        if(webView.canGoBack()){
            webView.goBack();
        }else {
            super.onBackPressed();
        }
    }

    public class JsInterface{
        Context mContxt;
        private WebView mWebView;
        private Handler mHandler=new Handler();
        //private View view;

        public JsInterface(Context mContxt,WebView webview) {
            this.mContxt = mContxt;
            mWebView = webview;
        }
        @JavascriptInterface
        public void Msg(String name) {
            switch(name){
                case "1":
                    checkVersion(name);
                    break;
            }

        }


        @JavascriptInterface
        public String checkVersion(String name) {
            return "1.1";
        }
        @JavascriptInterface
        public void setDisplayImage(final String name) {
//            if(name.equals("1")){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mWebView.loadUrl(name);
                }
            });

                //().setLoadsImagesAutomatically(false);
//                Toast.makeText(mContxt, "已开启", Toast.LENGTH_LONG).show();
//            }else{
//                Toast.makeText(mContxt, "已关闭", Toast.LENGTH_LONG).show();
//            }

        }
    }
}










    
    



    

    

    








#22


可以尝试,使用Handler发送消息到方法外部操作,之前在使用js与Activitiy互动时遇到此问题,在定义的js回调方法中无法操作Activity中的任何控件,最后使用handler解决问题!!

#23


额,刚看到,你已经解决问题了,呵呵!

推荐阅读
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • 在进行微信小程序开发过程中,遇到了需要实现类似微信朋友圈那样的长文本折叠功能的需求。本文将详细探讨其实现方法及注意事项。 ... [详细]
  • 本文详细介绍了如何在Android应用中处理和使用Cookie,包括登录时获取Cookie并将其存储,以及在WebView中同步这些Cookie以保持用户会话。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Web App vs Native App:未来的移动应用趋势
    随着移动互联网的发展,Web App和Native App之间的竞争日益激烈。对于开发者而言,选择哪一种技术路径更为明智?本文将深入探讨两种应用模式的特点及未来趋势。 ... [详细]
  • 作为一名在大型手机游戏公司工作的程序员,尽管主要负责游戏逻辑和内容的开发,但对iOS底层开发接触较少。现在有了iPhone和可以虚拟MAC环境的电脑,希望能找到有效的iOS开发学习路径。 ... [详细]
  • 本文探讨了在安卓设备上的微信H5环境中,如何解决长按图片时无法保存或分享Base64编码图片及Blob形式图片的问题,并提供了有效的解决方案。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文探讨了在iOS开发中如何利用WKWebView实现H5页面与原生应用的高效融合。通过具体案例分析,展示了一种新颖的方法来解决H5页面内容高度的动态获取问题,旨在为开发者提供实用的技术参考。 ... [详细]
author-avatar
srh女孩不哭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有