Урок 16. Программное создание экрана. LayoutParams

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Foenix » 18 июн 2013, 01:27

ну? и что, вывелось на экран ровно то, что и заказывалось в xml-е..
R.id.team

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

SPAWN
Сообщения: 20
Зарегистрирован: 11 мар 2013, 21:59

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение SPAWN » 03 июл 2013, 17:40

Подскажите пожалуйста! Мне нужно динамически создать 5 LinearLayout в цикле и потом к ним обращаться. Делал через setId(), но мне нужно изменять Layoutparams,а там только через имя :( :( :(

nazi
Сообщения: 3
Зарегистрирован: 06 сен 2013, 06:29

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение nazi » 09 сен 2013, 10:59

как программно добавить элемент в уже существующий layout? например при нажатии кнопки. нужно что-то обновить?
у меня ничего не получается.

TableLayout body1 = (TableLayout) findViewById(R.id.BodyTable1);

TableRow myrow1 = new TableRow(this);

LayoutParams rowParam1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

myrow1.setLayoutParams(rowParam1);
int RGB1 = android.graphics.Color.rgb(223, 223, 223);
myrow1.setBackgroundColor(RGB1);

LinearLayout.LayoutParams weightParams1 = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
weightParams1.weight = 1;

//LayoutParams lpView1 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

TextView tv11 = new TextView (this, null, R.style.BodyText);
tv11.setText("2,1");
tv11.setLayoutParams( weightParams1 );
tv11.setHeight(1);
myrow1.addView(tv11);
body1.addView(myrow1);

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение trew » 29 сен 2013, 23:38

NAZI
Напишите часть кода, если он выполниться успешно тогда и остальные команды добавите.

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

TextView tv11 = new TextView(this); 
tv11.setText("Это новая запись.");
		
TableRow tableRow3 =(TableRow)findViewById(R.id.tableRow3);		
int RGB1 = android.graphics.Color.rgb(223, 223, 223);
tableRow3.setBackgroundColor(RGB1);
tableRow3.addView(tv11)
;
Данный код добавляет элемент TextView в TableRow (это строка в TableLayout).

Причем все остальные элементы созданы в main.xml т.е. не программным способом а через XML.

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

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Phashik
Сообщения: 3
Зарегистрирован: 28 ноя 2013, 01:06
Откуда: DC

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Phashik » 02 дек 2013, 02:18

Обратите внимание, что для двух объектов View я использовал один объект LayoutParams - lpView. И если я теперь буду менять свойства
этого объекта, меняться будут оба View.
Есть основания полагать, что это неправда.
Думаю, что LayoutParams передаются по значению, а не по ссылке. Поэтому ничего не будет меняться.
Вот код и результат:

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

Button btn = new Button (this);
btn.setText("Button1");
linLayout.addView(btn, lpView);
		
lpView.width = LayoutParams.MATCH_PARENT;
		
Button btn2 = new Button (this);
btn2.setText("Button2");
btn2.setLayoutParams(lpView);
linLayout.addView(btn2);
		
lpView.width = 200;
		
Button btn3 = new Button (this);
btn3.setText("Button3");
linLayout.addView(btn3, lpView);

btn.requestLayout();
btn2.requestLayout();
btn3.requestLayout();
Вложения
sa0161.jpg
sa0161.jpg (22.99 КБ) 15672 просмотра
open your eyes

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение damager82 » 03 дек 2013, 15:22

Phashik писал(а):
Обратите внимание, что для двух объектов View я использовал один объект LayoutParams - lpView. И если я теперь буду менять свойства
этого объекта, меняться будут оба View.
Есть основания полагать, что это неправда.
Да, некорректно у меня написано. Спасибо!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Atetc
Сообщения: 45
Зарегистрирован: 02 май 2014, 13:13
Откуда: Уфа
Контактная информация:

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Atetc » 31 май 2014, 14:18

rezak90 писал(а):button1.setId(12345);
в onClicke:
case 12345: и т.д.
Господа!
Подскажите, не является ли данный вариант задания id для View чреватым в будущем неизвестными последствиями?
Нужно ли стараться делать уникальные числа как делают с магнитными картами 324246000001, 324246000002, 324246000003 ... ?
Существуют какие-то принятые нормы для программного задания id ?

R.java

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

public static final class id {
        public static final int action_bar=0x7f07001c;
        public static final int action_bar_activity_content=0x7f070014;
        public static final int action_bar_container=0x7f07001b;........
Я так понимаю в R.java мы уже никак id свежеиспеченного view-компонента не впихнем... но возможно есть рекомендации девелоп-сообщества ?
Русскоязычный чат Android разработчиков https://gitter.im/rus-speaking/android

ZumbiAzul
Сообщения: 2
Зарегистрирован: 22 июн 2014, 22:36

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение ZumbiAzul » 23 июн 2014, 23:33

Известно, что вышло обновление Eclipse ADT от Google, в котором помимо всего прочего появился файл layout/fragment_main.xml, а также в исходнике MainActivity.java появился подкласс PlaceholderFragment... Так вот, в связи с этим, не совсем понятно, как применить знания текущего урока к новой структуре.. В качестве ответа, я бы хотел получить исходный код MainActicity.java, пригодный для последнего обновления Eclipse ADT.

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Viewer » 24 июн 2014, 05:32

ZumbiAzul

Если пока не понимаете что это такое и с чем это едят, после создания проекта удалите (или закомментируйте) в onCreate следующие строки:
[syntax=java] if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}[/syntax]

На все остальное (класс PlaceholderFragment, fragment_main.xml) можете не обращать никакого внимания, либо удалить, если оно вам мозолит глаза.
Когда в процессе обучения дойдете до фрагментов, тогда поймете что к чему.

pal2
Сообщения: 2
Зарегистрирован: 13 окт 2014, 13:00

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение pal2 » 18 окт 2014, 11:06

Проект создаю по уроку, но при добавлении

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

LayoutParams linLayoutParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
вот такая ошибка:

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

eclipse Description Resource Path Location Type Call requires API level 11 (current min is 10): new android.app.ActionBar.LayoutParams MainActivity.java /P0161_DynamicLayout/src/com/example/dynamiclayout line 18 Android Lint Problem
мне нужно изменить нижний API? Но если Target стоит 2.3.3, то больше не поставить.
Спасибо!

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Foenix » 18 окт 2014, 12:12

target - это не нижний, а целевой
R.id.team

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

pal2
Сообщения: 2
Зарегистрирован: 13 окт 2014, 13:00

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение pal2 » 18 окт 2014, 21:20

Да да, все правильно! Не знал как написать точнее.
Но если в уроке написано 2.3.3 (API10),то должно работать? Но у меня не работает с такой ошибкой, как указано выше.
Подскажите пожалуйста....
Спасибо

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение doter.ua » 19 окт 2014, 13:47

pal2 писал(а):Да да, все правильно! Не знал как написать точнее.
Но если в уроке написано 2.3.3 (API10),то должно работать? Но у меня не работает с такой ошибкой, как указано выше.
Подскажите пожалуйста....
Спасибо
new android.app.ActionBar.LayoutParams MainActivity.java Попробуй заменить ActionBar.LayoutParams на что-нибудь другое, например, LinearLayout.LayoutParams
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

mcdy
Сообщения: 5
Зарегистрирован: 12 дек 2014, 22:50

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение mcdy » 12 дек 2014, 22:59

Здравствуйте. Для закрепления урока решил сделать некий тест:
стартовая страница - картинка, под ней вопрос, еще снизу 4 кнопки с вариантами ответов.
при нажатии на кнопку весь экран должен перерисоваться для нового вопроса.

Вобщем, первая перерисовка удалась, но метод onCreate всего один, и повторное применение слушателей для новых кнопок ввел оменя в ступор. Можно это как-то сделать вообще?

зы: так же новая картинка почему-то на весь экран по ширине и не меняет никак размер, даже при присвоении ей размеров или констант lp1, lp2... можно это исправить?
зы2: часто текст из текствоого поля так же почему-то идет ниже кнопок (кнопки его перекрывают), хотя даже места под кнопками свободного - полно... в чем может быть проблема?

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

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity implements OnClickListener{
	
	
	 Button button1;
	 Button button2;
	 Button button3;
	 Button button4;
	 TextView editText1;
	 ImageView imageView1;
	 int bal=0;
	 LinearLayout ll1;
	 
	 int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(this);
        button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(this);
        button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(this);
        button4 = (Button) findViewById(R.id.button4);
        button4.setOnClickListener(this);
        editText1 = (TextView) findViewById(R.id.editText1);
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        ll1 = (LinearLayout) findViewById(R.id.ll1);
        
        
    }

    
    @Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
    	
    	switch (v.getId()) {
        case R.id.button1:
        	ll1.removeAllViews();
        break;
        case R.id.button2:
        	ll1.removeAllViews();
          break;
        case R.id.button3:
        	ll1.removeAllViews();
        	bal=bal+1;
          break;
        case R.id.button4:
        	ll1.removeAllViews();
          break;
        }

    	LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    	
    	
    	ll1.setOrientation(LinearLayout.VERTICAL);
    	ImageView imageView1 = new ImageView(this);	
    	imageView1.setImageResource(R.drawable.kv02);
    	imageView1.setMaxHeight(220);
    	imageView1.setMaxWidth(240);
        ll1.addView(imageView1);
        TextView textView1 = new TextView(this);
        textView1.setHeight(26);
    	textView1.setText("ххххх?");
        ll1.addView(textView1, lp2);

        LinearLayout ll2 = new LinearLayout(this);
    	Button button1 = new Button(this);
    	button1.setText("1");
        ll2.addView(button1);
    	Button button2 = new Button(this);
    	button2.setText("2");
        ll2.addView(button2);
        
        LinearLayout ll3 = new LinearLayout(this);
    	Button button3 = new Button(this);
    	button3.setText("3");
        ll3.addView(button3);
    	Button button4 = new Button(this);
    	button4.setText("4");
        ll3.addView(button4);
        
        ll1.addView(ll2, lp2);
        ll1.addView(ll3, lp2);
        
   
        
        
	}
    

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



}

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение doter.ua » 13 дек 2014, 13:43

А почему просто не менять текст\картинку по событию ( например по клику ). Можно делать кнопки невидимыми (invisible или gone) если нужно изменить кол-во вариантов. В случае совсем радикальных отличий между вопросами можно использовать фрагменты. У картинок есть режимы заполнения типа растянуть, замостить и т.д. погуглите.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

mcdy
Сообщения: 5
Зарегистрирован: 12 дек 2014, 22:50

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение mcdy » 13 дек 2014, 15:02

может потому что все звучит непонятно...
проблема у меня с пониманием в том, что метод onClick всего один... и вот как в него вписать все варианты нажатий одной и той же кнопки, но при разных вопросах... что бы кнопка каждый раз выводила новый экран...
есть идея сделать через цикл, задав всем текстовым значениям и картинкам константы с номерами экрана, но опять же, застрял на том как вызывать определенную константу с нужным индексом. Хз как оно в методе onClick будет себя вести, правда...
еще была идея делать для каждого нового вопроса новый main-клас, но по сути будет создаваться новая програма, и это слишком мудрено получится, кажется...

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Foenix » 13 дек 2014, 16:51

какой еще цикл? там же SWITCH Организовывается! в уроках же есть это.
R.id.team

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

mcdy
Сообщения: 5
Зарегистрирован: 12 дек 2014, 22:50

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение mcdy » 13 дек 2014, 16:56

Foenix писал(а):какой еще цикл? там же SWITCH Организовывается! в уроках же есть это.
эм... тут switch же используется для выбора действия в зависимости от того, какой элемент нажали

у меня же - кнопка сохраняется, и после каждого последующего нажатия по ней - должна делать другое действие

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

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение Foenix » 13 дек 2014, 18:25

что значит "новый экран"? наверняка просто вьюшка, демонстрирующая вопрос. Зачем новый экран, если можно просто поменять содержимое соответствующей вьюшки на другое?
Используй скрины, чтоб показать что тебе действительно нужно.
R.id.team

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

mcdy
Сообщения: 5
Зарегистрирован: 12 дек 2014, 22:50

Re: Урок 16. Программное создание экрана. LayoutParams

Сообщение mcdy » 13 дек 2014, 19:12

viewtopic.php?f=3&t=108&p=38204#p38187
вот тут я описал что хотелось бы сделать...
Foenix писал(а):что значит "новый экран"? наверняка просто вьюшка, демонстрирующая вопрос. Зачем новый экран, если можно просто поменять содержимое соответствующей вьюшки на другое?
Используй скрины, чтоб показать что тебе действительно нужно.
Да, можно просто поменять картинку в ImageView, текст на кнопках-ответах и в самом вопросе.
НО, это получается сделать только 1 раз. код того что пробовал сделать по ссылке выше (экран, который делается после SWITCH аналогичен тому, что описан в main.xml)

изменения экрана прописал в методе onClick (изменнение самих значений может даже и лучше будет), но вот после этого как присвоить новые слушатели кнопкам и что бы элементам присваивались уже третие-...-двадцатые значения?

Ответить