范围onKeyDown事件的变量问题

时间:2011-07-11 17:56:15

标签: java android scope

我在if语句中使用var“str”时遇到问题。我知道这是一个范围问题,但我不知道如何解决它。我失败了几次。

我的目标是在if语句中使用“str”的值来显示警告。 限制是我必须以这种方式分配“str”的值。

 public class MyJavaScriptInterface  
 {  
     public String showHTML(String html)  
     {  
         String str = html;
         return str;
     } 
 }



     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event)
     {

         //Handle the back button
         if(keyCode == KeyEvent.KEYCODE_BACK && str =="0")
         {
             //Ask the user if they want to quit

更新

好的,我试着不要在阅读整个代码时打扰你,但它很短,可能会有所帮助。

在webview中我展示了html页面,我还读了一个隐藏变量,它将决定是否应该显示一个警告框。我只是想在keydown push中的if语句中获取该值。这是整个代码。

package com.ishop.pizzaoven;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class buttonOne extends Activity
{
 WebView wb = null;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.buttons);
     wb = new WebView(this);
     wb.getSettings().setJavaScriptEnabled(true);
     wb.setWebViewClient(new HelloWebViewClient());
     wb.getSettings().setJavaScriptEnabled(true);
     wb.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
     /* WebViewClient must be set BEFORE calling loadUrl! */  
     wb.setWebViewClient(new WebViewClient()
     {  
         @Override  
         public void onPageFinished(WebView view, String url)  
         {  
             /* This call inject JavaScript into the page which just finished loading. */  
             wb.loadUrl("javascript:window.HTMLOUT.showHTML(document.getElementById('sendtextcoupon').value);");
         }  
     });
     wb.loadUrl("http://ishopstark.com/mobileapp.php?category=1");
     setContentView(wb);
 }

 private class HelloWebViewClient extends WebViewClient
 {
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        view.loadUrl(url);
        return true;
    }
 }

 final Context myApp = this;

 public class MyJavaScriptInterface  
 {  
     public void showHTML(String html)  
   {  
    String str = html;
} 
}




     public boolean onKeyDown(int keyCode, KeyEvent event)
     {

         //Handle the back button
         if(keyCode == KeyEvent.KEYCODE_BACK)
         {
             //Ask the user if they want to quit
             new AlertDialog.Builder(this)
             .setIcon(android.R.drawable.ic_dialog_alert)
             .setTitle("Coupon")
             .setMessage("Do you want a coupon texted to you?")
             .setPositiveButton("YES!", new DialogInterface.OnClickListener()
             {
                 @Override
                 public void onClick(DialogInterface dialog, int which)
                 {
                     //Stop the activity
                     Toast.makeText(buttonOne.this, "Great! You'll get one in just a couple of minutes.", Toast.LENGTH_LONG).show(); 
                     finish();
                 }
             })
             .setNegativeButton("Not now", new DialogInterface.OnClickListener()
             {
                 @Override
                 public void onClick(DialogInterface dialog, int which) 
                 {
                     //Stop the activity
                     finish();
                 }
             })
             .show();        
             return true;
         }
         else
         {
             return super.onKeyDown(keyCode, event);
         }

     }

}// End of main class

更新2:

好的,所以我改变了我的代码。但现在我得到任何想法的警报错误? “方法setIcon(int)未定义类型buttonOne.MyJavaScriptInterface”我在.setIcon(android.R.drawable.ic_dialog_alert)上收到此错误并返回super.onKeyDown(keyCode,event);

public class MyJavaScriptInterface  
 {  
     public String showHTML(String html)  
   {  
     String str = html;
     return str;
   } 
     public boolean onKeyDown(int keyCode, KeyEvent event, String str)
     {

         //Handle the back button
         if(keyCode == KeyEvent.KEYCODE_BACK && str == "0")
         {
             //Ask the user if they want to quit
             AlertDialog.Builder alertbox = new     AlertDialog.Builder(buttonOne.this);
             .setIcon(android.R.drawable.ic_dialog_alert)
             .setTitle("Coupon")
             .setMessage("Do you want a coupon texted to you?")
             .setPositiveButton("YES!", new DialogInterface.OnClickListener()
             {
                 @Override
                 public void onClick(DialogInterface dialog, int which)
                 {
                     //Stop the activity
                     Toast.makeText(buttonOne.this, "Great! You'll get one in just a couple of minutes.", Toast.LENGTH_LONG).show(); 
                     finish();
                 }
             })
             .setNegativeButton("Not now", new DialogInterface.OnClickListener()
             {
                 @Override
                 public void onClick(DialogInterface dialog, int which) 
                 {
                     //Stop the activity
                     finish();
                 }
             })
             .show();        
             return true;
         }
         else
         {
             return super.onKeyDown(keyCode, event);
         }

     }
}

2 个答案:

答案 0 :(得分:2)

不确定你的目标究竟是什么,但是你不能把字符串变成成员变量吗?

public class MyJavaScriptInterface  
{  
private String str;
 public String showHTML(String html)  
 {  
     str = html;
     return str;
    } 
 }

答案 1 :(得分:1)

知道监听器方法所在的类是有帮助的;你有它在MyJavaScriptInterface类之外,但没有任何上下文。所以当onKeyDown发生时,你是否有html才能运行showHTML(html)方法?它已经运行了吗?你有一个MyJavaScriptInterface实例来运行吗?

如果你有一个额外的}并且它确实是同一个班级的一部分,那么我同意@ Steve的回答。

如果它在课外,那么根据你的实际情况有很多解决方案。最简单的方法是将str作为实例变量,如@Steve所说,然后添加一个访问器方法:

public String getStr(){
    return str;
}

然后让你的监听器调用该访问器,而不是直接尝试使用str:

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
     // Get an instance of MyJavaScriptInterface; 
     MyJavaScriptInterface mjsi = new MyJavaScriptInterface();

     //Handle the back button
     if( keyCode == KeyEvent.KEYCODE_BACK && mjsi.getStr().equals("0") )
     {
         //Ask the user if they want to quit