Так что название говорит само за себя. Я получаю ошибку компиляции в моем onClick
.
Вот код.
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);
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.
}
});
cancelButton = (Button) findViewById(R.id.cancel_button);
signInButton = (Button) findViewById(R.id.sign_in_button);
}
Ответы:
Если вы не хотите делать его окончательным, вы всегда можете просто сделать его глобальной переменной.
источник
Вы можете объявить переменную final или сделать ее переменной экземпляра (или глобальной). Если вы объявите его окончательным, вы не сможете изменить его позже.
Любая переменная, определенная в методе и доступная анонимному внутреннему классу, должна быть окончательной. В противном случае вы могли бы использовать эту переменную во внутреннем классе, не зная, что если переменная изменяется во внутреннем классе, а затем используется позже во включающей области видимости, изменения, сделанные во внутреннем классе, не сохраняются в охватывающей области. По сути, то, что происходит во внутреннем классе, остается во внутреннем классе.
Я написал здесь более подробное объяснение . Это также объясняет, почему переменные экземпляра и глобальные переменные не нужно объявлять окончательными.
источник
Ошибка говорит сама за себя, измените:
в
источник
final
на языке Java. Вместе с отсутствием параметров по ссылке это правило гарантирует, что локальные переменные назначаются только в методе, которому они принадлежат. Таким образом, код становится более читабельным.addSiteButton.setOnClickListener(new View.OnClickListener() {
, вы знаете, почему это может произойти?null
. Наверное, findViewById возвращаетсяnull
. Я не могу сказать больше, поскольку я не программист Android; Советую открыть отдельный вопрос. Конечно, это не имеет ничего общего с внутренними классами, финал, и др Similia .Вот забавный ответ.
Вы можете объявить окончательный одноэлементный массив и, по-видимому, изменить элементы массива, как хотите. Я уверен, что это нарушает саму причину, по которой это правило компилятора было реализовано в первую очередь, но это удобно, когда вы находитесь в привязке ко времени, как я сегодня.
На самом деле я не могу претендовать на это. Это была рекомендация IntelliJ! Чувствует себя немного взломанным. Но это не так плохо, как глобальная переменная, поэтому я подумал, что стоит упомянуть здесь. Это всего лишь одно решение проблемы. Не обязательно лучший.
источник
Как сказал @Veger, вы можете сделать
final
так, чтобы переменная могла использоваться во внутреннем классе.Я назвал его,
pager
а неmPager
потому, что вы используете его как локальную переменную вonCreate
методе.m
Префикс cusomarily зарезервирован для переменных - членов класса (то есть переменные, которые объявлены в начале класса и доступны для всех методов класса).Если вам действительно нужна переменная-член класса, сделать ее окончательной не получится, потому что вы не можете использовать ее
findViewById
для установки доonCreate
. Решение состоит в том, чтобы не использовать анонимный внутренний класс. Таким образом,mPager
переменную не нужно объявлять окончательной и ее можно использовать во всем классе.источник
источник