導航:首頁 > 操作系統 > androidselection

androidselection

發布時間:2022-08-16 03:48:27

android webView怎麼得到當前地址

獲取原始URL:webView.getOriginalUrl();
獲取當前URL:webView.getUrl();

如果訪問:http://.com
original是:http://.com
訪問成功後的地址可能根據地區或設備的不同而不一樣,這個新地址可通過getUrl()獲取!
webview 獲取 網頁的title

[java] view plain
WebView mWebView = (WebView) findViewById(R.id.mwebview);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
ExperimentingActivity.this.setTitle(view.getTitle());
}
});

getTitle
public String getTitle()

Get the title for the current page. This is the title of the current page until WebViewClient.onReceivedTitle is called.

返回:
The title for the current page.

下面這篇文章總結的比較全 ,但是 onReceivedTitle()方法在goback()之後無效。

如有轉載,請聲明出處: 時之沙: http://blog.csdn.net/t12x3456

Android WebView常見問題解決方案匯總:
就目前而言,如何應對版本的頻繁更新呢,又如何靈活多變地展示我們的界面呢,這又涉及到了web app與native app之間孰優孰劣的爭論. 於是乎,一種混合型的app誕生了,靈活多變的部分,如淘寶商城首頁的活動頁面,一集凡客誠品中我們都可以見到web 頁面與native頁面的混合,既利用了web app的靈活易更新,也藉助了native app本身的效率.
當然,就會用到webview這樣的一個控制項,這里,我把自己使用過程中遇到的一些問題整理下來.

首先上張圖對WebView進行一個基本的回顧:

以上思維導圖原文件下載地址:
http://download.csdn.net/detail/t12x3456/6509195

然後看一下具體的問題及解決方案:
1.為WebView自定義錯誤顯示界面:
覆寫WebViewClient中的onReceivedError()方法:
[java] view plain
/**
* 顯示自定義錯誤提示頁面,用一個View覆蓋在WebView
*/
protected void showErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent();

initErrorPage();
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
webParentView.addView(mErrorView, 0, lp);
mIsErrorPage = true;
}
protected void hideErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent();

mIsErrorPage = false;
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
}

protected void initErrorPage() {
if (mErrorView == null) {
mErrorView = View.inflate(this, R.layout.online_error, null);
Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mWebView.reload();
}
});
mErrorView.setOnClickListener(null);
}
}
[java] view plain

[java] view plain

[java] view plain
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>mErrorView.setVisibility(View.VISIBLE);
<span style="white-space:pre"> </span>super.onReceivedError(view, errorCode, description, failingUrl);
}

2.WebView cookies清理:
[java] view plain
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();

3.清理cache 和歷史記錄:

[java] view plain
webView.clearCache(true);
webView.clearHistory();

4.判斷WebView是否已經滾動到頁面底端:
[java] view plain
getScrollY()方法返回的是當前可見區域的頂端距整個頁面頂端的距離,也就是當前內容滾動的距離.
getHeight()或者getBottom()方法都返回當前WebView 這個容器的高度
getContentHeight 返回的是整個html 的高度,但並不等同於當前整個頁面的高度,因為WebView 有縮放功能, 所以當前整個頁面的高度實際上應該是原始html 的高度再乘上縮放比例. 因此,更正後的結果,准確的判斷方法應該是:
if(WebView.getContentHeight*WebView.getScale() == (webview.getHeight()+WebView.getScrollY())){ //已經處於底端 }

5.URL攔截:
android WebView是攔截不到頁面內的fragment跳轉的。但是url跳轉的話,又會引起頁面刷新,H5頁面的體驗又下降了。只能給WebView注入js方法了。

6.處理WebView中的非超鏈接請求(如Ajax請求):

有時候需要加上請求頭,但是非超鏈接的請求,沒有辦法再shouldOverrinding中攔截並用webView.loadUrl(String url,HashMap headers)方法添加請求頭
目前用了一個臨時的辦法解決:
首先需要在url中加特殊標記/協議, 如在onWebViewResource方法中攔截對應的請求,然後將要添加的請求頭,以get形式拼接到url末尾

在shouldInterceptRequest()方法中,可以攔截到所有的網頁中資源請求,比如載入JS,圖片以及Ajax請求等等

Ex:
[java] view plain
@SuppressLint("NewApi")
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
// 非超鏈接(如Ajax)請求無法直接添加請求頭,現拼接到url末尾,這里拼接一個imei作為示例

String ajaxUrl = url;
// 如標識:req=ajax
if (url.contains("req=ajax")) {
ajaxUrl += "&imei=" + imei;
}

return super.shouldInterceptRequest(view, ajaxUrl);

}

7.在頁面中先顯示圖片:

[java] view plain
@Override
public void onLoadResource(WebView view, String url) {
mEventListener.onWebViewEvent(CustomWebView.this, OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url);
if (url.indexOf(".jpg") > 0) {
hideProgress(); //請求圖片時即顯示頁面
mEventListener.onWebViewEvent(CustomWebView.this, OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl());
}
super.onLoadResource(view, url);
}

8.屏蔽掉長按事件 因為webview長按時將會調用系統的復制控制項:

[java] view plain
mWebView.setOnLongClickListener(new OnLongClickListener() {

@Override
public boolean onLongClick(View v) {
return true;
}
});

9.在WebView加入 flash支持:
[java] view plain
String temp = "<html><body bgcolor=\"" + "black"
+ "\"> <br/><embed src=\"" + url + "\" width=\"" + "100%"
+ "\" height=\"" + "90%" + "\" scale=\"" + "noscale"
+ "\" type=\"" + "application/x-shockwave-flash"
+ "\"> </embed></body></html>";
String mimeType = "text/html";
String encoding = "utf-8";
web.loadDataWithBaseURL("null", temp, mimeType, encoding, "");

10.WebView保留縮放功能但隱藏縮放控制項:

[java] view plain
mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);
if (DeviceUtils.hasHoneycomb())
mWebView.getSettings().setDisplayZoomControls(false);

注意:setDisplayZoomControls是在Android 3.0中新增的API.

這些是目前我整理出來的一些注意事項和問題解決方案,也歡迎大家多提一些關於webview的問題,如果有合適的解決方案,我會直接更新到這篇文章.

8月份更新:
11.WebView 在Android4.4的手機上onPageFinished()回調會多調用一次(具體原因待追查)
需要盡量避免在onPageFinished()中做業務操作,否則會導致重復調用,還有可能會引起邏輯上的錯誤.

12.需要通過獲取Web頁中的title用來設置自己界面中的title及相關問題:
需要給WebView設置 WebChromeClient,並在onReceiveTitle()回調中獲取

[java] view plain
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);

txtTitle.setText(title);
}

};

但是發現在小米3的手機上,當通過webview.goBack()回退的時候,並沒有觸發onReceiveTitle(),這樣會導致標題仍然是之前子頁面的標題,沒有切換回來. 這里可以用我上邊說的那個方法 。

這里可以分兩種情況去處理:
(1) 可以確定webview中子頁面只有二級頁面,沒有更深的層次,這里只需要判斷當前頁面是否為初始的主頁面,可以goBack的話,只要將標題設置回來即可.
(2)webview中可能有多級頁面或者以後可能增加多級頁面,這種情況處理起來要復雜一些:
因為正常順序載入的情況onReceiveTitle是一定會觸發的,所以就需要自己來維護webview loading的一個url棧及url與title的映射關系
那麼就需要一個ArrayList來保持載入過的url,一個HashMap保存url及對應的title.
正常順序載入時,將url和對應的title保存起來,webview回退時,移除當前url並取出將要回退到的web 頁的url,找到對應的title進行設置即可.

這里還要說一點,當載入出錯的時候,比如無網路,這時onReceiveTitle中獲取的標題為 找不到該網頁,因此建議當觸發onReceiveError時,不要使用獲取到的title.

13.WebView因addJavaScriptInterface()引起的安全問題.
這個問題主要是因為會有惡意的js代碼注入,尤其是在已經獲取root許可權的手機上,一些惡意程序可能會利用該漏洞安裝或者卸載應用.
關於詳細的情況可以參考下面這篇文章:
.http://blog.csdn.net/leehong2005/article/details/11808557

還有一個開源項目可以參考: https://github.com/pedant/safe-java-js-webview-bridge, 該項目利用onJsPrompt() 替代了addJavaScriptInterface(),(解決方案類似上述參考的博客)同時增加了非同步回調,
很好地解決了webview js注入的安全問題.

10月份更新:

14.WebView頁面中播放了音頻,退出Activity後音頻仍然在播放
需要在Activity的onDestory()中調用

[java] view plain
webView.destroy();

但是直接調用可能會引起如下錯誤:

[java] view plain
10-10 15:01:11.402: E/ViewRootImpl(7502): sendUserActionEvent() mView == null
10-10 15:01:26.818: E/webview(7502): java.lang.Throwable: Error: WebView.destroy() called while still attached!
10-10 15:01:26.818: E/webview(7502): at android.webkit.WebViewClassic.destroy(WebViewClassic.java:4142)
10-10 15:01:26.818: E/webview(7502): at android.webkit.WebView.destroy(WebView.java:707)
10-10 15:01:26.818: E/webview(7502): at com.didi.taxi.ui.webview.OperatingWebViewActivity.onDestroy(OperatingWebViewActivity.java:236)
10-10 15:01:26.818: E/webview(7502): at android.app.Activity.performDestroy(Activity.java:5543)
10-10 15:01:26.818: E/webview(7502): at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1134)
10-10 15:01:26.818: E/webview(7502): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3619)
10-10 15:01:26.818: E/webview(7502): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3654)
10-10 15:01:26.818: E/webview(7502): at android.app.ActivityThread.access$1300(ActivityThread.java:159)
10-10 15:01:26.818: E/webview(7502): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)
10-10 15:01:26.818: E/webview(7502): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 15:01:26.818: E/webview(7502): at android.os.Looper.loop(Looper.java:137)
10-10 15:01:26.818: E/webview(7502): at android.app.ActivityThread.main(ActivityThread.java:5419)
10-10 15:01:26.818: E/webview(7502): at java.lang.reflect.Method.invokeNative(Native Method)
10-10 15:01:26.818: E/webview(7502): at java.lang.reflect.Method.invoke(Method.java:525)
10-10 15:01:26.818: E/webview(7502): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
10-10 15:01:26.818: E/webview(7502): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
10-10 15:01:26.818: E/webview(7502): at dalvik.system.NativeStart.main(Native Method)

如上所示,webview調用destory時,webview仍綁定在Activity上.這是由於自定義webview構建時傳入了該Activity的context對象,因此需要先從父容器中移除webview,然後再銷毀webview:

[java] view plain
rootLayout.removeView(webView);
webView.destroy();

15. WebView長按自定義菜單,實現復制分享相關功能
這個功能首先可以從兩方面完成:
(1) 在js中完成:
處理android.selection.longTouch
這里推薦一個開源項目進行參考,:
https://github.com/btate/BTAndroidWebViewSelection

(2) 安卓層處理:
首先使用OnTouchListener實現長按實現監聽,然後實現WebView的Context menu,最後調用webview中的emulateShiftHeld(),為了適配安卓不同版本,最好使用反射方式調用.

⑵ android GridView.requestFocusFromTouch()後為什麼setSelection就不好使呢 總是選中第一條, 為什麼

setSelection是設置選擇項,而requestFocusFromTouch等於是模擬了一個touch事件,點擊了girdview,而默認點擊的地方就是第一條,點擊了第一條,焦點以及selection都到第一條了,所以setSelection就沒反應了。

⑶ Android studio怎麼設置代碼橫向選擇和豎向選擇

1、在Android studio進行選擇進行選擇的代碼的文件,並進行打開。

2、在編輯器的代碼中選擇列的的內容之後,可是在選擇列的內容時候,會把行的內容全部選中。

3、在進行點擊Android studio菜單中的「edit」的選項菜單中。

4、進行點擊完edit的選項菜單中之後,就會彈出了一個下拉菜單中進行選擇「column
selection mode」的選項。

5、這樣的話,就可以在Android studio的底部的位置,可以看到的是已經變為了column的模式。

6、在次在列表中選擇列表中內容,可以看到了行的內容沒有全部選擇進入,說明選擇縱向模式設置成功。

⑷ android 怎麼做多表聯查

String [] projection= new String[]{
Phones._ID,
Phones.TYPE,韓國女裝
Phones.NUMBER,
"(SELECT NAME FROM PEOPLE AS people WHERE PEOPLE._id =PERSON) AS peopleName",
// new StringBuilder().append("(SELECT NAME FROM PEOPLE AS people WHERE PEOPLE._id =").append(Phones.PERSON_ID)
// .append(") AS peopleName").toString(),
"(SELECT DATA FROM PHOTOS AS PHOTOS WHERE PHOTOS.PERSON =PERSON) AS peopleLogo",
// new StringBuilder().append("(SELECT DATA FROM PHOTOS AS PHOTOS WHERE PHOTOS.PERSON =").append(Phones.PERSON_ID)
// .append(") AS peopleLogo").toString()
}; android 軟體鍵盤 實現 -- 斷點記錄
String selection = "0==0) GROUP BY (PERSON";
Cursor cursor = context.getContentResolver().query(Phones.CONTENT_URI, projection, selection, null, null);
while(cursor.moveToNext()){
System.out.println(cursor.getString(cursor.getColumnIndex(Phones.NUMBER)));
System.out.println(cursor.getString(cursor.getColumnIndex("peopleName")));
}

⑸ android Listview第一個行默認為選中狀態,怎麼實現按下某一行在沒松開時設置其為選中行,選中行為藍色

1. 你從 A跳轉到B的時候 通過 INTENT 傳一個值 intent.putStringExtart("selection", 4);
2. 然後在B接受這個值: int selection = getExtart().getIntExtart("selection");
3. 然後設置ListView 選擇這個 selection: myListView.setselection(selection);

就OK了

----------- 補充:
剛看太快看錯了, 如果是想選中ListView 某一個 TEXTVIEW, 需要這樣:

ViewGroupitem=(ViewGroup)mAdapter.getChild(selection);
TextViewtextView=item.findviewById(R.id.textView1);
textview.requestFocus();

前提是要設置這個 textview 的 focusable=true, 還有 focusableInTouchmode = true

⑹ Android studio怎麼使用列選擇模式

參考如下內容
在Android studio進行選擇進行選擇的代碼的文件,並進行打開。

在編輯器的代碼中選擇列的的內容之後,可是在選擇列的內容時候,會把行的內容全部選中。

在進行點擊Android studio菜單中的「edit」的選項菜單中。

進行點擊完edit的選項菜單中之後,就會彈出了一個下拉菜單中進行選擇「column selection mode」的選項。

這樣的話,就可以在Android studio的底部的位置,可以看到的是已經變為了column的模式。

在次在列表中選擇列表中內容,可以看到了行的內容沒有全部選擇進入,說明選擇縱向模式設置成功。

本回答由網友推薦

⑺ android listView中textView設置選中效果(A跳到B畫面)

1. 你從 A跳轉到B的時候 通過 INTENT 傳一個值 intent.putStringExtart("selection", 4);
2. 然後在B接受這個值: int selection = getExtart().getIntExtart("selection");
3. 然後設置ListView 選擇這個 selection: myListView.setselection(selection);

就OK了

----------- 補充:
剛看太快看錯了, 如果是想選中ListView 某一個 TEXTVIEW, 需要這樣:

ViewGroup item = (ViewGroup)mAdapter.getChild(selection);
TextView textView = item.findviewById(R.id.textView1);

textview.requestFocus();

前提是要設置這個 textview 的 focusable=true, 還有 focusableInTouchmode = true

⑻ android如何獲取有圖片的文件夾列表

用下面這種方式能實現查詢實現查詢sd卡某一個子目錄下的圖片文件詳細信息 :

//selection: 指定查詢條件
String selection = MediaStore.Images.Media.DATA + " like %?";
//設定查詢目錄
String path="/mnt/sdcard/youpicpath";
//定義selectionArgs:
String[] selectionArgs = {path+"%"};
c = this.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null,
selection, selectionArgs, null);

其實原理就是改變了下查詢語句,在查詢條件中增加了MediaStore.Images.Media.DATA欄位的限制條件,必須是和指定目錄能匹配的才被查詢,注意selection和selectionArgs參數是配合使用的。

⑼ Android 中資料庫查詢方法query() 中的selectionArgs 參數只能在編譯之前確定,這怎麼實現動態查詢

網上找來的
Android 中涉及資料庫查詢的地方一般都會有一個 query() 方法,而這些 query 中有大都(全部?)會有一個參數 selectionArgs,比如下面這個 android.database.sqlite.SQLiteDatabase.query():
view plain to clipboardprint?
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
    selection 參數很好理解,就是 SQL 語句中 WHERE 後面的部分,即過濾條件, 比如可以為 id=3 AND name='Kevin Yuan' 表示只返回滿足 id 為 3 且 name 為 "Kevin Yuan" 的記錄。
    再實際項目中像上面那樣簡單的「靜態」的 selection 並不多見,更多的情況下要在運行時動態生成這個字元串,比如
view plain to clipboardprint?
public doQuery(long id, final String name) { 
  mDb.query("some_table", // table name 
        null, // columns 
        "id=" id " AND name='" name "'", // selection 
        //...... 更多參數省略 
  ); 
}
public doQuery(long id, final String name) {
  mDb.query("some_table", // table name
        null, // columns
        "id=" id " AND name='" name "'", // selection
        //...... 更多參數省略
  );
}
在這種情況下就要考慮一個字元轉義的問題,比如如果在上面代碼中傳進來的 name 參數的內容裡面有單引號('),就會引發一個 "SQLiteException syntax error .... "。
    手工處理轉義的話,也不麻煩,就是 String.replace() 調用而已。但是 Android SDK 為我們准備了 selectionArgs 來專門處理這種問題:
view plain to clipboardprint?
public void doQuery(long id, final String name) { 
  mDb.query("some_table", // table name 
        null, // columns 
        "id=" id " AND name=?", // selection 
        new String[] {name}, //selectionArgs 
        //...... 更多參數省略 
  ); 
  // ...... 更多代碼 
}
public void doQuery(long id, final String name) {
  mDb.query("some_table", // table name
        null, // columns
        "id=" id " AND name=?", // selection
        new String[] {name}, //selectionArgs
        //...... 更多參數省略
  );
  // ...... 更多代碼
}
也就是說我們在 selection 中需要嵌入字元串的地方用 ? 代替,然後在 selectionArgs 中依次提供各個用於替換的值就可以了。在 query() 執行時會對 selectionArgs 中的字元串正確轉義並替換到對應的 ? 處以構成完整的 selection 字元串。 有點像 String.format()。
    不過需要注意的是 ? 並不是「萬金油」,只能用在原本應該是字元串出現的地方。比如下面的用法是錯誤的:
view plain to clipboardprint?
public void doQuery(long id, final String name) { 
  mDb.query("some_table", // table name 
        null, // columns 
        "? = " id " AND name=?", // selection XXXX 錯誤!? 不能用來替換欄位名 
        new String[]{"id", name}, //selectionArgs 
      //...... 更多參數省略 
  ); 
  // ...... 更多代碼 
}

閱讀全文

與androidselection相關的資料

熱點內容
程序員神經 瀏覽:752
dns伺服器在電腦上有什麼用 瀏覽:915
杭州大媽喜歡程序員 瀏覽:686
python評論樹講解 瀏覽:679
juniper防火牆常用命令 瀏覽:426
vapp怎麼下載地址 瀏覽:11
pdf裡面內容怎麼修改 瀏覽:807
收藏網址加密的瀏覽器 瀏覽:1000
phpurl問號 瀏覽:898
什麼筆記本電腦可以用python 瀏覽:135
加密相冊如何翻找 瀏覽:992
泰州地區DNS伺服器地址 瀏覽:849
一種app可以買菜用英語怎麼說 瀏覽:196
中國聯通app裡面通話詳單怎麼刪除 瀏覽:505
計算機網路編譯軟體 瀏覽:100
程序員說不能說的秘密 瀏覽:700
在線shell編譯器 瀏覽:103
為什麼王者榮耀安卓轉蘋果成功登不上去 瀏覽:710
文件加密演算法可行性報告 瀏覽:60
a3雙面列印pdf 瀏覽:270