Урок 10. Оптимизируем реализацию обработчиков.

Обсуждение уроков
Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Foenix » 17 ноя 2013, 14:32

да в логе же написано. Или вы конкурс устраиваете, кто угадает?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение trew » 17 ноя 2013, 14:40

ошибка в скобках, проверяй.
Почему здесь решил скобку закрыть?
btnCancel = (Button) findViewById(R.id.btnCancel);}
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

StupIvan
Сообщения: 2
Зарегистрирован: 17 ноя 2013, 14:25

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение StupIvan » 17 ноя 2013, 14:59

trew писал(а):ошибка в скобках, проверяй.
Почему здесь решил скобку закрыть?
btnCancel = (Button) findViewById(R.id.btnCancel);}
Спасибо!

UraP
Сообщения: 4
Зарегистрирован: 25 ноя 2013, 20:53

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение UraP » 28 ноя 2013, 23:57

Привет всем, я совместил два метода (описание кнопки в xml фаиле и Activity, как обработчик), При нажатии кнопки Start(описание кнопки в xml фаиле) приложение закрывается...
[syntax=java]
package com.pokrovskii.qwerty;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener
{
Button Button1; // переменные
Button Button2; // переменные
TextView Textview1;
Button BtnStart;// переменные





@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button1 = (Button) findViewById(R.id.button1);
Button2 = (Button) findViewById(R.id.button2);
Textview1 = (TextView) findViewById(R.id.textView1);
BtnStart = (Button) findViewById(R.id.btnStart);
Button1.setOnClickListener(this);
Button2.setOnClickListener(this);




}


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


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.button1:
Textview1.setText("Нажата кнопка ОК");
break;
case R.id.button2:
Textview1.setText("Нажата кнопка Cancel");
break;
}

}

public void OnclickStart(View v) {
switch (v.getId()) {
case R.id.btnStart:
Textview1.setText("Нажата кнопка Start");
break;
}

}

}
[/syntax]

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение KamiSempai » 29 ноя 2013, 12:15

Смотрите ошибку в логах.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Vadimir
Сообщения: 1
Зарегистрирован: 13 дек 2013, 04:06

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Vadimir » 13 дек 2013, 04:57

Привет. Я новичок. Двигаюсь по урокам. У же второй день пытаюсь разобраться. Пересоздавал проекты несколько раз. Помогите разобраться что в коде не так?

Ругается на tvOut.setText
Хотя в Main tvOut создан. в R.Id присутствует.

[syntax=javascript]
package ru.vadimir.p0101_listener;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView tvOut;
Button btnOk;
Button btnCancel;

tvOut = (TextView) findViewById(R.id.tvOut);
btnOk = (Button) findViewById(R.id.btnOk);
btnCancel = (Button) findViewById(R.id.btnCancel);

// создание обработчика
OnClickListener oclBtn = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOk:
// кнопка ОК
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
// кнопка Cancel
tvOut.setText("Нажата кнопка Cancel");
break;
}
}
};
btnOk.setOnClickListener(oclBtn);
btnCancel.setOnClickListener(oclBtn);
}

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение rezak90 » 13 дек 2013, 08:44

Vadimir писал(а):Ругается на tvOut.setText
Хотя в Main tvOut создан. в R.Id присутствует.
Потому что tvOut объявлена в методе onCreate, а используешь в реализации интерфейса. В таком виде интерфейс просит сделать tvOut как final переменную. Выноси tvOut в переменную класса.
R.id.team
Политика на форуме запрещена

Criceto
Сообщения: 2
Зарегистрирован: 19 дек 2013, 16:39

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Criceto » 19 дек 2013, 16:43

Здравствуйте, огромное спасибо за Ваши уроки, описано всё просто прекрасно. Возникла такая проблема, по нажатию на любую из кнопок программа вылетает, вот весь код с MainActivity:

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

 package ru.startandroid.develop.activitylistener;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener {

	TextView tvOut;
	Button btnOk;
	Button btnCancel;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		TextView tvOut = (TextView) findViewById(R.id.tvOut);
		Button btnOk = (Button) findViewById(R.id.btnOk);
		Button btnCanel = (Button) findViewById(R.id.btnCancel);
		
		btnOk.setOnClickListener(this);
		btnCanel.setOnClickListener(this);
	}

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

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()){
		case R.id.btnOk:{
			tvOut.setText("Нажата кнопка ОК");
			break;
		}
		case R.id.btnCancel:{
			tvOut.setText("Нажата кнопка Cancel");
			break;
		}
			
		}
	}

} 
Вложения
Безымянный.jpg
Безымянный.jpg (183.9 КБ) 14284 просмотра

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение trew » 19 дек 2013, 16:52

Criceto писал(а):Здравствуйте, огромное спасибо за Ваши уроки, описано всё просто прекрасно. Возникла такая проблема, по нажатию на любую из кнопок программа вылетает
Ошибка здесь
[syntax=java]TextView tvOut = (TextView) findViewById(R.id.tvOut);
Button btnOk = (Button) findViewById(R.id.btnOk);
Button btnCanel = (Button) findViewById(R.id.btnCancel); [/syntax]

Догадаетесь где?
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Mikhail_dev » 19 дек 2013, 16:58

trew, ты бы сразу отправил учить материал =)
Ошибка в незнании что такое локальные и глобальные переменные. Советую изучить данный вопрос, потому как это азы Java, без которых дорога в Android, да и в Java,, да и вообще в программирование, закрыта.

Criceto
Сообщения: 2
Зарегистрирован: 19 дек 2013, 16:39

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Criceto » 19 дек 2013, 22:08

Ошибка здесь

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

TextView tvOut = (TextView) findViewById(R.id.tvOut);
Button btnOk = (Button) findViewById(R.id.btnOk);
Button btnCanel = (Button) findViewById(R.id.btnCancel);
Догадаетесь где?
Спасибо большое за наводку, ошибку понял.

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение TittTitov » 15 янв 2014, 17:54

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

Вопрос из урока №36,
Почему для радиокнопок код R.id.имя_кнопки в case записывается в скобках? При каки условиях используется такая запись? Спасибо!
1.PNG
1.PNG (21.63 КБ) 14242 просмотра

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение KamiSempai » 16 янв 2014, 11:53

Можно и без скобок. Это не имеет значения.

Разница как между:
m = 1 + 2;
m =(1 + 2);
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 16 янв 2014, 21:25

TittTitov писал(а):Здравствуйте!
Вопрос из урока №36,
Почему для радиокнопок код R.id.имя_кнопки в case записывается в скобках? При каки условиях используется такая запись? Спасибо!
Походу ошибка копипаста моя. Пофиксил.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
xamak
Сообщения: 15
Зарегистрирован: 14 апр 2014, 03:05

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение xamak » 14 апр 2014, 17:53

Criceto писал(а):
Ошибка здесь

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

TextView tvOut = (TextView) findViewById(R.id.tvOut);
Button btnOk = (Button) findViewById(R.id.btnOk);
Button btnCanel = (Button) findViewById(R.id.btnCancel);
Догадаетесь где?
Я не автор вопроса, но хочу попробовать указать где ошибка.
Ошибка в том, что НЕ нужно было указывать TextView, Button и Button, т.к. за пределы onCreate автор уже вывел TextView tvOut; Button btnOk; и Button btnCanel;.

У меня вопрос в другом, как это на словах сказать? То есть я понимаю, что нужно сделать, но не знаю как это назвать :)
Например, выводим классы с именами экземпляров класса за пределы метода onCreate (вывели View элементы), а теперь к ним обращаемся с помощью функции findViewById() в пределах метода onCreate после функции setContentView().

Если я сказал глупость, тогда подскажите, пожалуйста, как правильно.
Благодарю!

Аватара пользователя
xamak
Сообщения: 15
Зарегистрирован: 14 апр 2014, 03:05

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение xamak » 14 апр 2014, 19:34

У меня еще один вопрос возник на счет атрибута onClick.
Ну, например в кнопке прописываем android:onClick="onClickStart", а в активити указываем метод public void onClickStart(View v) {}.

Вопрос: Для каждой кнопки нужно создавать индивидуальный метод public void ХХХ(View v)?
Ну, например, две кнопки:
android:onClick="onClickStart"
android:onClick="onClickEnd"


Значит в активити два метода:
public void onClickStart(View v) {}.
public void onClickEnd(View v) {}.

?

Или можно как-то в одном методе объединить с помощью switch case break?
Если, да, тогда как? Потому что в уроке указано как это сделать с помощью switch (v.getId()) {case R.id.XXXX: break;}
А для этого понадобится находить View элементы для наличия ID, ну и собственно обработчиков выступает уже активити (implements OnClickListener).

А вот как сделать это в упрощенном варианте просто с атрибутом onClick?
Ну, я имею в виду как-то вот так:
public void XXX(View v) {
switch (поиск атрибута()) {
case onClickStart:
// действие
break;
case onClickEnd:
// действие
break;
}
}

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Leeroy » 14 апр 2014, 21:25

xamak писал(а):У меня еще один вопрос возник на счет атрибута onClick.


Или можно как-то в одном методе объединить с помощью switch case break?
Если, да, тогда как? Потому что в уроке указано как это сделать с помощью switch (v.getId()) {case R.id.XXXX: break;}
А для этого понадобится находить View элементы для наличия ID, ну и собственно обработчиков выступает уже активити (implements OnClickListener).

А вот как сделать это в упрощенном варианте просто с атрибутом onClick?
Ну, я имею в виду как-то вот так:
public void XXX(View v) {
switch (поиск атрибута()) {
case onClickStart:
// действие
break;
case onClickEnd:
// действие
break;
}
}
Ставь один и тот же атрибут (например buttonClick) всем кнопкам. А в методе сравнивай по id.

Вот кусок кода

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

public void buttonClick(View v){
	if (v.getId() == R.id.buttonOk) textView.setText("Button OK"); 
	else if  (v.getId() == R.id.buttonCancel) textView.setText("Button Cancel");
}
Если кнопок меньше 3-х можно и без свича.
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

Аватара пользователя
xamak
Сообщения: 15
Зарегистрирован: 14 апр 2014, 03:05

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение xamak » 14 апр 2014, 21:58

Leeroy писал(а): Ставь один и тот же атрибут (например buttonClick) всем кнопкам. А в методе сравнивай по id.

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

public void buttonClick(View v){
	if (v.getId() == R.id.buttonOk) textView.setText("Button OK"); 
	else if  (v.getId() == R.id.buttonCancel) textView.setText("Button Cancel");
}
Если кнопок меньше 3-х можно и без свича.
Отлично! Спасибо. А вот вопрос на счет if:
Я вот сделал их 5 штук для разных кнопок
if (v.getId() == R.id.button1) textView.setText("button1");
if (v.getId() == R.id.button2) textView.setText("button2");
if (v.getId() == R.id.button3) textView.setText("button3");
if (v.getId() == R.id.button4) textView.setText("button4");
else if (v.getId() == R.id.button5) textView.setText("button5");


И все хорошо, eclipse не ругается и программа срабатывает. Правильно ли так или так на самом деле не стоит делать?
Я также попробовал убрать else и стало просто все if - и программа без ошибок сохранилась и запускается. Нормально ли это? :)
if (v.getId() == R.id.button1) textView.setText("button1");
if (v.getId() == R.id.button2) textView.setText("button2");
if (v.getId() == R.id.button3) textView.setText("button3");
if (v.getId() == R.id.button4) textView.setText("button4");
if (v.getId() == R.id.button5) textView.setText("button5");


Вы сообщили о том, что "Если кнопок меньше 3-х можно и без свича", а ведь вот вставляется 5 кнопок через if и работает. Нужен ли свитч тогда? Если да, тогда как он прописывается в таком случае? Благодарю.

Vikky_Leto
Сообщения: 4
Зарегистрирован: 12 апр 2014, 22:05

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Vikky_Leto » 15 апр 2014, 09:42

Добрый день!
Приложение вылетает. Может кто-то посмотреть в чем ошибка?
Хотя, по логике, вроде все верно.
Manifest:

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

[syntax=java]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.startandroid.p0103"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="ru.startandroid.p0103.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>[/syntax]
MainActivity:

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

[syntax=java]
package ru.startandroid.p0103;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity implements OnClickListener{

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

		if (savedInstanceState == null) {
			getSupportFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.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();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

	@Override
	public void onClick(View arg0) {
		tvOut.setText("Нажата кнопка");
		
	}

}

[/syntax]
Fragment_main.xml:

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

[syntax=java]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ru.startandroid.p0103.MainActivity$PlaceholderFragment" >

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="100dp"
        android:text="start" 
        android:onClick="onClickStart"/>

    <TextView
        android:id="@+id/tvOut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="TextView" />

</LinearLayout>

[/syntax]

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение klblk » 15 апр 2014, 10:32

Что вылетает? Где вылетает? При каких условиях вылетает? и... где логи ошибки?

Ответить