热门标签 | 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


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

推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
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社区 版权所有