2016-10-11 52 views
0

我遇到了Java的Android奇怪问题。我为一个按钮创建了一个侦听器,我需要将一个文本编辑作为一个字符串并将其返回到一个字符串中,以用作身份验证检查。
我得到一个错误,我需要声明变量AccessCraw作为final,当我创建它作为最终它说我不能编辑它。我怎样才能做到这一点,而不会得到一大堆错误? (下面的代码)Java使我声明变量为final,但不会让我写入它

boolean loggedin = (false); 
    boolean acsessgranted = (false); 
    final String AccessCraw = "no"; 
    Button submit = (Button) findViewById(R.id.Submit); 
    Button startBtn = (Button) findViewById(R.id.EmailAdmin); 
    final EditText AccessCode = (EditText) findViewById(R.id.ACentry); 

    if(acsessgranted == (false)) { 
     setContentView(R.layout.activity_frun); 
    } 

    if(acsessgranted == (true)) { 
     if(loggedin == (false)) { 
      setContentView(R.layout.login); 
     } 
    } 

    if(acsessgranted == (true)) { 
     if(loggedin == (true)) { 
      cont(); 
     } 
    } 

    startBtn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      sendEmail(); 
     } 
    }); 
    submit.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AccessCraw = AccessCode.getText().toString(); 
     } 
    }); 
} 
+0

创建最终变量的目的是什么? – droidev

+1

你为什么要分配给该变量?在事件触发前变量将超出范围。 – 4castle

+0

声明AccessCraw为全局变量,这可能会解决您的问题。 – raasesh

回答

0

我认为这是你需要知道:

如果不放置的EditText在CLAS,范围广,而是 声明它的OnCreate,它希望它被宣布为最终。

因此,在分类范围内声明您的EditeText。

0

这与popular issue in JavaScript非常相似。您不应该需要从异步事件中分配全局变量。相反,调用一个使用该值作为参数的方法。

从事件处理程序中调用需要异步值的代码。

0

无论何时出现此类警报,请将变量设为全局。
原因?当您在innerclass中使用变量时,它会创建该变量的新副本,并且对其所做的任何更改都不会反映到外部。所以我们声明变量final并且不做任何更改以避免冲突,但是如果需要对该变量进行更改,则将其设置为全局,以便对所有类具有相同的访问权限,并且不会创建重复项。阅读java文档了解更多细节。

正如其中一个答案所述,为了保持数据的安全性,建议使用setter和getter来处理来自内部类或异步方法的变量。

0

将变量声明为final是故意的,以防止它的值在未来发生变化。显然,这就是为什么你无法改变价值。

如果您希望在内部类中使用它们,则Android和java通常需要在全局(类级别)范围内未声明的变量被声明为最终变量。这是为了防止混淆,如果变量更改。

正如其他人所说,如果您需要字符串以值开头,请在全局范围内声明它。

相关问题