Урок 17. Создание View-компонент в рабочем приложении

Обсуждение уроков
DenBond7
Сообщения: 5
Зарегистрирован: 20 май 2012, 15:33

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение DenBond7 » 15 июн 2012, 08:29

KamiSempai писал(а):При повороте экрана Activity уничтожается и пересоздается заного, все элементы, созданные во время ее работы, пропадут. Отменить пересоздание можно в файле манифеста, в свойствах активности: android:configChanges="orientation"
Нет, это не вариант, так как у меня layout меняется.

DenBond7
Сообщения: 5
Зарегистрирован: 20 май 2012, 15:33

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение DenBond7 » 15 июн 2012, 08:34

damager82 писал(а):
DenBond7 писал(а):Здраствуйте...интересный вопрос - если сменить ориентацию, то динамические обекты исчезают...как сохранить новосозданую иерархию Views
Урок 70 рассказывает, как быть при повороте. Иерархию Views (если она отлична от layout-файла) я думаю придется заново создавать после поворота.
Так вот в этом то й проблема...У меня динамически создаются spinners и соответственно у них уже будут состояния при повороте (пользователь уже что-то выберет). А при повороте мало того, что нужно нарисовать уже добавленные елементи, так еще и по очериде правильной и что б состояние имели прежние.

Ну я с этой проблемой разобрался....Так как Вы и сказали, пришлось писать метод, который сохраняет состояния и потом занова прорисовывать елементы!

Но все же хотелось, что бы это делалось автоматически.

daiz123
Сообщения: 18
Зарегистрирован: 11 июн 2012, 15:42

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение daiz123 » 23 июн 2012, 00:13

Объясните. Мы создаём кнопки. А как определить как из созданных кнопок нажата, например. И как создаются кнопки с одинаковым названием ведь я так понимаю btnNew это имя переменой,которое должно быть индивидуально,а у нас получается что несколько кнопок с таким именем,что то я не понимаю. Можно поподробней в этом моменте. Заранее благодарен.

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

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение KamiSempai » 23 июн 2012, 11:08

btnNew это не сама кнопка а ссылка на неё. Когда мы создаем кнопку ссылка записывается в эту переменную. Если создать еще одну кнопку предыдущая кнопка ни куда не исчезнет. Просто в переменной btnNew будет записана ссылка на другую кнопку.
Кнопки можно различать если установить для них разные ID. Сделать это можно при помощи setId(int id).
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

smeh
Сообщения: 4
Зарегистрирован: 31 май 2012, 08:37

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение smeh » 13 июл 2012, 10:25

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

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


LinearLayout llButton = (LinearLayout)findViewById(R.id.llButton);

LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(matchParent, wrapContent);
    	
    	btExit = new Button(this);
    	btExit.setText("Выход");
    	btExit.setOnClickListener(this);
    	
    	btBack = new Button(this);
    	btBack.setText("Назад");
    	btBack.setOnClickListener(this);
    	
    	llButton.addView(btExit, lParams);
    	llButton.addView(btBack, lParams);
 
после добавления на экране появляется кнопка "Выход" во всю ширину экрана, кнопки "Назад" не видно вообще :-(
если поменять местами последние 2 строчки, то видно только "Назад"...
wrapContent - по ширине меня не устраивает, мне надо чтобы обе кнопки делили поровну ширину экрана...

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение AndreyI » 13 июл 2012, 12:36

Добавьте строку
lParams.weight=1;
Кнопки будут с одинаковым "весом", поэтому будут всегда делить свой layout поровну.

smeh
Сообщения: 4
Зарегистрирован: 31 май 2012, 08:37

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение smeh » 13 июл 2012, 13:46

AndreyI писал(а):Добавьте строку
lParams.weight=1;
Кнопки будут с одинаковым "весом", поэтому будут всегда делить свой layout поровну.
СПАСИБО!!!!

moreno
Сообщения: 4
Зарегистрирован: 15 июл 2012, 17:40

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение moreno » 15 июл 2012, 17:51

А у меня приложение выбивает ошибку:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.p0171_dynamiclayout2/com.example.p0171_dynamiclayout2.MainActivity}: java.lang.ClassCastException: android.widget.TextView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: android.widget.TextView
at com.example.p0171_dynamiclayout2.MainActivity.onCreate(MainActivity.java:32)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
... 11 more
Эмулятор выбил ошибку
"Application has stopped unexpectedly. Please try again."
Код программы в целом совпадает с тем, что на сайте.
"Примерный" код тоже не запускается. Что сделать с эклипсом или эмулятором?

Может кто поймет, в чем ошибка?
Заранее благодарен. Очень полезный сайт.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение Finch » 16 июл 2012, 22:20

Caused by: java.lang.ClassCastException: android.widget.TextView
at com.example.p0171_dynamiclayout2.MainActivity.onCreate(MainActivity.java:32)

включи нумерацию строк в едиторе (Window-Preferences-General-Editors-Text Editors - Show line numbers(галочкой отметь)) или просто клацни мышью 2 раза по строке в логкате и те6я перекинет на строку с оши6кой, вероятней всего у те6я 2 одинаковых ID в xml
код покажи ;)
CEO of a company R.id.team

moreno
Сообщения: 4
Зарегистрирован: 15 июл 2012, 17:40

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение moreno » 17 июл 2012, 20:43

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

package com.example.p0171_dynamiclayout2;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	
	RadioGroup rgGravity;
	LinearLayout llMain;
	EditText etName;
	Button btnCreate;
	Button btnClear;

	int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        llMain = (LinearLayout) findViewById(R.id.llMain);
        rgGravity = (RadioGroup) findViewById(R.id.rgGravity);
        etName = (EditText) findViewById(R.id.etName);
        
        btnCreate = (Button) findViewById(R.id.btnCreate);
        btnCreate.setOnClickListener(this);
        
        btnClear  = (Button) findViewById(R.id.btnClear);
        btnClear.setOnClickListener(this);
    }

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

	public void onClick(View v) {
		switch(v.getId()){
		case R.id.btnCreate:
			LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(wrapContent, wrapContent);
			int btnGravity = Gravity.LEFT;
			
			switch(rgGravity.getCheckedRadioButtonId()){
			case R.id.rbLeft:
				btnGravity = Gravity.LEFT;
				break;
			case R.id.rbCenter:
				btnGravity = Gravity.CENTER_HORIZONTAL;
				break;
			case R.id.rbRight:
				btnGravity = Gravity.RIGHT;
				break;
			}
			
			lParams.gravity = btnGravity;
			
			Button btnNew = new Button(this);
			btnNew.setText(etName.getText().toString());
			llMain.addView(btnNew, lParams);
			etName.setText(null);
			break;
		case R.id.btnClear:
			llMain.removeAllViews();
			Toast.makeText(this, "Cleared", Toast.LENGTH_SHORT).show();
			break;
		}
	}
}
Я пока это приложение пропустил, но в Уроке 19 появляется такая же ошибка в строке:

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

        etNum1 = (EditText) findViewById(R.id.etNum1);

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение Finch » 17 июл 2012, 21:16

Попро6уй сделай Project - Clean,
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText
CEO of a company R.id.team

moreno
Сообщения: 4
Зарегистрирован: 15 июл 2012, 17:40

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение moreno » 17 июл 2012, 21:37

Finch писал(а):Попро6уй сделай Project - Clean,
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText
Не помогло...

Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.

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

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение damager82 » 18 июл 2012, 11:56

moreno писал(а):Не помогло...
Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.
Попробуйте переименовать View в layout-е. Например, вместо etName напишите etName1, сохраните и исправьте соответственно ID элемента в Activity.
Иногда помогает.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Daniil
Сообщения: 25
Зарегистрирован: 15 июл 2012, 13:01

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение Daniil » 20 июл 2012, 18:00

Здравствуйте, в mainactivity.java выдает ошибку, ругается на ссылки в case'ах
"case expressions must be constant expressions"
"case expressions must be constant expressions"
Изображение

Сам код (копипаст с Вашего урока):

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

package ru.example.l17_dynamiclayout;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	  LinearLayout llMain;
	  RadioGroup rgGravity;
	  EditText etName;
	  Button btnCreate;
	  Button btnClear;

	  int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;

	  /** Called when the activity is first created. */
	  @Override
	  public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.activity_main);

	    llMain = (LinearLayout) findViewById(R.id.llMain);
	    rgGravity = (RadioGroup) findViewById(R.id.rgGravity);
	    etName = (EditText) findViewById(R.id.etName);

	    btnCreate = (Button) findViewById(R.id.btnCreate);
	    btnCreate.setOnClickListener(this);

	    btnClear = (Button) findViewById(R.id.btnClear);
	    btnClear.setOnClickListener(this);
	  }

	  public void onClick(View v) {
	    switch (v.getId()) {
	    case R.id.btnCreate:
	      // Создание LayoutParams c шириной и высотой по содержимому
	      LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(
	          wrapContent, wrapContent);
	      // переменная для хранения значения выравнивания
	      // по умолчанию пусть будет LEFT
	      int btnGravity = Gravity.LEFT;
	      // определяем, какой RadioButton "чекнут" и
	      // соответственно заполняем btnGravity
	      switch (rgGravity.getCheckedRadioButtonId()) {
	      case R.id.rbLeft:
	        btnGravity = Gravity.LEFT;
	        break;
	      case R.id.rbCenter:
	        btnGravity = Gravity.CENTER_HORIZONTAL;
	        break;
	      case R.id.rbRight:
	        btnGravity = Gravity.RIGHT;
	        break;
	      }
	      // переносим полученное значение выравнивания в LayoutParams
	      lParams.gravity = btnGravity;

	      // создаем Button, пишем текст и добавляем в LinearLayout
	      Button btnNew = new Button(this);
	      btnNew.setText(etName.getText().toString());
	      llMain.addView(btnNew, lParams);
	      etName.setText(null);

	      break;

	    case R.id.btnClear:
	      llMain.removeAllViews();
	      Toast.makeText(this, "Удалено", Toast.LENGTH_SHORT).show();
	      break;

	    }
	  }

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

    
}

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение math64 » 20 июл 2012, 20:24

Возможны два варианта:
1. Файл R.java неправильно сгенерирован
2. Вы залезли в файл R.java и что-то там отредактировали, несмотря на предупреждение в заголовке, что это делать нельзя.
В R.java константа должна быть объявлена public static final int btnCreate = 0x....;
Сделайте Project/Clean... или удалите файл R.java, чтобы он создался заново.

moreno
Сообщения: 4
Зарегистрирован: 15 июл 2012, 17:40

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение moreno » 22 июл 2012, 13:00

damager82 писал(а):
moreno писал(а):Не помогло...
Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.
Попробуйте переименовать View в layout-е. Например, вместо etName напишите etName1, сохраните и исправьте соответственно ID элемента в Activity.
Иногда помогает.

Мои etNum1 и etNum2 указывали на поля типа TextView в main.xml, хотя должны были указывать на EditText.



Спасибо за помощь Finch и damager82

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение math64 » 23 июл 2012, 20:15

math64 писал(а):Возможны два варианта:
Возможен третий: вставлен
import andoid.R;

yolops
Сообщения: 1
Зарегистрирован: 28 окт 2012, 20:04

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение yolops » 28 окт 2012, 20:23

почему eclips просит удалить @Override в onClick ?

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

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение rezak90 » 28 окт 2012, 23:20

yolops писал(а):почему eclips просит удалить @Override в onClick ?
если не ошибаюсь то версия Java наверное используется не 1.6
R.id.team
Политика на форуме запрещена

RsH
Сообщения: 3
Зарегистрирован: 19 ноя 2012, 12:30

Re: Урок 17. Создание View-компонент в рабочем приложении

Сообщение RsH » 20 ноя 2012, 15:50

непринципиальные вопросы
1) есть ли глубокий смысл объявлять wrapContent на уровне Activity? ведь это локальная переменная метода onСreate нет?

2) объекты после использования очищать нужно? (как в Delfy например) или мусорщик подчистит неиспользуемые экземпляры?

Ответить