2016-07-22 56 views
-3

根據下面給出的以下代碼嘗試寫入變量時出現上述錯誤。從內部類中訪問變量需要聲明爲最後 - 錯誤

我知道我可以通過全局聲明變量(mPager)並使其最終解決。但我不想讓它最終確定下來,我想知道爲什麼會出現這樣的錯誤,是否還有其他解決方法,而不是通過全局或最終方式聲明它?

public class fieldsActivity extends Activity { 

Button addSiteButton; 
Button cancelButton; 
Button signInButton; 


/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // to create a custom title bar for activity window 
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

    setContentView(R.layout.fields); 
    // use custom layout title bar 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar); 

    Pager adapter = new Pager(); 
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager); //Variable of CONCERN 
    mPager.setAdapter(adapter); 
    mPager.setCurrentItem(1); 



    addSiteButton = (Button) findViewById(R.id.addSiteButton); 
    addSiteButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mPager.setCurrentItem(2, true); //Compilation error happens here. 
     } 


    }); 
+1

化妝尋呼機作爲'final' –

+0

是錯誤不能更清晰,讓您的mPager爲決賽。 –

+0

http://stackoverflow.com/questions/24001752/why-the-compiler-ask-me-declare-a-variable-final-when-i-use-the-method-onclic – Nabin

回答

1

這是標準方式java(在java 8中它可能不同)處理閉包。據我所知,當有內部類時,編譯器通過自動生成的構造函數來生成變量的副本,而不是變量本身。然後,爲了不在內部類內部和外部不一致,變量必須是最終的,否則一個部分可能具有變量的過時狀態。除非你讓它成爲全球性的,否則。

相關的職位:
Why are only final variables accessible in anonymous class?

+0

它在java 8中有所不同:)他們有效地引入了最終的概念。看到http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final – Kushan

+0

我讀的工作方式,Java 8是不同的,沒有真正看到它在我的小屏幕上正常,雖然。無論如何感謝您的更新。 –

+0

@Andrei「爲了不在內部類和內部類不一致,變量必須是最終的,」我明白這個問題。但是如何使變量全局化,解決這個問題呢? –

相關問題