2017-02-10 6 views
-2

Я пытаюсь использовать глобальную переменную в моем методе onClick(). У меня есть AsyncTask(), который использует переменную (BTW, я использую Microsoft Translator API и, видимо, для использования Translate.execute I необходимо использовать для использования AsyncTask()). Тем не менее, всякий раз, когда я пытаюсь использовать его, ошибка выскакивает, говоря:Как использовать глобальную переменную в методе onClick()?

Variable "[variable]" is accessed from inner class, needs to be declared final. 

Однако моя программа требует, чтобы изменить переменную позже (я еще не сделал, но я уверен, что будет нужно изменить переменную), поэтому я не могу объявить ее окончательной. Я прочитал от Variable is accessed within inner class. Needs to be declared final, что вы должны глобализовать переменную.

По-видимому, согласно Global variables in Java, вам необходимо использовать общедоступный и статический. Но здесь я столкнулся с проблемой. Я бегу в эту ошибку, когда я пытаюсь глобализовать переменную:

Modifier "public" not allowed here 

Modifier "static" not allowed here 

Есть ли способ, что я могу использовать переменную в другой области, и изменить его всякий раз, когда нажата моя кнопка? Мой код:

submit.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       String X = ""; 



       class MyAsyncTask extends AsyncTask<DownloadManager.Request, Void, String> { 


         try {   
          translatedText = Translate.execute(X, Language.AUTO_DETECT, Language.FRENCH); 

          return translatedText; 

         } catch (Exception e) { 
          e.printStackTrace(); 
          return ""; 
         } 
        } 
       } 
       new MyAsyncTask().execute(); 
      } 
     }); 
+0

Вам не нужно объявлять переменную static. Просто объявите его в своем классе и сможете использовать его внутри анонимного внутреннего класса. –

+0

Почему бы вам не использовать X в качестве глобальной переменной? Объявите его вне метода OnClickListener – TOP

+0

@TOP Несмотря на то, что я перемещаю его вне метода OnClickListener, он по-прежнему дает мне «Модификатор public и static not allowed here». – ADisplayName

ответ

0

Попробуйте это,

public String X = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 

    Button submit=(Button)findViewById(R.id.submit); 
    submit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      class MyAsyncTask extends AsyncTask<DownloadManager.Request, Void, String> { 

       @Override 
       protected String doInBackground(DownloadManager.Request... params) { 
        try { 
         translatedText = Translate.execute(X, Language.AUTO_DETECT, Language.FRENCH); 

         return translatedText; 

        } catch (Exception e) { 
         e.printStackTrace(); 
         return ""; 
        } 

        return null; 
       } 
      } 
      new MyAsyncTask().execute(); 
     } 
    }); 
} 
0

Хорошо, если я правильно понял, что это должно быть так: объявить

public String X = ""; 

во внешнем классе, вне метод onClick. Далее вам нужно объявить конструктор и член для MyAsyncTask

private String mTextToTranslate; 
public MyAsyncTask(String x){ 
    mTextToTranslate = x; 
} 

и в конце использования mTextToTranslate вместо X

0

При реализации onClickListener() так, как вы делаете, в этом случае анонимный внутренний класс реализует этот интерфейс, и поэтому вы не можете использовать переменную, которая не является final таким образом.

Ваш AsyncTask должен быть с конструктором, и вы должны передать эту переменную для этого конструктора и, она хранится внутри AsyncTask. Затем вы можете продолжить свой код без этой проблемы.