Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 26 мар 2019, 17:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 91 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: 22 сен 2011, 03:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
В этом уроке мы:

- изменяем layout-параметры для уже существующих компонентов экрана

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 28 апр 2017, 10:55, всего редактировалось 12 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 янв 2012, 12:53 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
В вашем коде, в метод onStopTrackingTouch добавил код
Код: [ Загрузить ] [ Скрыть ]
  1.       public void onStopTrackingTouch(SeekBar seekBar) { 
  2.             lParams1.weight = 1; 
  3.             lParams2.weight = 1; 
  4.       } 

чтобы после отпускания ползунка, кнопки вновь стали занимать старые положения, с одинаковым весом, но изменения не происходят. Что я делаю не так?

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 янв 2012, 14:12 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Добавьте еще строки
Код: [ Загрузить ] [ Скрыть ]
  1. btn1.requestLayout(); 
  2. btn2.requestLayout(); 


Он прочтет Layout и перерисует кнопки. Этот метод просто выполняется в settext, поэтому в onProgressChanged его не надо было указывать.

Спасибо за замечание, я пофиксил урок.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 мар 2012, 13:12 

Зарегистрирован: 06 мар 2012, 13:03
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Cразу извиняюсь возможно за глупый вопрос , потому как я вообще сел за программирование 3 дня назад :) .
Я вот захотел создать еще 1 сикер бар и 2 кнопки .Как привязать первый ряд кнопок к первому сикер бару , а второй сикербар соответсвенно ко второму ряду кнопок ? А то у меня не получается . При передвижении ползунка на любом сикер баре передвигаются и обе пары кнопок :(
Вот мой код :
package ru.startandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class P018_1_DynamicLayout3Activity extends Activity implements OnSeekBarChangeListener {

SeekBar sbWeight;
SeekBar sb2Weight;
Button btn1;
Button btn2;
Button btn3;
Button btn4;


LinearLayout.LayoutParams lParams1;
LinearLayout.LayoutParams lParams2;
LinearLayout.LayoutParams Params3;
LinearLayout.LayoutParams Params4;

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

sbWeight = (SeekBar) findViewById(R.id.sbWeight);
sbWeight.setOnSeekBarChangeListener(this);
sb2Weight = (SeekBar) findViewById(R.id.sb2Weight);
sb2Weight.setOnSeekBarChangeListener(this);

btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn4 = (Button) findViewById(R.id.btn4);

lParams1 = (LinearLayout.LayoutParams) btn1.getLayoutParams();
lParams2 = (LinearLayout.LayoutParams) btn2.getLayoutParams();
Params3 = (LinearLayout.LayoutParams) btn3.getLayoutParams();
Params4 = (LinearLayout.LayoutParams) btn4.getLayoutParams();
}


public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int leftValue = progress;
int rightValue = seekBar.getMax() - progress;
// настраиваем вес
lParams1.weight = leftValue;
lParams2.weight = rightValue;
Params3.weight = leftValue;
Params4.weight = rightValue;
// в текст кнопок пишем значения переменных
btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));
btn3.setText(String.valueOf(leftValue));
btn4.setText(String.valueOf(rightValue));
}

public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}

public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
}


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 мар 2012, 14:00 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
При изменении положения ползунка, отрабатывает один и тот же код.
Вы написали:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. sbWeight.setOnSeekBarChangeListener(this);
  2. sb2Weight.setOnSeekBarChangeListener(this);

Следовательно присвоили одно и то-же событие на перетаскивание ползунка.
Что-бы обработчик события отделял один ползунок от другого, в процедуре onProgressChanged Вам стоит определить какой именно объект вызвал событие, sbWeight или sb2Weight. Ссылка на этот объект сидит в параметре seekBar.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public void onProgressChanged(SeekBar seekBar, int progress,
  2. boolean fromUser) {
  3.         int leftValue = progress;
  4.         int rightValue = seekBar.getMax() - progress;
  5.         switch(seekBar) {
  6.                 case sbWeight:
  7.                         lParams1.weight = leftValue;
  8.                         lParams2.weight = rightValue;
  9.                         btn1.setText(String.valueOf(leftValue));
  10.                         btn2.setText(String.valueOf(rightValue));
  11.                         break;
  12.                 case sb2Weight:
  13.                         Params3.weight = leftValue;
  14.                         Params4.weight = rightValue;
  15.                         btn3.setText(String.valueOf(leftValue));
  16.                         btn4.setText(String.valueOf(rightValue));
  17.                         break;
  18.         }
  19. }

PS: На сколько я понял, у Вас совершенно нет опыта объектно ориентированного программирования. Я бы посоветовал Вам, для начала, прочитать хотя-бы одну книгу по Java программированию. Например, "Философия Java" Эккеля- очень хорошая книга.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 мар 2012, 14:01 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
В методе onProgressChanged на вход подается seekBar. Вам надо поставить проверку sbWeight это или sbWeight2.
И в зависимости от этого уже кнопки менять.

Вообще, я вам очень рекомендую сначала все-таки java хоть немного посмотреть. Проще будет.
viewtopic.php?f=17&t=147

P.S. Собственно KamiSempai уже все подробно расписал )

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 мар 2012, 16:10 

Зарегистрирован: 06 мар 2012, 13:03
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо за ссылки на книжки и за ответы :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 апр 2012, 20:27 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
У меня вопрос по методу requestLayout().
На экране есть кнопка на которую назначено следующее событие:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. private float btnHeigth;
  2. private float btnStep;
  3.  
  4. public void RunClick(View view) {
  5.         final Button btn = ((Button) view);
  6.         btnHeigth = btn.getMeasuredHeight();
  7.         btnStep = btnHeigth / 10;
  8.         final Timer timer = new Timer();
  9.         TimerTask timerTask = new TimerTask() {
  10.                 @Override
  11.                 public void run() {
  12.                         if(btnHeigth>=0){
  13.                                 btn.getLayoutParams().height = (int) btnHeigth;
  14.                                 btn.requestLayout();
  15.                                 btnHeigth =- btnStep;
  16.                         }
  17.                         else {timer.cancel();}
  18.                 }
  19.         };
  20.         timer.schedule(timerTask, 250, 250);
  21. }
По идее, при нажатии на кнопку, должен запускаться таймер который начинает уменьшать высоту кнопки на заранее определенную величину.
Однако, при вызове метода requestLayout(), в TimerTask, возникает ошибка.

Что то мне подсказывает, что все это из за вызова в потоке :geek:

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 апр 2012, 09:58 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
KamiSempai писал(а):
Что то мне подсказывает, что все это из за вызова в потоке :geek:

Скорее всего. Timer вроде не имеет доступа к UI.
Это через Handler лучше делать.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 апр 2012, 10:59 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Спасибо, попробую через Handler.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 апр 2012, 18:06 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Проверил, работает, причем на много быстрее :)

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 май 2012, 10:56 
Аватар пользователя

Зарегистрирован: 05 май 2012, 10:42
Сообщений: 13
Откуда: Бобруйск
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
А может кто-нибудь подсказать решение такой проблемы?!
У меня есть TableLayout - объявляю я его так
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. menu_ataka = (TableLayout)findViewById(R.id.menu_ataka);
  2.  

Это layout, который становится VISIBLE при нажатии на определенную кнопку.
Затем, когда мы жмём на кнопку на этом menu_ataka, то его свойства меняются, а именно изменяется его высота.
Изменение его размеров по нажатию я сделал, но как сделать, чтобы эти изменения происходили плавно, т.е. анимированно.
Сейчас это просто
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. Menu_height.height = 500;
  2.       menu_ataka.setLayoutParams(Menu_height);
  3.  

Как всё-таки задать анимацию для имеющегося объекта, когда есть начальное состояние параметра height и конечные???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 май 2012, 20:51 
Аватар пользователя

Зарегистрирован: 23 апр 2012, 20:45
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Так как впервые отписываюсь в комментариях, хочу сначала поблагодарить тебя Дим за сей сайт))) спасибо тебе огромное и дай Бог тебе всего всего и побольше))) а теперь вопрос.....
В методе onStopTrackingTouch
написал вот это: sbWeight.setProgress(50);

т.е. по идеи вес кнопок и показания на них должны остаться такими в какой момент я отпустил бегунок.. и только бегунок должен вернуться на середину, а происходит так что и кнопки становятся равными и надписи на них 50.
пробовал ставить разные цифорки в sbWeight.setProgress(х) складывается такое впечатление, что когда я вызываю sbWeight.setProgress(х) обрабатывается метод onProgressChanged() для значения Х.

Почему так?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 май 2012, 16:36 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Спасибо за отзыв ) Это хорошо, что стараюсь я не зря.

Александр писал(а):
В методе onStopTrackingTouch написал вот это: sbWeight.setProgress(50);
складывается такое впечатление, что когда я вызываю sbWeight.setProgress(х) обрабатывается метод onProgressChanged() для значения Х.


Так и есть. Походу ползунку неважно - руками его двигают или программно, в любом случае срабатывает onProgressChanged. Можно какую-нить boolean переменную использовать, чтобы отличать.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 июл 2012, 15:37 

Зарегистрирован: 13 июл 2012, 11:54
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Дмитрий, спасибо за сайт! У Вас явный талант рассказывать понятным и доступным языком о вещах малодоступных и малопонятных. С большим интересом читаю Ваши уроки.

А вопрос у меня теоретический - может кто поможет:
Почему после присвоения
lParams1.weight = leftValue;
нет необходимости вызывать, например
btn1.setLayoutParams(lParams1);
и только потом
btn1.setText(String.valueOf(leftValue))?

Или другими словами - почему после получения lParams1 = (LinearLayout.LayoutParams) btn1.getLayoutParams();
мы, работая с lParams1, непосредственно влияем на btn1?
Связано ли это с тем, что LinearLayout.LayoutParams объявлен как статический класс?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 июл 2012, 16:50 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Андрей Д писал(а):
Дмитрий, спасибо за сайт! У Вас явный талант рассказывать понятным и доступным языком о вещах малодоступных и малопонятных. С большим интересом читаю Ваши уроки.

А вопрос у меня теоретический - может кто поможет:
Почему после присвоения
lParams1.weight = leftValue;
нет необходимости вызывать, например
btn1.setLayoutParams(lParams1);
и только потом
btn1.setText(String.valueOf(leftValue))?


Спасибо большое :)


В уроке после последнего скрина есть примечание как раз насчет этого.
Цитата:
Есть небольшой нюанс. Как верно заметили в каментах, если просто написать код lParams1.weight = 1, то компонент не изменится. Необходимо дописать код: btn1.requestLayout(). Тогда кнопка прочтет Layout и перерисуется. Этот метод уже вызывается в setText, поэтому мы его здесь явно не вызываем.

Т.е. lParams1.weight = leftValue; ничего не даст. Надо руками запускать btn1.requestLayout(), если потом не запускаются методы, уже содержащие этот вызов.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 12:04 

Зарегистрирован: 23 июл 2012, 18:31
Сообщений: 14
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Такой вопрос, вот мы указываем что обработчик в активити
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends Activity implements OnSeekBarChangeListener 

а если добавим еще и кнопку и нужно будет отслеживать ее нажатие?
Раньше мы делали обработчик в активити аналогично
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends Activity implements OnClickListener 

Теперь там уже есть обработчик OnSeekBarChangeListener, код обработки нажатия на кнопку можно впихнуть в него же и сделать дополнительный выбор по id объекта?
Или надо поступать как-то по-другому?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 12:09 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Мы можем реализовывать в классе любое количество интерфейсов (в чем их и прелесть, в отличии от обычного наследования), просто перечислив их через запятую
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class MainActivity extends Activity implements OnClickListener, OnSeekBarChangeListener


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 12:12 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
один класс может наследовать много интерфейсов (через запятую), а вот наследовать класс - только один.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 июл 2012, 14:02 

Зарегистрирован: 23 июл 2012, 18:31
Сообщений: 14
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
AndreyI, rezak90 - спасибо!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 91 ]  На страницу 1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB