Topic: Щелчок кнопки/Счётчик ворон
Обсуждение статьи Щелчок кнопки/Счётчик ворон
Все вопросы проплачены кошками - всемирно известными производителями котят
You are not logged in. Please login or register.
Для регистрации на форуме следует написать мне письмо. В ответе я напишу правильный ответ для прохождения регистрации.
Форум Александра Климова → Android → Щелчок кнопки/Счётчик ворон
Обсуждение статьи Щелчок кнопки/Счётчик ворон
при объявлении одной кнопки студия предлагала перенести инициализацию прямо в класс, т.е.:
private Button mCrowsCounterButton = (Button)findViewById(R.id.buttonCrowsCounter);
когда добавил вторую buttonCatsCounter и инициализировал сразу в классе - программа не запустилась вообще.
сделал как в уроке, перенёс в onCreate - заработало. в чём подвох?)
Нельзя кнопку инициализировать в классе. Он еще ничего не знает о кнопках. Только после метода setContentView(), когда загрузится разметка экрана.
я догадывался, но студия сама предложила перенести инициализацию для одной кнопки и код работал. вот в чём вопрос-то мой.
почему для одной кнопки работало, а для двух нет.
Вы что-то путаете. Не может это работать. Перенесите еще раз и убедитесь.
видимо, и правда, что-то напутал. прошу прощения. спасибо!
А у меня почему-то отображается фраза "я насчитал _ ворон" без пробелов...
"Я насчитал " - между последней кавычкой и словом насчитал нужен пробел. С вороной такая же история. Никто за вас пробелы ставить не будет. Посмотрите внимательнее на код.
Спасибо, Александр. Не ожидал такого быстрого ответа. Я начинаю изучение с полного нуля ( ранее ни одной строчки кода не писал) и поэтому мне многое не ясно. Вроде внимательно смотрю на код в ваших уроках, но такую мелочь упустил)))
Проблема с домашним заданием. Кнопок то я могу добавить уже хоть десять. Неясно, Как добавить новый счетчик. Или один mCount должен считать за всех?
Прям беда с домашними заданиями, Александр.)) Отложу их на позже. Ничего не понятно в д/з 4 урока вообще. Какие-то новые классы, case, switch и так далее... Еще и выводить будет текст, какая кнопка нажата.
Ничего страшного. Все через это проходили. А откладывать не стоит. Лучше разбираться шаг за шагом.
Добрый день.
Почему вот так работает:
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
Потому что, в методе setText() должен быть текст, а не число. В первом варианте при сложении пустой строки с числом итоговый результат преобразуется тоже в строку. Во втором пример преобразования нет.
И почитайте разницу между ++counter и counter++
http://developer.alexanderklimov.ru/and … /basic.php
Точно, в варианте ++переменная сначала наращивается а потом присваивается, а если поставить после переменной то наоборот.
Спасибо!
А каким методом пользоваться вместо setText, чтобы можно было int или double назначить, без преобразования сложения со стороковой переменной?
Додумался только до такого.
И еще вопрос по @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;
}
}
}
setText() работает только со строками или с идентификаторами строковых ресурсов. Поэтому в любом случае любую переменную int или double нужно преобразовать в строку.
Есть несколько способов.
Например,
int test=5;
String testString = String.valueOf(test);
Вариант со сложением с пустой строкой на самом деле не самый лучший, это я для простоты использую в учебных примерах.
Насчет @Override не нужно заморачиваться. Сами его не пишите. А то, что будет сгенерировано самой студией оставляйте.
Вроде даже в Java 7 и 8 он не является обязательным. В общих чертах - это переопределение метода из класса-родителя. Ваш класс происходит от Activity и у него есть готовые методы, которые вы используете у себя.
И еще вопрос по @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
которое позволит быстро найти ошибку в коде.
Добрый день.
В ДЗ добавил обнуление счетчика уточните, почему значение переменной счетчика обнуляется, но при попытке вывода приложение выключается.
public void NullCrow(View view) {
{ mCout=0;}
TextView mInfoTextView = (TextView)findViewById(R.id.CoutCrow2);
mInfoTextView.setText(mCout);
}
если написать mInfoTextView.setText("0"); кнопка отрабатывает, счетчик обнуляется и отсчет продолжается с нуля.
Добрый день.
Столкнулся с такой проблемой: при нажатии на "Счетчик ворон" вылетает программа. Жду вашей помощи
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
Вы объявили переменную mInfoTextView, но не инициализировали её. У вас в логах пишут on a null object reference - отсутствующий объект
Форум Александра Климова → Android → Щелчок кнопки/Счётчик ворон
Powered by PunBB, supported by Informer Technologies, Inc.