Topic: Светофор
Обсуждение урока Светофор
Все вопросы проплачены кошками - всемирно известными производителями котят
You are not logged in. Please login or register.
Для регистрации на форуме следует написать мне письмо. В ответе я напишу правильный ответ для прохождения регистрации.
Форум Александра Климова → Android → Светофор
Здравствуйте,
Нашёл ошибочку в коде для зеленого цвета, после слов "По такому же принципу добавьте зелёный цвет."
Там написано #FF00FF00 вместо #00FF00
Здравствуйте.
Касательно одного обработчика для всех кнопок - у меня заработало по-другому...
В свойствах кнопок onClick (в дизайнере или в XML) пишется один и тот же обработчик. Без реализации листенера, без цепляния обработчика на кнопки в onCreate.
public void onAnyButtonClick(View view) {
switch (view.getId()){
case id.buttonRed:
mRelativeLayout.setBackgroundColor(getResources().getColor(color.redColor));
mTextView.setText(string.red);
break;
case id.buttonGreen:
mRelativeLayout.setBackgroundColor(getResources().getColor(color.greenColor));
mTextView.setText(string.green);
break;
case id.buttonYellow:
mRelativeLayout.setBackgroundColor(getResources().getColor(color.yellowColor));
mTextView.setText(string.yellow);
break;
}
}
Разметка:
<Button
...
android:id="@+id/buttonRed"
android:onClick="onAnyButtonClick"/>
<Button
...
android:id="@+id/buttonYellow"
android:onClick="onAnyButtonClick" />
<Button
...
android:id="@+id/buttonGreen"
android:onClick="onAnyButtonClick" />
То есть вроде как реализовывать OnClickListener излишне...
Является ли это ошибочным, или в чем-то ошибочным, или плохой практикой, или имеет недостатки?
Почему вы решили, что это ошибка? Вы проверяли?
А, виноват, не проверял. Теперь проверил и понял, что так тоже работает. Не сталкивался раньше с возьмизначным обозначением цвета.
Но теперь загуглил и во всё разобрался, что одно значение отвечает за непрозрачность.
для deadhead
Я писал об этом способе в статье о кнопке. Можете пользоваться им, если вам так удобнее. Недостатком не является, но при использовании фрагментов данный способ не всегда работает.
А у меня не получается, как у уважаемого deadhead. Точнее не получается проверить: при первом же нажатии на любую из кнопок приложение выбивается из эмулятора и пишет: Unfortunately, Svetofor has stopped. Хотя всё также прописал, только процедуру просто "onClick" назвал.
И почему то я в примере deadhead при обращении к переменным и цветам не вижу класс R. Без него у меня всё ругается.
Поддерживаю sokolov. Всё сделано по примеру и в эмуляторе выдает "Unfortunately, Svetofor has stopped"
Александр, а можно пожалуйста пример с использованием старого способа через onCreate с методом switch() используя onTouchListener?
А то я так и не допетрил как их совместить, заранее благодарю.
А что за старый способ?
Более традиционный способ в Java, не правильно выразился. В общем где в методе onCreate прописывается код кнопки
Додумался только до такого, а вот чтобы и onTouchListener и switch не могу додуматься:
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;
}
}
}
И еще не могу с иконками разобраться. Создал в пнг, с помощью менеджера иконок импортировал, поменял манифест, а все равно на телефоне стандартная иконка отображается, а в IDE на уровне строки на панельке новая иконка.
Потом я удалил все стандартные, а свои назвал по дефолту ic_launcher, в манифесте все вернул назад, в итоге на панельке в IDE на уровне строки роботик(стандартный) и на телефоне он самый. Причем когда в IDE делаешь doubleClick по нему открывается новая иконка.
Не пойму в чем косяк, mb студио гонит?
Где-то вы забыли что-то поменять. В манифесте за значок отвечает атрибут android:icon.
mButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// Ваш код
return false;
}
});
Вопрос, скорее, по Android Studio.
При вводе строки mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.yellowColor));
у меня подсказка по методу getColor() выдаёт две строки:
getColor(id) - зачеркнуто и
getColor(id, theme) - нормально.
Выбираю незачеркнутый, но после ввода (R.color.yellowColor) метод становится зачёркнутым. Но если отключить контроль, то всё работает в эмуляторе. Видимо, где-то у меня настройки сбились?
Нет, в Android 6 метод объявили устаревшим. Устаревший означает не в смысле неработающий, а в смысле - не рекомендуемый.
Можно заменить на
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.yellowColor, null));
Объясните, почему не могу создать метод onClick через атрибуты XML? Возникает ошибка "Cannot resolve symbol 'onRedButtonClick'". Соответственно, из-за этой ошибки не могу создать метод.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:background="@color/redColor"
android:id="@+id/relativeLayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/textView"
android:text="@string/button_red"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_red"
android:id="@+id/button_red"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:onClick="onRedButtonClick"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_yellow"
android:id="@+id/button_yellow"
android:layout_below="@+id/button_red"
android:layout_alignParentStart="true"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/button_green"
android:id="@+id/button_green"
android:layout_below="@+id/button_yellow"
android:layout_alignParentStart="true" />
</RelativeLayout>
____________
Upd: Разобрался в чем проблема. Данная ошибка начала возникать после удаления у RelativeLayout новых атрибутов, которые появились в версии студии 1.4 и отвечают (как я понял) за отображение разметки конвертика в правом нижнем углу. Я их удалил по причине того, что из-за этого конвертика вся моя разметка при запуске эмулятора съезжает либо вверх, либо вниз, скрываясь за пределами экрана. В следствии этого вопрос, как избавиться от этих новшеств Студии и получить прежний Blank Activity, так как хотя эти атрибуты и удалены, но в эмуляторе значок все равно остается или можно про это новшество отдельный урок, как работать с этими элементами экрана?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_main" tools:context=".MainActivity">
Не вижу никакой связи между ошибкой и новыми атрибутами. Вы ошиблись в чем-то другом. Метод должен работать как и прежде.
подскажите пожалуйста в эмуляторе все работает, но только ставлю на телефон/планшет (Galaxy Tab 3 8.0) приложение открывается. но при нажатии на кнопки выдает ошибку и закрывается. Android 4.4.3
Уважаемый Александр, у меня при нажатии на кнопку "Зелёный" фон не становится зелёным, только текст выделяется зелёным прямоугольником. При нажатии на другие кнопки после нажатия на "Зелёный" фон меняется, но текст по-прежнему остаётся выделен зеленым прямоугольником. Как исправить?
Попробуйте рассуждать логически. Если что-то выделяется, но выделяется не тот компонент, значит ваш код обращается не к тому элементу.
Форум Александра Климова → Android → Светофор
Powered by PunBB, supported by Informer Technologies, Inc.