Страницы

Поиск по вопросам

Показаны сообщения с ярлыком view. Показать все сообщения
Показаны сообщения с ярлыком view. Показать все сообщения

понедельник, 13 апреля 2020 г.

Android: long click - как заставить работать так же как и onclick

#события #android #view

                    
Проблема такая: понаписывал я своих вьюшек (иконки разные с текстом) и для них определил
onclick listener'ы, но тут проблема - если держать палец около секунды - то ничего
происходить не будет (очевидно сработал он самый long click). Можно конечно создать
onLongClickListener и вызывать в нём onClick, но тогда придётся каждой вьюшке назначить
его. Пробовал поставить в xml longClickable = false, но это ничего не дало. В общем
есть какое то нормальное решение, или придётся всё же обрабатывать onLongClick?    


Ответы

Ответ 1



Как по мне - так если пользователь сделал LongClick, значит он и хотел сделать лонг клик... Ну а если уж сильно надо - устанавливайте не OnClick, а OnTouch. И производите действия, скажем, по отпусканию вьюшки if (event.getAction() == MotionEvent.ACTION_UP) { //что нужно сделать по клику и лонг клику }

суббота, 11 апреля 2020 г.

Реализация перемещения тестового UIView и установка текста метки

#ios #xcode #view #gestures #label

                    
Добрый день. Только начала изучать жесты в iOS, выполняю туториал http://www.appcoda.com/ios-gesture-recognizers/.
Дошла до Pan Gesture Recognizer, и здесь возникла проблема: после присвоения меткам
значений вертикальной и горизонтальной скорости, жест "ломается". UIVIew больше не
перемещается плавно вместе с курсором мыши, а перепрыгивает в место, где остановился
курсор мыши. Значения меток обновляются без проблем.
Ниже приведен код, который реализует перемещение тестового вида:

PanViewController.h

@interface PanViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIView *testView;

@property (weak, nonatomic) IBOutlet UILabel *horizontalVelocityLabel;

@property (weak, nonatomic) IBOutlet UILabel *verticalVelocityLabel;

@end

PanViewController.m

@interface PanViewController ()

- (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer;

@end

@implementation PanViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)];
    [self.testView addGestureRecognizer:panGestureRecognizer];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint touchLocation = [panGestureRecognizer locationInView:self.view];

    self.testView.center = touchLocation;


После добавления следующих строк в последний метод и возникает проблема с неправильным
выполнением жеста перетаскивания, хотя никаких ошибок не возникает:

    CGPoint velocity = [panGestureRecognizer velocityInView:self.view];

    self.horizontalVelocityLabel.text = [NSString stringWithFormat:@"Horizontal Velocity:
%.2f points/sec", velocity.x];
    self.verticalVelocityLabel.text = [NSString stringWithFormat:@"Vertical Velocity:
%.2f points/sec", velocity.y];


}


Как мне исправить эту "поломку"? Очень хочется понять, что же я неправильно делаю,
а не продолжать дальнейшее обучение, не разобравшись до конца с проблемой.
Заранее спасибо.
    


Ответы

Ответ 1



Все потому, что при передвижении Вы ставите UIView в центр, а нужно расчитывать и устанавливать frame: - (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer { //CGPoint touchLocation = [panGestureRecognizer locationInView:self.view]; //self.testView.center = touchLocation; CGPoint translation = [panGestureRecognizer translationInView:panGestureRecognizer.view]; CGRect newFrame = self.testView.frame; newFrame.origin.y = newFrame.origin.y + translation.y; newFrame.origin.x = newFrame.origin.x + translation.x; self.testView.frame = newFrame; [panGestureRecognizer setTranslation:CGPointZero inView:panGestureRecognizer.view]; CGPoint velocity = [panGestureRecognizer velocityInView:self.view]; self.horizontalVelocityLabel.text = [NSString stringWithFormat:@"Horizontal Velocity: %.2f points/sec", velocity.x]; self.verticalVelocityLabel.text = [NSString stringWithFormat:@"Vertical Velocity: %.2f points/sec", velocity.y]; } Этот код будет работать только если у Вас будет выключен Autolayout. Если же Autolayout включен, то для этого можно посмотреть вот это обсуждение https://stackoverflow.com/questions/16129988/ios-dragged-view-is-jumping-back-to-original-position-auto-layout-combined Вы можете посмотреть реализацию моего кода без autolayout: https://cloud.mail.ru/public/2g1Y/EC19pnX2P

Ответ 2



Лучше не используйте frame или center, используйте для этого NSLayoutConstaint создайте @property (weak, nonatomic) IBOutlet NSLayoutConstaint *testViewLeft; дальше двигайте ее: self.testViewLeft.constant = newValue; [self.view layoutIfNeeded]; чтобы это происходило с анимацией, поместите layoutIfNeeded() в блок анимации [UIView animateWithDuration: 0.1 animations: ^{ [self.view layoutIfNeeded]; } completion: nil]; сохраните offset точки начала жеста от края view, это поможет сделать движение более плавным вначале @property (nonatomic) CGFloat panOffset; к тому же в action проверяйте состояние жеста: - (void)panGestureStateChanged:(UIPanGestureRecognizer *)sender { switch (sender.state) { case UIGestureRecognizerStateBegan: self.panOffset = sender.locationInView(contentContainerView).x break; case UIGestureRecognizerStateChanged: CGFloat touchPoint = [sender locationInView:view]; CGFloat newConstant = touchPoint.x - offset; self.testViewLeft.constant = newConstant; [UIView animateWithDuration:0.03 animations:^{ [self.view layoutIfNeeded]; } completion: nil]; break; case UIGestureRecognizerStateEnded: panOffset = 0; break; default: break; } } еще полезным будет стать UIGestureRecognizerDelegate и реализовать метод, чтобы контроливать когда следует начинать жест, а когда нет: - (BOOL)gestureRecognizerShouldBegin(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer == self.myPanGesture) { return (someGestureBeginConditions > 0); } return true; }

вторник, 25 февраля 2020 г.

Как описать контекстные меню для нескольких view в одной Activity?

#java #android #activity #view #menu


Во всех найденных мною примерах создается меню для одного view.
Как создать контекстные меню для нескольких элементов в одной Activity?    


Ответы

Ответ 1



Так, по идее, можно сделать. Весь код пишем в активити. 1) Находим нужные нам вьюхи и регистрируем их для получения события вызова контестного меню: TextView tV = (TextView) findViewById(R.id.yours_text_view_id); registerForContextMenu(tV); ImageView iV = (ImageView ) findViewById(R.id.yours_image_view_id); registerForContextMenu(iV); 2) Переопределяем методы активити: @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { switch (v.getId()) { case R.id.yours_text_view_id: menu.add(0, 0, 0, "Получить тест статьи"); menu.add(0, 1, 0, "Комментарии"); menu.add(0, 2, 0, "Открыть в браузере"); break; case R.id.yours_image_view_id: menu.add(0, 3, 0, "Ещё кнопка0"); menu.add(0, 4, 0, "Ещё кнопка1"); menu.add(0, 5, 0, "Ещё кнопка2"); break; } } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: //что-то делаем break; case 1: //что-то делаем break; case 2: //что-то делаем break; case 3: //что-то делаем break; case 4: //что-то делаем break; case 5: //что-то делаем break; case 6: //что-то делаем break; } return super.onContextItemSelected(item); }

понедельник, 24 февраля 2020 г.

Android. View элементы меняют дефолтный стиль в зависимости от типа Activity. Как установить единый стиль?

#java #android #view #checkbox


Заметил что при создании различных типов Activity при создании приложения, к ним
прикручиваются разные стили для чекбоксов и спиннеров, при создании Активити типа диалог
там и вовсе свой стиль у элементов. Где эти стили прописываются в коде и как их на
всех типах активити одинаковыми сделать?
    


Ответы

Ответ 1



Стили указываются в манифесте при объявлении активити с помощью атрибута android:theme В данном манифесте они указаны в теге application и в каждом теге activity. В атрибутах указаны ссылки на ресурс styles Если в теге activity не указан атрибут android:theme, то берётся родительское значение этого атрибута (т.е. значение android:theme тега application) Сами описания стилей хранятся в ресурсах (/res/values/styles.xml например) Программно: getWindow().setBackgroundDrawable()

пятница, 13 декабря 2019 г.

Отличие ViewBag от ViewData

#c_sharp #net #aspnet #aspnet_mvc #view


Зачем существуют и ViewBag и ViewData? Ведь, по сути, они выполняют абсолютно одну
и ту же функцию - хранить данные для представления.

Есть ли разница в быстроте загрузки страницы при использовании того или другого?
    


Ответы

Ответ 1



Копипаст из интернета: ViewData ViewData — это словарный объект, производный от TempViewDataDictionary; Используется для передачи данных из контроллера в соответствующее представление; Жизненный цикл ограничен текущим запросом; Если происходит redirect, значение ViewData превращается в null; Также необходимо осуществлять приведение типов и проверять на null, чтобы избежать ошибок; ViewBag ViewBag — динамическое свойство, представляет собой обертку вокруг ViewData , и также используется для передачи данных из контроллера в соответствующее представление; Жизненный цикл также ограничивается текущий запросом; При редиректе значение также оборачивается в null; Нет необходимости в приведении типов для получения данных Так же, ViewBag имеет преимущество в том, что можно использовать его свойства Strongly typed-методом, при этом корректность данных будет проверена еще на этапе компиляции/написания кода.

Ответ 2



ViewBag - это динамический объект-обертка над ViewData. Вся разница - в том, что к первому вы обращаетесь через точку, а ко второму - по индексу. Разница в скорости есть, но несущественная. Используйте то, что удобнее.

суббота, 30 ноября 2019 г.

Запретить поворот Activity и всего приложения

#java #android #activity #view


Добрый день.
Как правильно решить такую ситуацию?
Есть андроид-приложение, которое зависит от одного параметра - диагональ дисплея.
Эту величину, или приблизительную к ней, я нахожу - проблем нету. 
В зависимости от дисплея >5 дюймов - только landscape, <5 - только портрет.
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (ScreenSize<5) {
            setContentView(R.layout.startactivity_p); //отобразить хмл портретный
        }
        else{
            setContentView(R.layout.startactivity_l); // отобразить хмл ландскейп
        }

    }

В каждом xml-layout'е прописал следующее:
android:screenOrientation="landscape"
android:orientation="vertical"

и
android:screenOrientation="portrait"
android:orientation="horizontal"

соответственно.
Но приложение все равно поворачивается. Подскажите, как можно это исправить?    


Ответы

Ответ 1



Для каждого вашего случая setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); и setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); Не поворачивается. Вообще вот хорошая статья.

Ответ 2



Всё же лучше в Манифесте это сделать. android:screenOrientation="portrait" или android:screenOrientation="landscape" Всё вместе:

среда, 10 июля 2019 г.

RecyclerView количество строк

Можно ли указать количество строк в RecyclerView, когда в горизонтальном режиме прокрутки, к примеру в GridLayout указывается android:columnCount="4"? существует ли что-то такое для RecyclerView?


Ответ

решил проблему с использованием GridLayoutManager
rv=(RecyclerView)findViewById(R.id.rv); GridLayoutManager glm = new GridLayoutManager(this, 4); rv.setLayoutManager(glm); rv.setHasFixedSize(true);

понедельник, 8 июля 2019 г.

Цвет текста статус бара

Есть ли способ поменять цвет текста и иконок статус бара?


Ответ

Начиная с Android M можно установить светлую тему, но поставить цвет нельзя. Вообщем, в res/values-v23/styles.xml
true

пятница, 5 июля 2019 г.

Android: long click - как заставить работать так же как и onclick

Проблема такая: понаписывал я своих вьюшек (иконки разные с текстом) и для них определил onclick listener'ы, но тут проблема - если держать палец около секунды - то ничего происходить не будет (очевидно сработал он самый long click). Можно конечно создать onLongClickListener и вызывать в нём onClick, но тогда придётся каждой вьюшке назначить его. Пробовал поставить в xml longClickable = false, но это ничего не дало. В общем есть какое то нормальное решение, или придётся всё же обрабатывать onLongClick?


Ответ

Как по мне - так если пользователь сделал LongClick, значит он и хотел сделать лонг клик... Ну а если уж сильно надо - устанавливайте не OnClick, а OnTouch. И производите действия, скажем, по отпусканию вьюшки if (event.getAction() == MotionEvent.ACTION_UP) { //что нужно сделать по клику и лонг клику }