Урок 9. Обработчики событий на примере Button.

Обсуждение уроков
levvel
Сообщения: 1
Зарегистрирован: 02 ноя 2015, 12:21

Re: Урок 9. Обработчики событий на примере Button.

Сообщение levvel » 02 ноя 2015, 13:24

После 2-х дневного танца с бубнами, 3 пачек сигарет и немного почитав форум, вывел следующий код, для MainActivity:

Код: Выделить всё

package ru.startandroid.p091onclickbuttons;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // найдем View-элементы
        tvOut = (TextView) findViewById(R.id.tvOut);
        btnOk = (Button) findViewById(R.id.btnOk);
        btnCancel = (Button) findViewById(R.id.btnCancel);


        // создаем обработчик нажатия Ok
        View.OnClickListener oclBtnOk = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка ОК");
            }
        };

        // присвоим обработчик кнопке OK (btnOk)
        btnOk.setOnClickListener(oclBtnOk);

        // создаем обработчик нажатия Cancel
        View.OnClickListener oclBtnCancel = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка Cancel");
            }
        };
        // присвоим обработчик кнопке Cancel (btnCancel)
        btnCancel.setOnClickListener(oclBtnCancel);

З.Ы. Java 8u65. Кодить на Java пытаюсь первую неделю, код для AS 1.4 прошел удачно.

morethanfish
Сообщения: 2
Зарегистрирован: 13 ноя 2015, 19:53

Re: Урок 9. Обработчики событий на примере Button.

Сообщение morethanfish » 13 ноя 2015, 20:08

delete
Последний раз редактировалось morethanfish 30 ноя 2015, 20:14, всего редактировалось 1 раз.

Suntey
Сообщения: 3
Зарегистрирован: 18 ноя 2015, 15:43

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Suntey » 27 ноя 2015, 00:33

Здравствуйте! У меня следующая ситуация: на предпросмотре в Design текст и кнопки отображаются нормально(текст вверху, кнопки ниже), при тестировании на реальном устройстве или эмуляторе текста не видно. Решаю проблему при помощи сдвига всех view элементов вниз. После этого все работает, но получается, что Design в xml файле и реальное устройство (или эмулятор) видят xml по-разному, с чем это может быть связано? Спасибо!

Nata
Сообщения: 5
Зарегистрирован: 08 дек 2015, 21:00

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Nata » 08 дек 2015, 21:24

Здравствуйте! Возникла проблема, с которой никак не получается справится. Задача проста - повесить обработчик onClick на кнопку.

Чтобы был доступен OnClickListener, нужно подключить import android.view.View.OnClickListener. Однако, android.view.View не содержит такой элемент, т.е. в подсказке его нет.

Google нашел вот такой ответ http://ru.stackoverflow.com/questions/3 ... 1%82%D1%8C

но там проблема была в бета версии Android Studio. У меня Android Studio 1.5 (не бета), Java 8, SDK 24.4.

Подскажите, пожалуйста, как возможно решить данную проблему?
Вложения
ErrorOnClick.PNG
ErrorOnClick.PNG (25.38 КБ) 19546 просмотров

Nata
Сообщения: 5
Зарегистрирован: 08 дек 2015, 21:00

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Nata » 08 дек 2015, 21:37

Suntey писал(а):Здравствуйте! У меня следующая ситуация: на предпросмотре в Design текст и кнопки отображаются нормально(текст вверху, кнопки ниже), при тестировании на реальном устройстве или эмуляторе текста не видно. Решаю проблему при помощи сдвига всех view элементов вниз. После этого все работает, но получается, что Design в xml файле и реальное устройство (или эмулятор) видят xml по-разному, с чем это может быть связано? Спасибо!

Вот эта строка отвечает за отступ с учетом верха.
Вложения
paddingTop.PNG
paddingTop.PNG (35.88 КБ) 19545 просмотров

artemwake
Сообщения: 1
Зарегистрирован: 22 янв 2016, 23:12

Re: Урок 9. Обработчики событий на примере Button.

Сообщение artemwake » 22 янв 2016, 23:15

Код: Выделить всё

package artem.qqq4;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;

import java.security.KeyStore;

public class MainActivity extends AppCompatActivity {
    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tvOut = (TextView) findViewById(R.id.tvOut);
        Button BtnOK = (Button) findViewById(R.id.myBtn);
        BtnOK.setText("ОК");
        BtnOK.setEnabled(true);
        Button btnCancel = (Button) findViewById(R.id.myBtn1);
        btnCancel.setText("Cancel");
        BtnOK.setEnabled(true);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    // создаем обработчик нажатия Ok
    View.OnClickListener oclBtnOK = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Меняем текст в TextView (tvOut)
            tvOut.setText("Нажата кнопка ОК");
        }


    };
    // присвоим обработчик кнопке OK (btnOk)
    btnOk.setOnClick(oclBtnOK);

    // создаем обработчик нажатия Cancel
    View.OnClickListener oclBtnCancel = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Меняем текст в TextView (tvOut)
            tvOut.setText("Нажата кнопка Cancel");
        }
    };
    // присвоим обработчик кнопке Cancel (btnCancel)
    btnCancel.setOnClickListener(oclBtnCancel);
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
Подчеркивает btnOk.setOnClick(oclBtnOK); и btnCancel.setOnClickListener(oclBtnCancel); Почему?

Nata
Сообщения: 5
Зарегистрирован: 08 дек 2015, 21:00

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Nata » 23 янв 2016, 19:46

artemwake писал(а):

Код: Выделить всё

package artem.qqq4;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;

import java.security.KeyStore;

public class MainActivity extends AppCompatActivity {
    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tvOut = (TextView) findViewById(R.id.tvOut);
        Button BtnOK = (Button) findViewById(R.id.myBtn);
        BtnOK.setText("ОК");
        BtnOK.setEnabled(true);
        Button btnCancel = (Button) findViewById(R.id.myBtn1);
        btnCancel.setText("Cancel");
        BtnOK.setEnabled(true);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    // создаем обработчик нажатия Ok
    View.OnClickListener oclBtnOK = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Меняем текст в TextView (tvOut)
            tvOut.setText("Нажата кнопка ОК");
        }


    };
    // присвоим обработчик кнопке OK (btnOk)
    btnOk.setOnClick(oclBtnOK);

    // создаем обработчик нажатия Cancel
    View.OnClickListener oclBtnCancel = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Меняем текст в TextView (tvOut)
            tvOut.setText("Нажата кнопка Cancel");
        }
    };
    // присвоим обработчик кнопке Cancel (btnCancel)
    btnCancel.setOnClickListener(oclBtnCancel);
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
Подчеркивает btnOk.setOnClick(oclBtnOK); и btnCancel.setOnClickListener(oclBtnCancel); Почему?
Попробуйте обработчик click для кнопок OK и Cancel назначать внутри метода onCreate

Requiem
Сообщения: 2
Зарегистрирован: 24 янв 2016, 12:34

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Requiem » 26 янв 2016, 23:22

Шатаясь по простором Интернета, я нашел одну интересную настройку для Android Studio - автоимпорт. Тоесть, вы прописываете имя класса, а платформа автоматом импортирует его без дополнительных комбинаций, типа Alt+Enter. Настройка очень простая и заключается в следующем:
Выберите в главном меню File>Settings. В секции настроек IDE есть пункт Editor> Auto Import. Ставим флажки у пунктов «Optimize imports on the fly» и «Add unambiguous imports on the fly».
На авторство не претендую, честно позаимствовал у коллег по ремеслу:
http://www.fandroid.info/vklyuchenie-av ... id-studio/

Аватара пользователя
hover
Сообщения: 1
Зарегистрирован: 31 янв 2016, 11:59

Re: Урок 9. Обработчики событий на примере Button.

Сообщение hover » 31 янв 2016, 12:06

damager82 писал(а):В этом уроке мы:

- научимся обрабатывать нажатие кнопки и узнаем, что такое обработчик

Click here to read this article!
Здравствуйте, во первых спасибо огромное за уроки.
Подскажите, что не так в коде.

Код: Выделить всё

package com.example.ivmik.onclickbuttons;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // найдем View-элементы
        tvOut = (TextView) findViewById(R.id.tvOut);
        btnOk = (Button) findViewById(R.id.btnOk);
        btnCancel = (Button) findViewById(R.id.btnCancel);

        // создаем обработчик нажатия
        View.OnClickListener oclBtnOk = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка ОК");
            }
        };

        // присвоим обработчик кнопке OK (btnOk)
        btnOk.setOnClickListener(oclBtnOk);

        View.OnClickListener oclBtnCancel = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка Cancel");
            }
        };

        btnCancel.setOnClickListener(oclBtnCancel);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
Приложение запускается, проверяю на реальном устройстве. Но при нажатии на кнопки OK и Cancel в TextView не выводится нужный мне текст, как в уроке. Пользуюсь последней студией. Спасибо.

Nata
Сообщения: 5
Зарегистрирован: 08 дек 2015, 21:00

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Nata » 01 фев 2016, 12:38

hover писал(а):
damager82 писал(а):В этом уроке мы:

- научимся обрабатывать нажатие кнопки и узнаем, что такое обработчик

Click here to read this article!
Здравствуйте, во первых спасибо огромное за уроки.
Подскажите, что не так в коде.

Код: Выделить всё

package com.example.ivmik.onclickbuttons;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // найдем View-элементы
        tvOut = (TextView) findViewById(R.id.tvOut);
        btnOk = (Button) findViewById(R.id.btnOk);
        btnCancel = (Button) findViewById(R.id.btnCancel);

        // создаем обработчик нажатия
        View.OnClickListener oclBtnOk = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка ОК");
            }
        };

        // присвоим обработчик кнопке OK (btnOk)
        btnOk.setOnClickListener(oclBtnOk);

        View.OnClickListener oclBtnCancel = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Меняем текст в TextView (tvOut)
                tvOut.setText("Нажата кнопка Cancel");
            }
        };

        btnCancel.setOnClickListener(oclBtnCancel);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
Приложение запускается, проверяю на реальном устройстве. Но при нажатии на кнопки OK и Cancel в TextView не выводится нужный мне текст, как в уроке. Пользуюсь последней студией. Спасибо.

Если в коде оставить только обработчики кликов на кнопки Ok и Cancel, то все работает
Вложения
click.PNG
click.PNG (25.76 КБ) 19415 просмотров

Khanja
Сообщения: 1
Зарегистрирован: 04 фев 2016, 00:31

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Khanja » 04 фев 2016, 00:40

Requiem писал(а):Шатаясь по простором Интернета, я нашел одну интересную настройку для Android Studio - автоимпорт. Тоесть, вы прописываете имя класса, а платформа автоматом импортирует его без дополнительных комбинаций, типа Alt+Enter. Настройка очень простая и заключается в следующем:
Выберите в главном меню File>Settings. В секции настроек IDE есть пункт Editor> Auto Import. Ставим флажки у пунктов «Optimize imports on the fly» и «Add unambiguous imports on the fly».
На авторство не претендую, честно позаимствовал у коллег по ремеслу:
http://www.fandroid.info/vklyuchenie-av ... id-studio/
В Android Studio 1.5.1: File->Settings->Editor->General->Auto Import

Fieldfare
Сообщения: 1
Зарегистрирован: 11 фев 2016, 00:49

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Fieldfare » 11 фев 2016, 00:56

Nata писал(а):Здравствуйте! Возникла проблема, с которой никак не получается справится. Задача проста - повесить обработчик onClick на кнопку.

Чтобы был доступен OnClickListener, нужно подключить import android.view.View.OnClickListener. Однако, android.view.View не содержит такой элемент, т.е. в подсказке его нет.

Google нашел вот такой ответ http://ru.stackoverflow.com/questions/3 ... 1%82%D1%8C

но там проблема была в бета версии Android Studio. У меня Android Studio 1.5 (не бета), Java 8, SDK 24.4.

Подскажите, пожалуйста, как возможно решить данную проблему?
Проверьте Settings->Editor-> General->Auto Import-> Exclude from Import and Completion

m.kryglikov
Сообщения: 1
Зарегистрирован: 28 мар 2016, 13:28

Re: Урок 9. Обработчики событий на примере Button.

Сообщение m.kryglikov » 28 мар 2016, 13:29

Мне кажется, что схему, которая в самом конце урока стоит перенести в начало, чтобы лучше понимать, что мы вообще делаем)

eltgm
Сообщения: 1
Зарегистрирован: 09 май 2016, 21:01

Re: Урок 9. Обработчики событий на примере Button.

Сообщение eltgm » 09 май 2016, 21:10

При создании объекта oclButtonOk на onClickListener пишет -"Cannot resolve symbol "onClickListener ". и не хочет импортировать import android.view.View.OnClickListener,выделяет импорт серым цветом и пишет -"Unused import statement".IntelliJ IDEA 2016.1.1(64)

corsar83
Сообщения: 1
Зарегистрирован: 15 май 2016, 17:44

Re: Урок 9. Обработчики событий на примере Button.

Сообщение corsar83 » 15 май 2016, 18:20

Необходимо автоматическое заполнение TextView и Button, но что-то не так. Нужна помощь.

void SetQuestion () {
//generate the parts of the question

Random randInt = new Random();

int partA = randInt.nextInt(10);
partA++;//don't want a zero value
int partB = randInt.nextInt(10);
partB++;//don't want a zero value

correctAnswer = partA * partB;
int wrongAnswer1 = correctAnswer - 2;
int wrongAnswer2 = correctAnswer + 2;
textObjectPartA.setText("" + partA);
textObjectPartB.setText("" + partB);

//set the multi choice buttons
//A number between 0 and 2
int buttonLayout = randInt.nextInt(3);
switch (buttonLayout) {
case 0:
buttonObjectChoice1.setText("" + correctAnswer);
buttonObjectChoice2.setText("" + wrongAnswer1);
buttonObjectChoice3.setText("" + wrongAnswer2);
break;
case 1:
buttonObjectChoice2.setText("" + correctAnswer);
buttonObjectChoice3.setText("" + wrongAnswer1);
buttonObjectChoice1.setText("" + wrongAnswer2);
break;
case 2:
buttonObjectChoice3.setText("" + correctAnswer);
buttonObjectChoice1.setText("" + wrongAnswer1);
buttonObjectChoice2.setText("" + wrongAnswer2);
break;
}
}

levwvel
Сообщения: 1
Зарегистрирован: 29 май 2016, 16:28

Re: Урок 9. Обработчики событий на примере Button.

Сообщение levwvel » 29 май 2016, 18:12

Привет, начинаю изучать Android Studio, что-то вроде получается. Мне кажется, во так будет проще:
Разметка:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="30dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tvOut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="50dp"
            android:text="TextView">
        </TextView>
        <Button
            android:id="@+id/btnOk"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="OK"
            android:onClick="btnOK">
        </Button>
        <Button
            android:id="@+id/btnCancel"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Cancel"
            android:onClick="btnCancel">
        </Button>
    </LinearLayout>
</LinearLayout>
Сам код:

Код: Выделить всё

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvOut = (TextView) findViewById(R.id.tvOut);

    }

    public void btnOK(View view) {
        tvOut.setText("Нажата кнопка ОК");
    }

    public void btnCancel(View view) {
        tvOut.setText("Нажата кнопка Cancel");
    }
}

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 9. Обработчики событий на примере Button.

Сообщение WKBAPKA » 19 июн 2016, 11:51

levwvel писал(а):Привет, начинаю изучать Android Studio, что-то вроде получается. Мне кажется, во так будет проще:
Разметка:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="30dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tvOut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="50dp"
            android:text="TextView">
        </TextView>
        <Button
            android:id="@+id/btnOk"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="OK"
            android:onClick="btnOK">
        </Button>
        <Button
            android:id="@+id/btnCancel"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Cancel"
            android:onClick="btnCancel">
        </Button>
    </LinearLayout>
</LinearLayout>
Сам код:

Код: Выделить всё

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView tvOut;
    Button btnOk;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvOut = (TextView) findViewById(R.id.tvOut);

    }

    public void btnOK(View view) {
        tvOut.setText("Нажата кнопка ОК");
    }

    public void btnCancel(View view) {
        tvOut.setText("Нажата кнопка Cancel");
    }
}
не факт.
выглядит как бы удобнее, но как я понимаю, в чистой Jave такого нет... Это расширение андроида, насколько я понимаю, добавляя методы в класс для обработки событий студио просто связывает кнопки с этими методами. Но, например, в последней редакции книги для проф. разработчиков рекомендуется работать через интерфейс onClickListener.

Меня вот интересует другой вопрос.
когда мы находим кнопку через findViewById() по факту мы получаем ссылку на экземпляр класса объекта. Когда мы определяем обработчик события, мы просто вызываем метод данного объекта и передаем ему ссылку на абстрактный класс с реализованным нами обработчиком.
тут все понятно. не понятно, почему требуется объявлять переменную кнопки как глобальную для класса. Студио хотя и не считает это ошибкой, но выдает длинное предупреждение.
Логика следующая. Объект button в контексте текущей Activity всегда один и создает его андроид при инициализации самой активити. Для доступа к виджетам данного активити мы используем метод для поиска их по числовому идентификатору и работаем всегда с одним объектом, с какого бы места мы бы не обратились к этому объекту. Если я создам переменную внутри метода onCreate() назначу обработчик события и переменная будет уничтожена после выхода из метода, для кнопки ничего не поменяется, т.к. будет уничтожен только указатель на этот объект, но не сам объект. Что я не понимаю?

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 9. Обработчики событий на примере Button.

Сообщение WKBAPKA » 19 июн 2016, 11:55

corsar83 писал(а):Необходимо автоматическое заполнение TextView и Button, но что-то не так. Нужна помощь.

void SetQuestion () {
//generate the parts of the question

Random randInt = new Random();

int partA = randInt.nextInt(10);
partA++;//don't want a zero value
int partB = randInt.nextInt(10);
partB++;//don't want a zero value

correctAnswer = partA * partB;
int wrongAnswer1 = correctAnswer - 2;
int wrongAnswer2 = correctAnswer + 2;
textObjectPartA.setText("" + partA);
textObjectPartB.setText("" + partB);

//set the multi choice buttons
//A number between 0 and 2
int buttonLayout = randInt.nextInt(3);
switch (buttonLayout) {
case 0:
buttonObjectChoice1.setText("" + correctAnswer);
buttonObjectChoice2.setText("" + wrongAnswer1);
buttonObjectChoice3.setText("" + wrongAnswer2);
break;
case 1:
buttonObjectChoice2.setText("" + correctAnswer);
buttonObjectChoice3.setText("" + wrongAnswer1);
buttonObjectChoice1.setText("" + wrongAnswer2);
break;
case 2:
buttonObjectChoice3.setText("" + correctAnswer);
buttonObjectChoice1.setText("" + wrongAnswer1);
buttonObjectChoice2.setText("" + wrongAnswer2);
break;
}
}
а ссылка на батоны buttonObjectChoice собственно где определяются?

MODifikaTOR
Сообщения: 1
Зарегистрирован: 20 фев 2017, 10:26

Re: Урок 9. Обработчики событий на примере Button.

Сообщение MODifikaTOR » 20 фев 2017, 10:30

Написал все три обработчика по уроку, запускаю на своём телефоне - "В приложении произошла ошибка". Компилятор на код не ругается. В чём может быть причина ошибки?
UPD: решил проблему. Работал со сгенерированным TextView без id.

Аватара пользователя
Orochimaru
Сообщения: 1
Зарегистрирован: 06 апр 2017, 18:27

Re: Урок 9. Обработчики событий на примере Button.

Сообщение Orochimaru » 06 апр 2017, 19:50

Здравствуйте. Помогите пожалуйста с проблемой.
При запуске через эмулятор, вот такая чепуха происходит, ну и судя по ошибкам, нужно в main.xml прописать android:text="@string/_1", а в strings.xml - <string name="_1">1</string> для текста и каждой кнопки. И не совсем понял почему кнопки и текст в одной куче, получилось исправить, если только нажать по виджету правой кнопкой, выбрать Constraint Layout -> Infer Constrains, в таком случает в эмуляторе отображается все нормально. Хотелось бы узнать, правильно так вообще делать, и если нет, то как надо? На ПК установлена Android Studio 2.3. Заранее спасибо.
Вложения
2.jpg
2.jpg (19.28 КБ) 16225 просмотров
1.jpg
1.jpg (133.37 КБ) 16225 просмотров

Ответить