Нет, это не вариант, так как у меня layout меняется.KamiSempai писал(а):При повороте экрана Activity уничтожается и пересоздается заного, все элементы, созданные во время ее работы, пропадут. Отменить пересоздание можно в файле манифеста, в свойствах активности: android:configChanges="orientation"
Урок 17. Создание View-компонент в рабочем приложении
Re: Урок 17. Создание View-компонент в рабочем приложении
Re: Урок 17. Создание View-компонент в рабочем приложении
Так вот в этом то й проблема...У меня динамически создаются spinners и соответственно у них уже будут состояния при повороте (пользователь уже что-то выберет). А при повороте мало того, что нужно нарисовать уже добавленные елементи, так еще и по очериде правильной и что б состояние имели прежние.damager82 писал(а):Урок 70 рассказывает, как быть при повороте. Иерархию Views (если она отлична от layout-файла) я думаю придется заново создавать после поворота.DenBond7 писал(а):Здраствуйте...интересный вопрос - если сменить ориентацию, то динамические обекты исчезают...как сохранить новосозданую иерархию Views
Ну я с этой проблемой разобрался....Так как Вы и сказали, пришлось писать метод, который сохраняет состояния и потом занова прорисовывать елементы!
Но все же хотелось, что бы это делалось автоматически.
Re: Урок 17. Создание View-компонент в рабочем приложении
Объясните. Мы создаём кнопки. А как определить как из созданных кнопок нажата, например. И как создаются кнопки с одинаковым названием ведь я так понимаю btnNew это имя переменой,которое должно быть индивидуально,а у нас получается что несколько кнопок с таким именем,что то я не понимаю. Можно поподробней в этом моменте. Заранее благодарен.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 17. Создание View-компонент в рабочем приложении
btnNew это не сама кнопка а ссылка на неё. Когда мы создаем кнопку ссылка записывается в эту переменную. Если создать еще одну кнопку предыдущая кнопка ни куда не исчезнет. Просто в переменной btnNew будет записана ссылка на другую кнопку.
Кнопки можно различать если установить для них разные ID. Сделать это можно при помощи setId(int id).
Кнопки можно различать если установить для них разные ID. Сделать это можно при помощи setId(int id).
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 17. Создание View-компонент в рабочем приложении
Добрый день!
Есть небольшая проблема, пока не получилось справиться...
после добавления на экране появляется кнопка "Выход" во всю ширину экрана, кнопки "Назад" не видно вообще
если поменять местами последние 2 строчки, то видно только "Назад"...
wrapContent - по ширине меня не устраивает, мне надо чтобы обе кнопки делили поровну ширину экрана...
Есть небольшая проблема, пока не получилось справиться...
Код: Выделить всё
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-компонент в рабочем приложении
Добавьте строку
lParams.weight=1;
Кнопки будут с одинаковым "весом", поэтому будут всегда делить свой layout поровну.
lParams.weight=1;
Кнопки будут с одинаковым "весом", поэтому будут всегда делить свой layout поровну.
Re: Урок 17. Создание View-компонент в рабочем приложении
СПАСИБО!!!!AndreyI писал(а):Добавьте строку
lParams.weight=1;
Кнопки будут с одинаковым "весом", поэтому будут всегда делить свой layout поровну.
Re: Урок 17. Создание View-компонент в рабочем приложении
А у меня приложение выбивает ошибку:
"Примерный" код тоже не запускается. Что сделать с эклипсом или эмулятором?
Может кто поймет, в чем ошибка?
Заранее благодарен. Очень полезный сайт.
Эмулятор выбил ошибку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-компонент в рабочем приложении
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
код покажи
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
Re: Урок 17. Создание View-компонент в рабочем приложении
Код: Выделить всё
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;
}
}
}
Код: Выделить всё
etNum1 = (EditText) findViewById(R.id.etNum1);
Re: Урок 17. Создание View-компонент в рабочем приложении
Попро6уй сделай Project - Clean,
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText
CEO of a company R.id.team
Re: Урок 17. Создание View-компонент в рабочем приложении
Не помогло...Finch писал(а):Попро6уй сделай Project - Clean,
Вероятней всего у те6я не о6новился R.java и по линку на EditText находится не EditText
Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.
Re: Урок 17. Создание View-компонент в рабочем приложении
Попробуйте переименовать View в layout-е. Например, вместо etName напишите etName1, сохраните и исправьте соответственно ID элемента в Activity.moreno писал(а):Не помогло...
Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.
Иногда помогает.
Re: Урок 17. Создание View-компонент в рабочем приложении
Здравствуйте, в mainactivity.java выдает ошибку, ругается на ссылки в case'ах
"case expressions must be constant expressions"
Сам код (копипаст с Вашего урока):
"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-компонент в рабочем приложении
Возможны два варианта:
1. Файл R.java неправильно сгенерирован
2. Вы залезли в файл R.java и что-то там отредактировали, несмотря на предупреждение в заголовке, что это делать нельзя.
В R.java константа должна быть объявлена public static final int btnCreate = 0x....;
Сделайте Project/Clean... или удалите файл R.java, чтобы он создался заново.
1. Файл R.java неправильно сгенерирован
2. Вы залезли в файл R.java и что-то там отредактировали, несмотря на предупреждение в заголовке, что это делать нельзя.
В R.java константа должна быть объявлена public static final int btnCreate = 0x....;
Сделайте Project/Clean... или удалите файл R.java, чтобы он создался заново.
Re: Урок 17. Создание View-компонент в рабочем приложении
damager82 писал(а):Попробуйте переименовать View в layout-е. Например, вместо etName напишите etName1, сохраните и исправьте соответственно ID элемента в Activity.moreno писал(а):Не помогло...
Я приложения обычно запускаю на андроид 4.0 (AVD), но пробовал и на 2.3 - ошибка та же.
Иногда помогает.
Мои etNum1 и etNum2 указывали на поля типа TextView в main.xml, хотя должны были указывать на EditText.
Спасибо за помощь Finch и damager82
Re: Урок 17. Создание View-компонент в рабочем приложении
Возможен третий: вставленmath64 писал(а):Возможны два варианта:
import andoid.R;
Re: Урок 17. Создание View-компонент в рабочем приложении
почему eclips просит удалить @Override в onClick ?
Re: Урок 17. Создание View-компонент в рабочем приложении
если не ошибаюсь то версия Java наверное используется не 1.6yolops писал(а):почему eclips просит удалить @Override в onClick ?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 17. Создание View-компонент в рабочем приложении
непринципиальные вопросы
1) есть ли глубокий смысл объявлять wrapContent на уровне Activity? ведь это локальная переменная метода onСreate нет?
2) объекты после использования очищать нужно? (как в Delfy например) или мусорщик подчистит неиспользуемые экземпляры?
1) есть ли глубокий смысл объявлять wrapContent на уровне Activity? ведь это локальная переменная метода onСreate нет?
2) объекты после использования очищать нужно? (как в Delfy например) или мусорщик подчистит неиспользуемые экземпляры?