2016-10-11 11 views
0

Я столкнулся с странной проблемой с Java для Android. Я создаю слушателя для кнопки, и мне нужно взять текстовое редактирование в виде строки и вернуть его в строку, которая будет использоваться в качестве проверки подлинности.
Я получаю сообщение об ошибке, что мне нужно объявить переменную AccessCraw окончательной, и когда я создаю ее в качестве окончательного, она говорит, что я не могу ее отредактировать. Как я могу преформировать это, не получив целую кучу ошибок? (Код ниже)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 в Клас-широкие рамки, и вместо того, чтобы объявить его в OnCreate, его хочет, чтобы он был объявлен окончательным.

Так объявите свой EditeText в широком масштабе.

0

Это очень похоже на popular issue in JavaScript. Вам не нужно назначать глобальные переменные из асинхронных событий. Вместо этого вызовите метод, который использует значение в качестве параметра.

Вызвать код, который требует асинхронного значения внутри обработчика событий.

0

всякий раз, когда вы получаете такое предупреждение, сделайте переменную глобальной.
Причина? когда вы используете переменную в innerclass, она создает новую копию этой переменной, и любые внесенные в нее изменения не будут отображаться снаружи. поэтому мы объявляем переменную final и не делаем никаких изменений, чтобы избежать конфликтов, но если есть необходимость внести изменения в эту переменную, вы сделаете ее глобальной, чтобы она имела одинаковый доступ ко всем классам и не создавала дубликатов. прочитайте java docs для получения более подробной информации.

Как уже упоминалось в одном из ответов, чтобы сохранить безопасность данных, предлагается использовать сеттеры и геттеры, которые манипулируют переменной из внутренних классов или асинхронных ментодов.

0

Объявление переменной как окончательного намеренно сделано для предотвращения изменения ее стоимости в будущем. Очевидно, именно поэтому вы не можете изменить значение.

Android и Java в целом требуют, чтобы переменные, не объявленные в глобальном (классе), были объявлены окончательными, если вы хотите использовать их во внутреннем классе. Это необходимо для предотвращения путаницы при изменении переменной.

Как уже упоминалось, если для начала требуется значение String, объявите его в глобальной области.

 Смежные вопросы

  • Нет связанных вопросов^_^