Почему button.setOnClickListener приводит к сбою моего приложения? - PullRequest
1 голос
/ 26 июня 2011

У меня есть вид, который я загружаю, и мой метод onCreate () выглядит следующим образом:

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       volume_id=getIntent().getStringExtra("volume_id");
       language=getIntent().getStringExtra("language");
       chapter=Integer.parseInt(getIntent().getStringExtra("chapter"));
       book=getIntent().getStringExtra("book");
       book_id=getIntent().getStringExtra("book_id");

       final Button back=(Button)findViewById(R.id.backButton);
        back.setOnClickListener(new View.OnClickListener() {
        @Override

        public void onClick(View v) {


            //Toast.makeText(Verse.this, "Back", Toast.LENGTH_LONG).show();

        }});

     final Button next=(Button)findViewById(R.id.forwardButton);
        next.setOnClickListener(new View.OnClickListener() {
        @Override

        public void onClick(View v) {


            //Toast.makeText(Verse.this, "Next", Toast.LENGTH_LONG).show();

        }});
     }

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

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

Делает так, как ядобавление этих кнопок выглядит хорошо?Я делаю что-то неправильно?Хотелось бы, чтобы не было так сложно подключить кнопку GUI к коду ...

Спасибо

1 Ответ

7 голосов
/ 26 июня 2011

Чтобы ответить на ваш вопрос:

Вам нужно позвонить setContentView(R.layout.main) (или как там называется ваш файл макета), прежде чем вы сможете позвонить findViewById. Кроме того, ключевое слово final может испортить ваш код, но, вероятно, проблема не в этом.

Другая, возможно, полезная информация: (Технически вам не нужно ничего читать)

Форматирование вашего кода также очень грязное. Учтите это:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get intent information
    volume_id = getIntent().getStringExtra("volume_id");
    language = getIntent().getStringExtra("language");
    chapter = getIntent().getIntExtra("chapter")); // Changed from String to int
    book = getIntent().getStringExtra("book");
    book_id = getIntent().getStringExtra("book_id");

    // Find views by ID
    Button back = (Button) findViewById(R.id.backButton);        
    Button next = (Button) findViewById(R.id.forwardButton);

    // Click listeners
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Back", Toast.LENGTH_LONG).show();
        }
    });

    next.setOnClickListener(new View.OnClickListener() {        
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "Next", Toast.LENGTH_LONG).show();
        }
    });
}

Примечание: 1. Пробелы до и после каждого = 2. Пробелы после круглых скобок приведения типа (например, "(Button)") 3. Правильный отступ 4. Никаких лишних пустых строк (например, между @Override и public void onClick 5. Полезные комментарии

Это мелочи, которые облегчают чтение вашего кода другими программистами.

Кроме того, вы можете рассмотреть возможность передачи "chapter" как intExtra вместо анализа его из String. Это тратит драгоценную память. Измените поле экземпляра String на int. Наконец, вы можете рассмотреть возможность создания полей экземпляра Buttons для всего класса.

...