2012-02-16 90 views
2

我正在写一个Android应用程序(android 2.3.3/API 10),通过WebView加载网站。看看android.webkit.webview源代码,特别是onSavePassword(...)(你可以找到它HERE)我想发起我自己的自定义AlertDialog而不是股票一个 并应用我的更改,或者我必须编辑android.webkit.webview源码并重新编译android.jar?定制Android Webview类

我应该早点解释说,我试图这样的事没有成功:

class MyWebView extends WebView { 
    public MyWebView(Context context) { 
     super(context); 

    } 
@Override 
    boolean onSavePassword(String schemePlusHost, String username, String password, final Message resumeMsg) { 
     boolean rVal = false; 
      if (resumeMsg == null) { 
       // null resumeMsg implies saving password silently 

      } else { 
       final Message remember = mPrivateHandler.obtainMessage(REMEMBER_PASSWORD); 
       remember.getData().putString("host", schemePlusHost); 
       remember.getData().putString("username", username); 
       remember.getData().putString("password", password); 
       remember.obj = resumeMsg; 

       final Message neverRemember = mPrivateHandler.obtainMessage(NEVER_REMEMBER_PASSWORD); 
       neverRemember.getData().putString("host", schemePlusHost); 
       neverRemember.getData().putString("username", username); 
       neverRemember.getData().putString("password", password); 
       neverRemember.obj = resumeMsg; 

       new AlertDialog.Builder(getContext()) 
         .setTitle("My Custom Title") 
         .setMessage("My Custom Save/Don't Save Dialog Message") 
         .setPositiveButton(com.android.internal.R.string.save_password_notnow, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           resumeMsg.sendToTarget(); 
          } 
         }) 
         .setNeutralButton(com.android.internal.R.string.save_password_remember, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           remember.sendToTarget(); 
          } 
         }) 
         .setNegativeButton(com.android.internal.R.string.save_password_never, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           neverRemember.sendToTarget(); 
          } 
         }) 
         .setOnCancelListener(new OnCancelListener() { 
          public void onCancel(DialogInterface dialog) { 
           resumeMsg.sendToTarget(); 
          } 
         }).show(); 
       // Return true so that WebViewCore will pause while the dialog is 
       // up. 
       rVal = true; 
      } 
      return rVal; 
    } 

Eclipse的正当要求“的方法onSavePassword类型MainActivity.MyWebView的(字符串,字符串,字符串,消息)必须重写超类方法“,并告诉我删除@Override。并且更改后的对话框不需要。

再次感谢

编辑

我想改变,即方法。 android webview.class中的onSavePassword(...)没有与其关联的修饰符。我认为这意味着这种方法只能被驻留在相同包中的类访问。正如我之前提到的,我尝试创建自己的webview类来扩展库存类,但它没有找到onSavePassword。任何想法,或webView类的其他扩展的例子可能指向正确的方向?

回答

0

刚刚覆盖。

但是,你应该采取试测试误差周期的策略,这是一个goog方式IT学习...

+0

感谢您的提示,我只是尝试执行@Override是这样的:私人类MyWebViewClient扩展WebViewClient {} – 2012-02-16 19:40:34

+0

重写是不是继承类。Overiding意味着在子类中重新定义一个从sueprclass继承的方法。 – Snicolas 2012-02-16 20:46:26

0

为什么不干脆让自己WebViewExt类,它扩展WebView和覆盖功能?然后使用您自己的WebViewExt并忘记WebView存在。

+0

这听起来像我想要遵循的解决方案。我发现我想重写的方法:/ *包* /布尔onSavePassword(字符串schemePlusHost,字符串用户名, 字符串密码,最终消息resumeMsg)但当我在MyWebView类中进行更改时,我得到“方法onSavePassword (字符串,字符串,字符串,消息)类型MyWebView必须重写超类方法“。任何示例代码从sombody其他谁建立自己的webview类? – 2012-03-22 19:23:45

4

一旦您使用自己的扩展WebView类,您应该重命名com.packagename.YourNewWebViewClass的Layout XML文件中的每个Web浏览器。

事实上:

<WebView layout......></WebView> 

将成为

<com.mypackage.MyWebView layout....></com.mypackage.MyWebView layout> 

这应该做的伎俩!

+0

感谢您的帮助。我仍然遇到了webView扩展类的问题。有人能够成功扩展webview的一些示例代码吗? – 2012-03-23 11:37:46

0

为什么你不在你的代码中创建与WebView相同的包并将你的类放入该包中。在运行时它会被认为是在同一个包中,你将能够使用@override注释

+0

感谢您的帖子。这是我倾向的方向,但我从来没有得到它的工作。有一个例子吗? – 2012-08-27 12:50:01