Проблема переменной области для события onKeyDown

У меня проблемы с использованием var "str" ​​в операторе if. Я знаю, что это проблема масштаба, но я не уверен, как ее исправить. Я потерпел неудачу несколько раз.

Моя цель - использовать значение "str" в операторе if, чтобы показать предупреждение или нет. Ограничение - я должен назначить значение "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

Обновить:

Хорошо, я старался не беспокоить вас чтением всего кода, но он короткий, и это может помочь.

В веб-просмотре я показываю html-страницу и читаю скрытую переменную, которая решает, должно ли отображаться окно предупреждения или нет. Я просто пытаюсь получить это значение в операторе 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 ответа

Решение

Не знаете точно, какова ваша цель, но не можете ли вы сделать строку переменной-членом?

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

Было бы полезно узнать, в каком классе находится метод слушателя; у вас есть это вне класса 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
Другие вопросы по тегам