Jadi judulnya menjelaskan semuanya. Saya mendapatkan kesalahan kompilasi di dalam file onClick
.
Ini kodenya.
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);
}
Jawaban:
Jika Anda tidak ingin menjadikannya final, Anda selalu dapat menjadikannya variabel global.
sumber
Anda dapat mendeklarasikan variabel final, atau menjadikannya sebagai variabel instance (atau global). Jika Anda menyatakannya sebagai final, Anda tidak dapat mengubahnya nanti.
Variabel apa pun yang ditentukan dalam metode dan diakses oleh kelas dalam anonim harus final. Jika tidak, Anda bisa menggunakan variabel itu di kelas dalam, tidak menyadari bahwa jika variabel berubah di kelas dalam, dan kemudian digunakan nanti di lingkup yang melingkupi, perubahan yang dibuat di kelas dalam tidak bertahan di lingkup yang melingkupi. Pada dasarnya, yang terjadi di kelas dalam tetap berada di kelas dalam.
Saya menulis penjelasan yang lebih mendalam di sini . Ini juga menjelaskan mengapa instance dan variabel global tidak perlu dinyatakan final.
sumber
Kesalahan mengatakan itu semua, ubah:
untuk
sumber
final
, dalam bahasa Java. Bersama dengan tidak adanya parameter rujukan, aturan ini memastikan bahwa penduduk lokal hanya ditetapkan dalam metode yang mereka miliki. Kode dengan demikian lebih mudah dibaca.addSiteButton.setOnClickListener(new View.OnClickListener() {
apakah Anda tahu mengapa hal itu akan muncul?null
. Mungkin, findViewById kembalinull
. Saya tidak bisa mengatakan lebih banyak, bukan menjadi programmer Android; Saya menyarankan Anda untuk membuka pertanyaan terpisah. Tentu, ini tidak ada hubungannya dengan kelas dalam, final, dan sejenisnya .Inilah jawaban yang lucu.
Anda dapat mendeklarasikan larik satu elemen terakhir dan mengubah elemen larik sesuai keinginan Anda. Saya yakin itu melanggar alasan mengapa aturan kompilator ini diterapkan di tempat pertama tetapi berguna ketika Anda dalam waktu-terikat seperti saya hari ini.
Saya sebenarnya tidak dapat mengklaim kredit untuk yang satu ini. Itu adalah rekomendasi IntelliJ! Rasanya agak hacky. Tapi sepertinya tidak seburuk variabel global jadi saya pikir itu perlu disebutkan di sini. Itu hanya satu solusi untuk masalah ini. Belum tentu yang terbaik.
sumber
Seperti yang dikatakan @Veger, Anda dapat membuatnya
final
agar variabel dapat digunakan di kelas dalam.Saya menyebutnya
pager
daripadamPager
karena Anda menggunakannya sebagai variabel lokal dalamonCreate
metode ini. Itum
awalan cusomarily disediakan untuk variabel anggota kelas (yaitu variabel yang dideklarasikan pada awal kelas dan tersedia untuk semua metode kelas).Jika Anda benar-benar membutuhkan variabel anggota kelas, itu tidak berfungsi untuk menjadikannya final karena Anda tidak dapat menggunakan
findViewById
untuk menetapkan nilainya hinggaonCreate
. Solusinya adalah dengan tidak menggunakan kelas dalam anonim. Dengan cara inimPager
variabel tidak perlu dinyatakan final dan dapat digunakan di seluruh kelas.sumber
sumber