Android;Объявление текста редактирования в теле класса (из любого метода) - PullRequest
3 голосов
/ 02 февраля 2012

У меня есть опыт работы с языками программирования, но я немного новичок в программировании Android.

У меня есть программа с некоторыми полями, которые функционируют как метки (просмотр текста), кнопки и ввод данных (edittext).

Всякий раз, когда я объявляю их в начале программы из любых методов (но в классе, конечно), когда я запускаю свое приложение, оно падает, и симуляция выдает предупреждение "к сожалению, ваша программа остановлена".

Eclipse не выдает ошибок для объявления, и я использовал тот же способ для определения обычных переменных без проблем. Это также выдает ту же ошибку, когда я объявляю объект медиаплеера в теле класса.

Кто-нибудь знает, почему выдает ошибку? И есть ли другой способ объявить глобальные объекты, такие как edittext, viewtext и т. Д ... Объявлять их снова и снова в методах звучит странно для меня.

Спасибо!

открытый класс TrainerActivity расширяет Activity {

Button stopTimer = (Button)findViewById(R.id.StopTimer);
Button startTimer = (Button)findViewById(R.id.StartTimer);
EditText totalTime = (EditText)findViewById(R.id.TotalTime);
EditText enterMin = (EditText)findViewById(R.id.EnterMin);
EditText enterSec = (EditText)findViewById(R.id.EnterSec);

private boolean breaker = false;

@Override

public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    startTimer.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Button_StartTimer();
        }
    });

    stopTimer.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Button_StopTimer();
        }
    });
}

Ответы [ 4 ]

7 голосов
/ 02 февраля 2012

Не видя пример кода того, что вы пытаетесь, невозможно сказать наверняка (мы не занимаемся здесь чтением мыслей). Но позвольте мне догадаться, вы делаете что-то вроде этого? ...

public class MyActivity extends Activity {

    TextView tv1; // This is fine.
    TextView tv2 = (TextView) findViewById(R.id.textview2); // Don't do this.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv1 = (TextView) findViewById(R.id.textview1); // This is fine
        tv1.setText("Some text"); // This works

        tv2.setText("Some text"); // NullPointerException here

    }
}

tv2.setText(...) не удастся, потому что вы использовали findViewById(...) ДО того, как вы позвоните setContenetView(...), и в результате tv2 будет нулевым.

Вполне допустимо объявить ваши виджеты как члены экземпляра в вашем Activity, но не пытайтесь использовать findViewById(...), пока ПОСЛЕ того, как вы настроите представление контента.

0 голосов
/ 02 февраля 2012

попробуйте объявить имена объектов виджета только вне метода onCreate ()

Button stopTimer;
Button startTimer;
EditText totalTime;
EditText enterMin;
EditText enterSec;

затем инициализируйте их после setContentView () внутри onCreate ()

setContentView(R.layout.main);
stopTimer = (Button)findViewById(R.id.StopTimer);
startTimer = (Button)findViewById(R.id.StartTimer);
totalTime = (EditText)findViewById(R.id.TotalTime);
enterMin = (EditText)findViewById(R.id.EnterMin);
enterSec = (EditText)findViewById(R.id.EnterSec);
0 голосов
/ 02 февраля 2012

Вы можете объявить эти переменные внутри тела класса или внутри тела метода.В первом случае переменные являются глобальными и, следовательно, могут быть доступны внутри всего класса;в последнем случае они являются локальными и, следовательно, могут быть доступны только в рамках этого метода.Оба они обычно можно увидеть при программировании.

В Android типичное приложение состоит в том, что вы объявляете переменные в теле класса и создаете их экземпляры в методе onCreate ().Примерно так:

public Class MyClass extends Activity{

     TextView label;// so this variable can be accessed within any methods in this Class
    @Override
    protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(Bundle savedInstanceState);
          setContentView(R.layout.main) // load the layout of the activity
          label=(TextView)findViewById(R.id.<the TextView id defined in the layout file>); //this variable get instantiated. From now on you can manipulate it anywhere inside the class.
         Button submit=(Button)findViewById(R.id.<the Button id defined in the layout file>);//you declared and instantiated it, but it could only be used within this method since you declared it here.

}


    }

Если вы просто объявляете переменную в теле класса, в большинстве случаев вы не можете использовать ее, пока не создадите ее экземпляр, потому что они null перед созданием экземпляра.Я думаю, именно поэтому у вас есть проблемы.Пожалуйста, опубликуйте logcat, чтобы мы могли указать реальную проблему.

0 голосов
/ 02 февраля 2012

Можете ли вы опубликовать пример кода, который иллюстрирует проблему? В классе можно объявить переменную-член, которая является EditText или TextView.

logcat (в DDMS) также должен дать вам некоторую информацию об ошибке. Если вы используете eclipse, есть вкладка для DDMS, если нет, вы можете просто запустить DDMS из командной строки, взглянуть на вкладку logcat и запустить свое приложение (конечно, с подключенным телефоном через usb). см. фактическую сообщаемую ошибку.

...