Как перезагрузить (обновить) содержимое WebView, нажав кнопку? КОТЛИН [dубликат]

Что делает std :: remove do?

Вот псевдокод std::remove. Возьмите несколько секунд, чтобы узнать, что он делает, а затем прочитайте объяснение.

Iter remove(Iter start, Iter end, T val) { Iter destination = start; //loop through entire list while(start != end) { //skip element(s) to be removed if (*start == val) { start++; } else //retain rest of the elements *destination++ = *start++; } //return the new end of the list return destination; }

Обратите внимание, что удаление просто перемещает элементы в последовательности, переписывая значения, которые вы хотите удалить. Значит, ценности, которые вы хотели удалить, действительно исчезли, но тогда в чем проблема? Скажем, у вас есть вектор со значениями {1, 2, 3, 4, 5}. После вызова remove для val = 3 вектор теперь имеет {1, 2, 4, 5, 5}. То есть 4 и 5 были перемещены вверх так, что 3 ушло от вектора, но размер вектора не изменился. Кроме того, конец вектора теперь содержит дополнительную левую над копией 5.

Что делает std :: remove do?

std::erase принимает начало и конец диапазона, который вы хотите избавиться. Не требуется размер вектора , который вы хотите удалить, только начало и конец диапазона. Вот псевдо-код для его работы:

erase(Iter first, Iter last) { //copy remaining elements from last while (last != end()) *first++ = *last++; //truncate vector resize(first - begin()); }

Таким образом, операция стирания фактически изменяет размер контейнера и поэтому освобождает память.

Идиома remove-erase

Комбинация std::remove и std::erase позволяет удалить соответствующие элементы из контейнера, чтобы контейнер фактически усекался, если элементы были удалены. Вот как это сделать:

//first do the remove auto removed = std::remove(vec.begin(), vec.end(), val); //now truncate the vector vec.erase(removed, vec.end());

Это известно как идиома удаления-стирания. Почему он спроектирован так? Понимание заключается в том, что операция поиска элементов является более общей и независимой от базового контейнера (зависит только от итераторов). Однако операция стирания зависит от того, как контейнер хранит память (например, у вас может быть связанный список вместо динамического массива). Таким образом, STL ожидает, что контейнеры будут выполнять свою собственную стирание, одновременно предоставляя общую операцию «удалить», чтобы все контейнеры не могли реализовать этот код. На мой взгляд, имя очень вводит в заблуждение, а std::remove должно было быть вызвано std::find_move.

Примечание: выше код строго псевдокод. Фактическая реализация STL более умна, например, используя std::move вместо копирования.

37
задан Michael Todd 1 April 2010 в 21:11
поделиться

8 ответов

1) Если вы хотите перезагрузить один и тот же URL-адрес:

  mWebView.loadUrl ("http: //www.websitehere.php");   

, поэтому полный код будет

  newButton.setOnClickListener (новый View.OnClickListener () {public void onClick (View v) {dgeActivity.this.  mWebView.loadUrl ("http: //www.websitehere.php");}});   

2) Вы также можете вызвать mWebView.reload () , но помните, что это отправляет страницу, если запрос был POST, поэтому работает только с GET. [ ! d5]

51
ответ дан Pentium10 15 August 2018 в 20:25
поделиться
  • 1
    ВЫ СОООО РОК !!! Огромное спасибо. Это сработало отлично! WHOO HOOOO !!!! :) – cdg 1 April 2010 в 21:51
  • 2
    Теперь, если бы я мог превратить его в виджет ....: D – cdg 2 April 2010 в 04:37
  • 3
    Ответ Джоша правильный. Ваш будет продолжать перезагружать один и тот же URL. – Muhammad Babar 18 March 2015 в 14:53
  • 4
    После того, как вы загрузите страницу, вы установили видимость этой кнопки на INVISIBLE, как это показано на рисунке. NewButton.setVisibility (View.INVISIBLE) & quot; – Sudhir Belagali 30 October 2015 в 13:24
  • 5
    webView.loadUrl (& quot; javascript: window.location.reload (true) & quot;); это помогло мне, webview.reload не работал, но это нужно, yourWebView.getSettings (). setJavaScriptEnabled (true); включен в настройках веб-просмотра – Ramakanth Putta 28 May 2018 в 02:21

Почему бы не попробовать это?

Код Swift для вызова внутри класса:

  self.mainFrame.reload ()  

или внешний вызов

  myWebV.mainFrame.reload ()  
-4
ответ дан D.A.H 15 August 2018 в 20:25
поделиться

Лучшее решение - просто сделать webView.loadUrl ("javascript: window.location.reload (true)"); . Это должно работать на всех версиях и не вводить новые записи истории.

37
ответ дан dragonroot 15 August 2018 в 20:25
поделиться
  • 1
    Хорошее решение! Однако для этого потребуется включить JavaScript в виджет WebView с помощью yourWebView.getSettings (). SetJavaScriptEnabled (true); – Markus Rudel 15 August 2012 в 15:56
  • 2
    Я думаю, что это должен быть лучший ответ. Поскольку вам действительно не нужно указывать URL-адрес на основе правильного лучшего ответа здесь. – Ryan 13 July 2017 в 00:48

Вы можете вызвать mWebView.reload (); Это то, что он делает

73
ответ дан Iharob Al Asimi 15 August 2018 в 20:25
поделиться
  • 1
    reload (), похоже, не работает, если исходный запрос был WebView.postUrl () – larham1 4 August 2012 в 01:50
  • 2
    @ larham1 вы правы, какой метод будет работать? – Rahul Matte 19 August 2015 в 09:58

Да по какой-то причине WebView.reload () вызывает сбой, если раньше он не загружался (что-то связано с тем, как он обрабатывает историю). Это код, который я использую для обновления моего веб-представления. Я сохраняю текущий url в self.url

  # 1: пауза и загрузка страницы self.timeout.pause () sleep (1) # 2: проверьте  интернет-соединение (действительно ленивый способ), а self.page (). networkAccessManager (). networkAccessible () == QNetworkAccessManager.NotAccessible: sleep (2) # 3: Повторите попытку, если self.url == self.page (). mainFrame (  ) .url (): self.page (). action (QWebPage.Reload) self.timeout.resume (60) else: self.page (). action (QWebPage.Stop) self.page (). mainFrame ().  load (self.url) self.timeout.resume (30) return False  
-3
ответ дан mAsT3RpEE 15 August 2018 в 20:25
поделиться

попробуйте это:

  mWebView.loadUrl (mWebView.getUrl (). toString ());   
2
ответ дан Oubaida AlQuraan 15 August 2018 в 20:25
поделиться

Это сработало для меня.

просто помещено в onCreate metode

  Кнопка Button = (кнопка) findViewById (R.id.reload_btn);  button.setOnClickListener (новый View.OnClickListener () {public void onClick (View v) {web.loadUrl ("javascript: window.location.reload (true)");}});   

Это код, который может перезагрузить веб-сайт в webView

  web.loadUrl ("javascript: window.location.reload (true)")  ;   
10
ответ дан Thor1401 15 August 2018 в 20:25
поделиться

Обновление текущего URL веб-просмотра не является обычным явлением. Я использовал это в таком сценарии: Когда пользователь переходит к другому действию, и пользователь возвращается к действию веб-просмотра, я перезагружаю текущий URL-адрес следующим образом:

  public class MyWebviewActivity extends Activity {WebView mWebView;  .... .... .... @Override public void onRestart () {String url = mWebView.getUrl ();  String postData = MyUtility.getOptionsDataForPOSTURL (mContext);  mWebView.postUrl (url, EncodingUtils.getBytes (postData, "BASE64"));  }}  

Вы также можете использовать функцию reload () WebView. Но учтите, что если вы загрузили webview с помощью postUrl () , то mWebView.reload (); не работает. Это также работает

  String webUrl = webView.getUrl ();  mWebView.loadUrl (webUrl);   
3
ответ дан trante 15 August 2018 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: