Страница 2 из 8

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

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

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

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

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

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

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

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

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

Добавлено: 23 июн 2012, 11:08
KamiSempai
btnNew это не сама кнопка а ссылка на неё. Когда мы создаем кнопку ссылка записывается в эту переменную. Если создать еще одну кнопку предыдущая кнопка ни куда не исчезнет. Просто в переменной btnNew будет записана ссылка на другую кнопку.
Кнопки можно различать если установить для них разные ID. Сделать это можно при помощи setId(int id).

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

Добавлено: 13 июл 2012, 10:25
smeh
Добрый день!
Есть небольшая проблема, пока не получилось справиться...

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


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 - по ширине меня не устраивает, мне надо чтобы обе кнопки делили поровну ширину экрана...

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

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

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

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

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

Добавлено: 15 июл 2012, 17:51
moreno
А у меня приложение выбивает ошибку:
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."
Код программы в целом совпадает с тем, что на сайте.
"Примерный" код тоже не запускается. Что сделать с эклипсом или эмулятором?

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

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

Добавлено: 16 июл 2012, 22:20
Finch
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
код покажи ;)

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

Добавлено: 17 июл 2012, 20:43
moreno

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

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);

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

Добавлено: 17 июл 2012, 21:16
Finch
Попро6уй сделай Project - Clean,
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText

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

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

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

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

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

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

Добавлено: 20 июл 2012, 18:00
Daniil
Здравствуйте, в 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;
    }

    
}

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

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

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

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

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



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

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

Добавлено: 23 июл 2012, 20:15
math64
math64 писал(а):Возможны два варианта:
Возможен третий: вставлен
import andoid.R;

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

Добавлено: 28 окт 2012, 20:23
yolops
почему eclips просит удалить @Override в onClick ?

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

Добавлено: 28 окт 2012, 23:20
rezak90
yolops писал(а):почему eclips просит удалить @Override в onClick ?
если не ошибаюсь то версия Java наверное используется не 1.6

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

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

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