解释为什么我不能将这些变量设置为全局



我刚刚开始学习安卓。以下代码显示了我的第一次尝试。

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 时,都会创建这两个类的新对象,我想这将是无效的,但我可能是错的。有人可以给我一个很好的解释。谢谢。

活动中的声明不是问题。

应在设置内容视图后调用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(整型)
对于 findViewById:
http://developer.android.com/reference/android/app/Activity.html#findViewById(int)

通常你应该创建任何可变变量,而不管它们的使用范围 - 它是OOP封装/松散耦合/高内聚概念,我建议遵循它的原因有很多)

我相信你可以在类级别定义它们,只要确保它们在访问它们之前正确初始化 - 应用程序可能会因为您尝试在定义 imageView 之前调用 toggleGUI。

问候

亚历克斯。

按如下方式声明你的变量类级别

ImageView imageView;

并在 setcontentview(R.layout.your_layout) 之后在 oncreate 方法中初始化它;

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

不要在 toggleGUI() 方法上初始化它,因为它永远不会在 onCreate() 中调用。

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

最新更新