开发者

Scope Variable issue for onKeyDown event

开发者 https://www.devze.com 2023-03-19 16:53 出处:网络
I am having trouble using the var \"str\" in an if statement. I know that it is a scope problem but I am not sure how to fix it. I have failed several times.

I am having trouble using the var "str" in an if statement. I know that it is a scope problem but I am not sure how to fix it. I have failed several times.

My goal is to use the value of "str" in an if statement to show an alert or not. Restriction is I have to assign the value of "str" this way only.

 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

Update:

OK I was try not to bother you with reading the whole code but it's short and it might help.

In a webview I show the html page and I also read a hidden variable which will decide if an alert box should show or not. I am just trying to get that value to the if statement in the keydown push. Here is the whole code.

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

Update 2:

ok so i changed my code a bit. But now I get alert errors any ideas? "The method setIcon(int) is undefined for the type buttonOne.MyJavaScriptInterface" I get this error on .setIcon(android.R.drawable.ic_dialog_alert) and return 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()
             {
     开发者_C百科            @Override
                 public void onClick(DialogInterface dialog, int which) 
                 {
                     //Stop the activity
                     finish();
                 }
             })
             .show();        
             return true;
         }
         else
         {
             return super.onKeyDown(keyCode, event);
         }

     }
}


Not sure exactly what your aim is, but can you not make the string a member variable?

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


It would be helpful to know which class the listener method is in; you have it outside the MyJavaScriptInterface class, but don't have any context around it. So when onKeyDown happens, do you have the html in order to run the showHTML(html) method? Has it already been run? Do you have an instance of MyJavaScriptInterface to run it on?

If you have an extra } in there and it is indeed a part of the same class, then I would agree with @Steve's answer.

If it's outside the class, then there are many solutions depending upon your actual situation. The simplest way would be to make str an instance variable as @Steve said, and then add an accessor method:

public String getStr(){
    return str;
}

and then have your listener call that accessor instead of attempting to use str directly:

 @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
0

精彩评论

暂无评论...
验证码 换一张
取 消