2017-02-10 106 views
-2

我想在我的onClick()方法中使用全局變量。我有一個使用變量的AsyncTask()(順便說一下,我使用的是Microsoft Translator API,顯然爲了使用Translate.execute我需要需要來使用AsyncTask())。但是,每當我嘗試使用它,一個錯誤彈出,說:如何在onClick()方法中使用全局變量?

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

然而,我的程序要求我改變變量以後(我還沒有完成,但我敢肯定,我會需要更改變量),所以我不能將其聲明爲final。我從Variable is accessed within inner class. Needs to be declared final讀取,你應該全球化變量。

顯然,根據Global variables in Java,你需要使用public和static。但這是我遇到問題的地方。我遇到這個錯誤,當我嘗試全球化的變量:

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()你正在做的方式,在這種情況下,匿名內部類正在實現這個接口,因此你不能使用這種方式不是最終的變量。

的AsyncTask應該有一個構造函數和你應該通過這個變量設置爲構造函數和有它內部存儲的AsyncTask。然後,您可以繼續使用您的代碼,而不會出現此問題。