我剛開始學習android。以下代碼顯示我的第一次嘗試。解釋爲什麼我無法設置這些變量全球
package com.example.silentphone;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private AudioManager audioManager;
private boolean mPhoneIsSilent;
/* ** * * *我想在這裏聲明,但應用程序崩潰,如果我做
ImageView imageView = (ImageView) findViewById(R.id.ringer_icon);
Drawable newPhoneIcon;
** * ** * ** * ** * ** * ** * ** * ** * ** * ** * */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
checkPhoneStatus();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClick(View view) {
Button toggleButton = (Button) findViewById(R.id.toggleBtn);
if (mPhoneIsSilent) {
System.out.println("Phone Silent");
// now put the phone in ringer mode
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
mPhoneIsSilent = false;
toggleGUI();
} else {
System.out.println("Phone active");
// now put the phone in silent mode
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mPhoneIsSilent = true;
toggleGUI();
}
}
public void checkPhoneStatus() {
int ringerMode = audioManager.getRingerMode();
if (ringerMode == AudioManager.RINGER_MODE_SILENT) {
// means the phone is silent
mPhoneIsSilent = true;
} else {
mPhoneIsSilent = false;
}
}
public void toggleGUI() {
/******These two variables need to be declared here.Why cant i declare it at class level.If i declare it at class level the app crashes.s****************************/
ImageView imageView = (ImageView) findViewById(R.id.ringer_icon);
Drawable newPhoneIcon;
/******************************************************************************/
if (mPhoneIsSilent) {
// means the phone is silent so show phone silent image
newPhoneIcon = getResources().getDrawable(R.drawable.speaker_off);
imageView.setImageDrawable(newPhoneIcon);
} else {
newPhoneIcon = getResources().getDrawable(R.drawable.phone_on);
imageView.setImageDrawable(newPhoneIcon);
}
}
}
我的問題是,爲什麼我需要聲明
ImageView imageView = (ImageView) findViewById(R.id.ringer_icon);
Drawable newPhoneIcon;
範圍內的功能。爲什麼我不能在課堂上宣佈它。如果我在課堂級聲明它,應用程序崩潰。每當函數toggleGui被調用時,這兩個類的新對象就會被創建,這將是無效的,但我可能是錯誤的。有人能爲我提供一個很好的解釋。謝謝。
「class level」是什麼意思?顯然,在調用setContentView之後,可以將它們聲明爲你想要的位置。 – Enrichman
您可以將它們聲明爲實例變量,即類成員,但是由於應用程序資源與onCreate()中的Activity有關,所以無法在'setContentView()'之前的onCreate()'和'View'之前初始化'Drawable'。 '... –