Сбой при запуске нового приложения, отладка не помогает - PullRequest
0 голосов
/ 03 октября 2011

Хорошо, я попытался отладить свой код, используя DDMS, и пока не могу освоить его.Я думаю, это потому, что моя программа вылетает при запуске.В любом случае, я показал это приятелю, и он не может понять, что я делаю неправильно.Может кто-нибудь указать, почему мое приложение падает при запуске?

Спасибо:

http://pastebin.com/ZXxHPzng

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

Проблема в том, что вы создаете элементы пользовательского интерфейса в глобальной области. Вы можете объявить их там, если вы хотите, чтобы это был глобальный объект, но вы не можете создавать их экземпляры до тех пор, пока не настроите представление содержимого. Например:

    private RadioButton rockRB;
    private RadioButton paperRB;
    private RadioButton scissorsRB;
    private TextView result;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 
        // Content View Must be set before making UI Elements
        rockRB = (RadioButton)findViewById(R.id.radioRock);
        paperRB = (RadioButton)findViewById(R.id.radioPaper);
        scissorsRB = (RadioButton)findViewById(R.id.radioScissors);
        result =  (TextView)findViewById(R.id.result);
1 голос
/ 04 октября 2011

Это на самом деле довольно просто. Вы инициализируете переменные rockRB, paperRB, scissorRB и результат при инициализации класса. В то время, когда вы вызываете findViewById (...), макет еще не был загружен, и, следовательно, представление с указанным идентификатором не найдено. Поэтому функция findViewById возвращает ноль, чтобы указать на это. Когда вы позже попытаетесь использовать сохраненный идентификатор (который является нулевым), вы получите исключение нулевого указателя, и, следовательно, все приложение аварийно завершится.

Чтобы решить вашу проблему, переместите инициализацию переменных с помощью findViewById (...) в функцию onCreate ниже инструкции setContentView, но перед инструкциями setOnClickListener.

Как это:

открытый класс RockPaperScissorsActivity расширяет Activity, реализует Button.OnClickListener { / ** Вызывается при первом создании действия. * /

private RadioButton rockRB;
private RadioButton paperRB;
private RadioButton scissorsRB;
private TextView result;



@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    rockRB = (RadioButton)findViewById(R.id.radioRock);
    paperRB = (RadioButton)findViewById(R.id.radioPaper);
    scissorsRB = (RadioButton)findViewById(R.id.radioScissors);
    result = (RadioButton)findViewById(R.id.result);

    rockRB.setOnClickListener(this);
    paperRB.setOnClickListener(this);
    scissorsRB.setOnClickListener(this);
}

и так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...