热门标签 | 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的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 本文将详细介绍如何在 Vue 项目中使用 Handsontable 插件,包括 npm 安装、基本配置和常用功能的实现。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
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社区 版权所有