Перейти к содержанию
Fire Monkey от А до Я
  • 0

[ListBox] TAction


Kitty

Вопрос

В документации рассказано как поделиться текстом в соц. сетях из своего приложения. Чтобы это сделать у компонента должно быть в инспекторе объектов свойство Action (например кнопка). У меня ListBox служит как выпадающее меню и один из итемов хотелось бы по клику задействовать как поделиться в соц. сетях. Однако у ListBoxItem нет свойства Action. Как правильно решить эту задачу: при клике на ListBoxItem - поделиться текстом в соц. сетях? Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Я отказался от TActions ввиду глючности и не предсказуемости. Попробуйте этот код:

procedure TFormMain.ListBoxMultiViewItemClick(const Sender: TCustomListBox;
  const Item: TListBoxItem);
Var LThread: TThread;
    S : String;
begin
  if Not Item.Selectable then
    exit;
  if Not Item.Enabled then
    exit;
  MultiView.HideMaster;

  if Item = ListBoxItemShare then
  begin
    SendError('Share url');
    S:='Всем срочно ставить моё крутое приложение для Android'+#10+URLGooglePlay;
    LThread:=TThread.CreateAnonymousThread(
      procedure
      begin
        ShareUrl(S);
        TThread.CurrentThread.Terminate;
      end);
    LThread.FreeOnTerminate := true;
    LThread.Start;
  end;
end;

procedure ShareUrl(AURL : String);
{$IFDEF ANDROID}
Const SMediaLibraryOpenTextWith = 'Send text using:';
var MIMETypes: string;
    Intent: JIntent;
    IntentChooser: JIntent;
    ChooserCaption: string;
{$ENDIF ANDROID}
begin
{$IFDEF ANDROID}
  try
    Intent := TJIntent.Create;
    MIMETypes := 'text/plain';
  //    Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE)
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
    Intent.setType(StringToJString(MIMETypes));
    Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
    Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AURL));
    ChooserCaption := SMediaLibraryOpenTextWith;
    IntentChooser := TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ChooserCaption));
    SharedActivity.startActivity(IntentChooser);
  finally
  end;
{$ENDIF ANDROID}
end;

 

Ссылка на комментарий
  • 0
  • Администраторы

LThread может и не запуститься на андроиде и удалиться до старта, после выхода из метода.

Ссылка на комментарий
  • 0
  • Модераторы
4 часа назад, Евгений Корепов сказал:

Я отказался от TActions ввиду глючности и не предсказуемости. Попробуйте этот код:


procedure TFormMain.ListBoxMultiViewItemClick(const Sender: TCustomListBox;
  const Item: TListBoxItem);
Var LThread: TThread;
    S : String;
begin
  if Not Item.Selectable then
    exit;
  if Not Item.Enabled then
    exit;
  MultiView.HideMaster;

  if Item = ListBoxItemShare then
  begin
    SendError('Share url');
    S:='Всем срочно ставить моё крутое приложение для Android'+#10+URLGooglePlay;
    LThread:=TThread.CreateAnonymousThread(
      procedure
      begin
        ShareUrl(S);
        TThread.CurrentThread.Terminate;
      end);
    LThread.FreeOnTerminate := true;
    LThread.Start;
  end;
end;

procedure ShareUrl(AURL : String);
{$IFDEF ANDROID}
Const SMediaLibraryOpenTextWith = 'Send text using:';
var MIMETypes: string;
    Intent: JIntent;
    IntentChooser: JIntent;
    ChooserCaption: string;
{$ENDIF ANDROID}
begin
{$IFDEF ANDROID}
  try
    Intent := TJIntent.Create;
    MIMETypes := 'text/plain';
  //    Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE)
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
    Intent.setType(StringToJString(MIMETypes));
    Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
    Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AURL));
    ChooserCaption := SMediaLibraryOpenTextWith;
    IntentChooser := TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ChooserCaption));
    SharedActivity.startActivity(IntentChooser);
  finally
  end;
{$ENDIF ANDROID}
end;

 

1) в чем проявляются косяки?

2) этот код сорцов студии

3) зачем использовать поток?

Ссылка на комментарий
  • 0
19 часов назад, Brovin Yaroslav сказал:

LThread может и не запуститься на андроиде и удалиться до старта, после выхода из метода.

Точно! Сейчас посмотрел свежим взглядом и понял недочет, сделаю LThread глобальным.

Ссылка на комментарий
  • 0
19 часов назад, ZuBy сказал:

1) в чем проявляются косяки?

2) этот код сорцов студии

3) зачем использовать поток?

1. Увеличение веса приложения - туда натолкано столько кода, понятно что мультиплатформенности (тот же, не используемый в андроиде, TControl в параметрах множества функций). На андроиде может работать, а может и нет, или срабатывать через раз. Не знаю причину, разбираться лень.

2. Да, из исходников и выдран метод. После того как ознакомился с исходниками, решил ограничится коротенькой процедурой.

3. Без потока приложение залипает на 2-3 секунды, не очень приятное ощущение, особенно когда вызов идет с нажатой на MultiView кнопки - анимация закрытия MultiView замораживается в неопределенном состоянии и приложение выглядит как будто умерло :-)

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...