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

时间:2014-02-15 13:08:42

标签: android

我刚刚开始学习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时,都会创建这两个类的新对象,但我认为这个函数无效,但我可能错了。有人可以给我一个很好的解释。感谢。

3 个答案:

答案 0 :(得分:2)

活动中的声明不是问题。

设置内容视图后,应调用findViewById的{​​{1}}。 (活动的布局)。

否则,以下内容应该有效:

ImageView

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

答案 1 :(得分:0)

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

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

此致

亚历。

答案 2 :(得分:0)

声明你是变量类级别,如下所示

ImageView imageView;

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

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

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

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