Topic: Щелчок кнопки/Счётчик ворон

Обсуждение статьи Щелчок кнопки/Счётчик ворон

Re: Щелчок кнопки/Счётчик ворон

при объявлении одной кнопки студия предлагала перенести инициализацию прямо в класс, т.е.:

private Button mCrowsCounterButton = (Button)findViewById(R.id.buttonCrowsCounter);

когда добавил вторую buttonCatsCounter и инициализировал сразу в классе - программа не запустилась вообще.

сделал как в уроке, перенёс в onCreate - заработало. в чём подвох?)

Re: Щелчок кнопки/Счётчик ворон

Нельзя кнопку инициализировать в классе. Он еще ничего не знает о кнопках. Только после метода setContentView(), когда загрузится разметка экрана.

4 (edited by 3dots 2015-07-13 13:19:04)

Re: Щелчок кнопки/Счётчик ворон

я догадывался, но студия сама предложила перенести инициализацию для одной кнопки и код работал. вот в чём вопрос-то мой.
почему для одной кнопки работало, а для двух нет.

Re: Щелчок кнопки/Счётчик ворон

Вы что-то путаете. Не может это работать. Перенесите еще раз и убедитесь.

Re: Щелчок кнопки/Счётчик ворон

видимо, и правда, что-то напутал. прошу прощения. спасибо!

Re: Щелчок кнопки/Счётчик ворон

А у меня почему-то отображается фраза "я насчитал _ ворон" без пробелов...

Re: Щелчок кнопки/Счётчик ворон

"Я насчитал " - между последней кавычкой и словом насчитал нужен пробел. С вороной такая же история. Никто за вас пробелы ставить не будет. Посмотрите внимательнее на код.

Re: Щелчок кнопки/Счётчик ворон

Спасибо, Александр. Не ожидал такого быстрого ответа. Я начинаю изучение с полного нуля ( ранее ни одной строчки кода не писал) и поэтому мне многое не ясно. Вроде внимательно смотрю на код в ваших уроках, но такую мелочь упустил)))

Re: Щелчок кнопки/Счётчик ворон

Проблема с домашним заданием. Кнопок то я могу добавить уже хоть десять. Неясно, Как добавить новый счетчик. Или один mCount должен считать за всех?

Re: Щелчок кнопки/Счётчик ворон

Прям беда с домашними заданиями, Александр.)) Отложу их на позже. Ничего не понятно в  д/з 4 урока вообще. Какие-то новые классы, case, switch и так далее... Еще и выводить будет текст, какая кнопка нажата.

Re: Щелчок кнопки/Счётчик ворон

Ничего страшного. Все через это проходили. А откладывать не стоит. Лучше разбираться шаг за шагом.

13 (edited by Mup0k 2015-08-17 09:37:28)

Re: Щелчок кнопки/Счётчик ворон

Добрый день.

Почему вот так работает:
    public void button_onClick(View view) {
        a = ""+counter++;
        counter_show.setText(a);
    }

А вот так выдает ошибку:

    public void button_onClick(View view)
        counter_show.setText(counter++);
    }

IDE никаких ошибок во время редактирования не показывает.
Private String a ="";
Private int counter = 1;

Изначально написал в коротком варианте, но при тапе по кнопке выкидывает из приложения и выводит ошибку в компиляторе, в итоге решилась проблема только добавлением строковой переменной, но она по сути ни к чему.
Скинуть проект целиком?

И еще вопрос, почему когда counter изначально = 0, то первыый тап не делает +1, он выдает 0?

Вот лог, спойлер не нашел:
08-17 11:32:13.156  19450-19450/kz.appa.hello_kitty D/dalvikvm﹕ Late-enabling CheckJNI
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty W/dalvikvm﹕ VFY: unable to resolve virtual method 408: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty W/dalvikvm﹕ VFY: unable to resolve virtual method 430: Landroid/content/res/TypedArray;.getType (I)I
08-17 11:32:13.266  19450-19450/kz.appa.hello_kitty D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
08-17 11:32:13.386  19450-19450/kz.appa.hello_kitty I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
    OpenGL ES Shader Compiler Version: E031.24.00.15
    Build Date: 04/07/15 Tue
    Local Branch:
    Remote Branch:
    Local Patches:
    Reconstruct Branch:
08-17 11:32:13.426  19450-19450/kz.appa.hello_kitty D/OpenGLRenderer﹕ Enabling debug mode 0
08-17 11:32:13.506  19450-19450/kz.appa.hello_kitty I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@42f33ed8 time:104908754
08-17 11:32:15.196  19450-19450/kz.appa.hello_kitty W/ResourceType﹕ No package identifier when getting value for resource number 0x00000001
08-17 11:32:15.206  19450-19450/kz.appa.hello_kitty D/AndroidRuntime﹕ Shutting down VM
08-17 11:32:15.206  19450-19450/kz.appa.hello_kitty W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x417b7d58)
08-17 11:32:15.216  19450-19450/kz.appa.hello_kitty E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: kz.appa.hello_kitty, PID: 19450
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3829)
            at android.view.View.performClick(View.java:4444)
            at android.view.View$PerformClick.run(View.java:18457)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5047)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3824)
            at android.view.View.performClick(View.java:4444)
            at android.view.View$PerformClick.run(View.java:18457)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5047)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
            at android.content.res.Resources.getText(Resources.java:252)
            at android.content.res.MiuiResources.getText(MiuiResources.java:107)
            at android.widget.TextView.setText(TextView.java:3895)
            at kz.appa.hello_kitty.MainActivity.button_onClick(MainActivity.java:48)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3824)
            at android.view.View.performClick(View.java:4444)
            at android.view.View$PerformClick.run(View.java:18457)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5047)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
08-17 11:32:15.286  19450-19450/kz.appa.hello_kitty I/Process﹕ Sending signal. PID: 19450 SIG: 9

Re: Щелчок кнопки/Счётчик ворон

Потому что, в методе setText() должен быть текст, а не число. В первом варианте при сложении пустой строки с числом итоговый результат преобразуется тоже в строку. Во втором пример преобразования нет.

Re: Щелчок кнопки/Счётчик ворон

И почитайте разницу между ++counter и counter++
http://developer.alexanderklimov.ru/and … /basic.php

Re: Щелчок кнопки/Счётчик ворон

Точно, в варианте ++переменная сначала наращивается а потом присваивается, а если поставить после переменной то наоборот.
Спасибо!

А каким методом пользоваться вместо setText, чтобы можно было int или double назначить, без преобразования сложения со стороковой переменной?

Re: Щелчок кнопки/Счётчик ворон

Додумался только до такого.
И еще вопрос по @Override, зачем они? Все читаю и не могу понять. Можете на пальцах объяснить, или на статью для полных чайников показать. Не могу понять зачем эти метки, конкретно @Override

package kz.appa.trafficlight;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private RelativeLayout mRelativeLayout;
    private TextView mInfoTextView;


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

        mRelativeLayout = (RelativeLayout)findViewById(R.id.relativeLayout);
        mInfoTextView = (TextView)findViewById(R.id.textView);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    public void onClick(View view){
        switch (view.getId()){
            case R.id.buttonred:
                mInfoTextView.setText(R.string.red);
                mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.redColor));
                break;
            case R.id.buttonyellow:
                mInfoTextView.setText(R.string.yellow);
                mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.yellowColor));
                break;
            case R.id.buttongreen:
                mInfoTextView.setText(R.string.green);
                mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.greenColor));
                break;
        }
    }
}

Re: Щелчок кнопки/Счётчик ворон

setText() работает только со строками или с идентификаторами строковых ресурсов. Поэтому в любом случае любую переменную int или double нужно преобразовать в строку.
Есть несколько способов.
Например,
int test=5;
String testString = String.valueOf(test);
Вариант со сложением с пустой строкой на самом деле не самый лучший, это я для простоты использую в учебных примерах.

Re: Щелчок кнопки/Счётчик ворон

Насчет @Override не нужно заморачиваться. Сами его не пишите. А то, что будет сгенерировано самой студией оставляйте.
Вроде даже в Java 7 и 8 он не является обязательным. В общих чертах - это переопределение метода из класса-родителя. Ваш класс происходит от Activity и у него есть готовые методы, которые вы используете у себя.

Re: Щелчок кнопки/Счётчик ворон

Mup0k wrote:

И еще вопрос по @Override, зачем они? Все читаю и не могу понять. Можете на пальцах объяснить, или на статью для полных чайников показать. Не могу понять зачем эти метки, конкретно @Override

Это дополнительная проверка на тот случай, если вдруг вы ошиблись с написанием сигнатуры метода, который вы собираетесь переопределять.
Допустим, при переопределении метода onCreate вы ошиблись с его написанием и вместо:

protected void onCreate(Bundle savedInstanceState) {
    // тут должен быть вызов super.onCreate(savedInstanceState), но для простоты примера его опустим
    setContentView(R.layout.activity_main);
...}

   написали

protected void onCreate() {
    // тут должен быть вызов super.onCreate(savedInstanceState), но для простоты примера его опустим
    setContentView(R.layout.activity_main);
...}

Тогда, если над методом не будет аннотации @Override, то код скомпилируется без ошибок, но код будет работать не совсем так как вы ожидали. И найти ошибку в коде в таком случае будет не всегда легко.
Если же над методом будет указана аннтоция @Override. то при попытке компиляции произойдет ошибка и будет выведено сообщение:

error: method does not override or implement a method from a supertype

которое позволит быстро найти ошибку в коде.

Re: Щелчок кнопки/Счётчик ворон

Спасибо kelciour за развернутый ответ.

Re: Щелчок кнопки/Счётчик ворон

Добрый день.
В ДЗ добавил обнуление счетчика уточните, почему значение переменной счетчика обнуляется, но при попытке вывода приложение выключается.
    public void NullCrow(View view) {
        { mCout=0;}
        TextView mInfoTextView = (TextView)findViewById(R.id.CoutCrow2);
        mInfoTextView.setText(mCout);

    }

если написать mInfoTextView.setText("0"); кнопка отрабатывает, счетчик обнуляется и отсчет продолжается с нуля.

Re: Щелчок кнопки/Счётчик ворон

Уберите фигурные скобки у счетчика

Re: Щелчок кнопки/Счётчик ворон

Добрый день.
Столкнулся с такой проблемой: при нажатии на "Счетчик ворон" вылетает программа. Жду вашей помощи smile

activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="Hello World!" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Поздороваться"
        android:id="@+id/button"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="37dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Считаем ворон"
        android:id="@+id/buttonCrowsCounter"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="29dp" />

</RelativeLayout>

MainActivity.java:
package com.example.firstapp;

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

import java.text.BreakIterator;

public class MainActivity extends AppCompatActivity {

    private Button mCrowsCounterButton;
    private int mCount = 0;
    private TextView mInfoTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mCrowsCounterButton = (Button)findViewById(R.id.buttonCrowsCounter);
        mCrowsCounterButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String vari = "Я насчитал " + ++mCount + " ворон";
                mInfoTextView.setText(vari);
            }
        });
    }

    public void onClick(View view) {
        TextView helloTextView = (TextView)findViewById(R.id.textView);
        helloTextView.setText("Азазка!");
    }
}


лог:
10-17 20:14:11.594 14077-14077/? I/art: Late-enabling -Xcheck:jni
10-17 20:14:11.755 14077-14113/com.example.firstapp D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
10-17 20:14:11.761 14077-14077/com.example.firstapp D/Atlas: Validating map...
10-17 20:14:11.819 14077-14113/com.example.firstapp I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 01/15/15, ab0075f, Id3510ff6dc
10-17 20:14:11.820 14077-14113/com.example.firstapp I/OpenGLRenderer: Initialized EGL, version 1.4
10-17 20:14:11.838 14077-14113/com.example.firstapp D/OpenGLRenderer: Enabling debug mode 0
10-17 20:14:15.229 14077-14077/com.example.firstapp D/AndroidRuntime: Shutting down VM
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime: FATAL EXCEPTION: main
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime: Process: com.example.firstapp, PID: 14077
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at com.example.firstapp.MainActivity$1.onClick(MainActivity.java:27)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.view.View.performClick(View.java:4780)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19866)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5254)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
10-17 20:14:15.230 14077-14077/com.example.firstapp E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
10-17 20:14:16.790 14077-14077/com.example.firstapp I/Process: Sending signal. PID: 14077 SIG: 9

Re: Щелчок кнопки/Счётчик ворон

Вы объявили переменную mInfoTextView, но не инициализировали её. У вас в логах пишут on a null object reference - отсутствующий объект