2014-02-15 31 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元素。

相关问题