2016-07-22 73 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“为了不在内部类和内部类不一致,变量必须是最终的,”我明白这个问题。但是如何使变量全局化,解决这个问题呢? –