顯示具有 實際案例 標籤的文章。 顯示所有文章
顯示具有 實際案例 標籤的文章。 顯示所有文章

2018年12月6日 星期四

【Android】如何讓WebView大小自動擴展為內容的大小

WebViewClient的「onPageFinished」被呼叫執行時,就表示網頁已經有一個初步的大小可供計算。但從Java端並無法去取得這個到小,只有網頁本身可以知道自己的大小,所以我們必須要使用JavaScriptInterface去取得這個大小。

在「onPgaeFinished」內執行一段JavaScript:「"javascript:MyApp.resize(document.body.getBoundingClientRect().height)"」,功能大概是說「執行resize這個函數,並將網頁body的高度傳入。」

所以接著要設計一個名稱為「resize」的函數並掛上「@JavascriptInterface」。

函數的內容基本上是重新設定整個WebView的LayoutParams,尤其是寬高。

高度的算法大概是「height * getResources().getDisplayMetrics().density」,「height」大概就是在JavaScript中傳入「resize」函數的數值。因為網頁有自己的高度單位,所以要換算成density才能取得正確大小。


注意!要記得執行addJavascriptInterface這個功能。這是讓網頁內容可以取得加註了「@JavascriptInterface」函數的必要辦法。(記得「javascript」中的「MyApp」和這裡的「MyApp」是連動的,如果要修改或自訂,記得一起完成。)


以下是更完整的程式碼。
private void setupWebView() {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            webView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)");
            super.onPageFinished(view, url);
        }
    });
    webView.addJavascriptInterface(this, "MyApp");
}

@JavascriptInterface
public void resize(final float height) {
    MyActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            webView.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
        }
    });
}

2018年7月23日 星期一

【Android】尋找特定View在ScrollView中的位置並滾動到定位

ScrollView中必須要再包一個「ViewGroup」才有辦法再放入其他View。(它只能容納一個ChildView。)

所以「(特定View)在ScrollView中的位置」其實是「(特定View)在此ViewGroup中的位置」。

但一般尋找「View在螢幕中絕對座標」的辦法無法用在此處。

以縱軸座標的ScrollView來說,「位置」其實是指「這個View距離ViewGroup上方邊界的距離」。

所以要使用View中的功能:getTop(),來取得.......

但這個功能取得的是View跟最接近的ViewGroup的距離。也就是說如果ScrollView和View之間不只一層ViewGroup,而是有多層ViewGroup,(為了做出複雜的版型,)那就必須要用一個迴圈將它們的「getTop()」通通取出來作加總...

舉例.....

假設ScrollView和View之間有ViewGroup(0)、ViewGroup(1)、ViewGroup(2)、ViewGroup(3),最後才是View,....如果已經可以清楚知道ViewGroup的數目,那就好辦,但如果不知道...

要從View取ParentView,(這東西可以直接轉型成「View類別」,)然後再從ParentView取ParentView...直到取出來的ParentView是ScrollView為止。

每次的getTop記得都要累加起來,得到的數值才是畫面上、視覺上,這個View在ScrollView中的位置。

2017年11月29日 星期三

【XAMPP】修改正式網站的首頁,或新增服務 (Windows環境)

1.怎麼將Tomcat下的Java專案新增到Apache中讓外部的網址可以找到它。
2.怎麼修改XAMPP的預設首頁服務。



XAMPP是一套軟體,可以幫助下載的人快速安裝好Apache+MySQL+Tomcat。同時MySQL還附帶phpMyAdmin這套視覺化的管理工具。

問題是XAMPP是預設給PHP設計族群使用的工具,裏頭的Tomcat也是「預設」執行PHP,這並不是什麼「問題」,但這導致在網路上關於它的資訊或討論就很少是針對Java族群。



以單純的在Apache上新增一個PHP Service來說,只要把整個PHP專案資料夾複製到XAMPP下的「htdocs」資料夾即可。(注意!為什麼Apache會自動去htdocs下找網站首頁?這也是個「學問」。)

雖然Java專案一樣只要把專案複製到Tomcat的webapps下,重新啟動的時候Tomcat就會自動執行這個專案,但用瀏覽器時只有在「http://localhost/」下才可以找到這個專案,用IP或外部網址其實找不到。

因為在Apache和Tomcat之間是用一種叫做AJP的方式溝通......完全不知道這是什麼,只知道AJP有兩大系列(是不是只有這兩種?我不肯定!):mod_jk和mod_proxy_ajp。

一個標準的Apache其實並不包含這些模組,必須要自己去下載模組後安裝(其實只是把檔案複製貼上)到Apache中,並且寫「一卡車」的AJP設定檔,並且在設定檔中寫明了「Apache要怎麼去Tomcat中找到專案」。──XAMPP的好處就是幫使用者省去了這個步驟。(否則安裝Apache並不難。)

接著我們只需要搞懂XAMPP使用的是哪種版本的AJP協定。最標準的作法是到Apache下的module資料夾去找,這兩個模組其實就是檔案名稱,有模組的檔案名稱就表示這個Apache使用了哪一個模組。

(講精準一點來說,我這是預設安裝並架設Apache+Tomcat環境的老兄不會很多事的下載兩套版本的檔案,如果他真的這樣做了,那就只能從設定檔去看他幫Apache選擇使用了哪套,如果他又很多事的兩套都寫了AJP設定檔,那就只能去找看看Apache內部的設定檔「httpd.conf」中指示了會載入哪一套協定。)

XAMPP使用的是mod_proxy_ajp。(如果要尋找額外的資源,可以用這個方式更精準地找到資訊。)



「Localhost」在Server上(疑似)為「127.0.0.1」這個IP的默認。所以要將Tomcat中的Java專案新增到Apache中,必須要用「http://127.0.0.1/[專案名稱]」這樣的方式寫入設定檔。

(XAMPP中)設定檔名稱為「httpd_ajp.conf」。

設定檔的寫法是...

「ProxyPass "/[專案名稱]" "http://127.0.0.1/[專案名稱]"」和「ProxyPassReverse "/[專案名稱]" "http://127.0.0.1/[專案名稱]"」。──1.新增完建議重開Apache。2.「ProxyPassReverse」似乎可以不用加。


完成以上步驟只是讓Apache可以搜尋到Tomcat中的Java專案。

接著到htdoc中找到「index.php」,把裡面的「header('Location: '.$uri.'/dashboard/');」這段程式碼的「dashboard」改成專案名稱,接著應該就可以順利在首頁找到預期看到的專案了。

2017年9月20日 星期三

中國大陸的長城擋連線,無法分享檔案

如標題。

大陸內的硬碟空間(微信、百度、QQ)註冊非常繁瑣,都要有個手機門號才能使用,而國外國際間慣用的網路空間幾個有名的大站都被一律封鎖。

如果要知道國外空間能否讓大陸內部取得,可以使用測試網站看看能否連線.......


這次使用的是WEBKAKA....


 這是它的首頁...選擇「國內網站測速」。


選好了往下滑,可以看到這個頁面,右邊的輸入欄就是用來要測速/可否連線的網址輸入欄。




可以看到OpenDrive網站可以連通。