Topic: Светофор

Обсуждение урока Светофор

Re: Светофор

Здравствуйте,

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

Там написано #FF00FF00 вместо #00FF00

Re: Светофор

Почему вы решили, что это ошибка? Вы проверяли?

4 (edited by deadhead 2015-07-17 00:49:22)

Re: Светофор

Здравствуйте.
Касательно одного обработчика для всех кнопок - у меня заработало по-другому...
В свойствах кнопок 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 излишне...
Является ли это ошибочным, или в чем-то ошибочным, или плохой практикой, или имеет недостатки?

5 (edited by Elisey93 2015-07-17 03:39:26)

Re: Светофор

alexander.klimoff wrote:

Почему вы решили, что это ошибка? Вы проверяли?

А, виноват, не проверял. Теперь проверил и понял, что так тоже работает. Не сталкивался раньше с возьмизначным обозначением цвета.
Но теперь загуглил и во всё разобрался, что одно значение отвечает за непрозрачность.

Re: Светофор

для deadhead
Я писал об этом способе в статье о кнопке. Можете пользоваться им, если  вам так удобнее. Недостатком не является, но при использовании фрагментов данный способ не всегда работает.

Re: Светофор

А у меня не получается, как у уважаемого deadhead. Точнее не получается проверить: при первом же нажатии на любую из кнопок приложение выбивается из эмулятора и пишет: Unfortunately, Svetofor has stopped. Хотя всё также прописал, только процедуру просто "onClick" назвал.

И почему то я в примере deadhead при обращении к переменным и цветам не вижу класс R. Без него у меня всё ругается.

Re: Светофор

Что-то вы так делаете. Пример-то простой.

Re: Светофор

Поддерживаю sokolov. Всё сделано по примеру и в эмуляторе выдает "Unfortunately, Svetofor has stopped"

Re: Светофор

Все новички так говорят. А потом выясняется, что-то упустили.

Re: Светофор

Александр, а можно пожалуйста пример с использованием старого способа через onCreate с методом switch() используя onTouchListener?
А то я так и не допетрил как их совместить, заранее благодарю.

Re: Светофор

А что за старый способ?

Re: Светофор

alexander.klimoff wrote:

А что за старый способ?

Более традиционный способ в Java, не правильно выразился. В общем где в методе onCreate прописывается код кнопки

14 (edited by Mup0k 2015-08-19 14:57:15)

Re: Светофор

Додумался только до такого, а вот чтобы и 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;
        }
    }
}

Re: Светофор

И еще не могу с иконками разобраться. Создал в пнг, с помощью менеджера иконок импортировал, поменял манифест, а все равно на телефоне стандартная иконка отображается, а в IDE на уровне строки на панельке новая иконка.
Потом я удалил все стандартные, а свои назвал по дефолту ic_launcher, в манифесте все вернул назад, в итоге на панельке в IDE на уровне строки роботик(стандартный) и на телефоне он самый. Причем когда в IDE делаешь doubleClick по нему открывается новая иконка.
Не пойму в чем косяк, mb студио гонит?

Re: Светофор

Где-то вы забыли что-то поменять. В манифесте за значок отвечает атрибут android:icon.

Re: Светофор

mButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                // Ваш код
                return false;
            }
        });

18 (edited by storm03 2015-09-14 01:19:54)

Re: Светофор

Вопрос, скорее, по Android Studio.
При вводе строки mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.yellowColor));
у меня подсказка по методу getColor() выдаёт две строки:
getColor(id) - зачеркнуто и
getColor(id, theme) - нормально.
Выбираю незачеркнутый, но после ввода (R.color.yellowColor) метод становится зачёркнутым. Но если отключить контроль, то всё работает в эмуляторе. Видимо, где-то у меня настройки сбились?

Re: Светофор

Нет, в Android 6 метод объявили устаревшим. Устаревший означает не в смысле неработающий, а в смысле - не рекомендуемый.
Можно заменить на
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.yellowColor, null));

20 (edited by YettyZzZone 2015-10-05 12:33:58)

Re: Светофор

Объясните, почему не могу создать метод 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">

Re: Светофор

Не вижу никакой связи между ошибкой и новыми атрибутами. Вы ошиблись в чем-то другом. Метод должен работать как и прежде.

Re: Светофор

подскажите пожалуйста в эмуляторе все работает, но только ставлю на телефон/планшет (Galaxy Tab 3 8.0) приложение открывается. но при нажатии на кнопки выдает ошибку и закрывается. Android 4.4.3

Re: Светофор

Если работает в эмуляторе, то должно работать и на устройстве.

Re: Светофор

Уважаемый Александр, у меня при нажатии на кнопку "Зелёный" фон не становится зелёным, только текст выделяется зелёным прямоугольником. При нажатии на другие кнопки после нажатия на "Зелёный" фон меняется, но текст по-прежнему остаётся выделен зеленым прямоугольником. Как исправить?

Re: Светофор

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