2014-02-15 36 views
0

我剛開始學習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被調用時,這兩個類的新對象就會被創建,這將是無效的,但我可能是錯誤的。有人能爲我提供一個很好的解釋。謝謝。

+2

「class level」是什麼意思?顯然,在調用setContentView之後,可以將它們聲明爲你想要的位置。 – Enrichman

+1

您可以將它們聲明爲實例變量,即類成員,但是由於應用程序資源與onCreate()中的Activity有關,所以無法在'setContentView()'之前的onCreate()'和'View'之前初始化'Drawable'。 '... –

回答

2

Activity中的聲明不是問題。

您的ImageViewfindViewById應在設置您的內容視圖後調用。 (活動佈局)。

否則,下面應該工作:

public class MainActivity extends Activity { 

     private AudioManager audioManager; 
     private boolean mPhoneIsSilent; 
     //declaring these here is not a problem 
     ImageView imageView; 
     Drawable newPhoneIcon; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      //when you map the imageView, it should be after the setContentView so your activity identifies exactly what to map - for id and component -in your layout 
      imageView = (ImageView) findViewById(R.id.ringer_icon); 

      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() { 

      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); 
      } 

     } 

    } 

http://developer.android.com/reference/android/app/Activity.html#setContentView(int)
對於findViewById:
http://developer.android.com/reference/android/app/Activity.html#findViewById(int)

0

通常你應該創建whithin在其使用範圍的任何可變的變量 - 這是OOP封裝/鬆散耦合/高內聚的概念,我建議遵循它的原因很多)

您可以在類級別中定義它們,我相信只要確保它們在訪問它們之前正確初始化 - 應用程序的碎片可能是因爲您嘗試在imageView定義之前調用toggleGUI。

Regards,

Alex。

0

聲明您選擇變量類級別如下

ImageView imageView; 

和之後的setContentView初始化onCreate方法內側(R.layout。your_layout);

imageView = (ImageView) findViewById(R.id.ringer_icon); 

不在toggleGUI()方法上初始化它。因爲它永遠不會在onCreate()內調用。

初始化oncreate()方法內的所有UI元素。

相關問題