Sadece dinamik olarak oluşturulmuş bazı HTML'leri (Javascript'i çalıştırabilir) görüntülemek için kullanılan, görünür bir WebView
bileşenine sahip bir uygulamam var. WebView
için etkinleştirildi. Sayfa yükleme bittikten sonra giriş metin kutularından birine odağını ayarlamak çalışıyorum birkaç sayfaları içinAndroid WebView - HTML Alanını Ayarlama Javascript kullanarak ayarlama
- değil Gövde onLoad()
yoluyla, ancak bunun yerine sayfa bittikten sonra JS çağrısı yükleme yani içinde tarafından onPageFinished()
. javascript çoğu
webview.loadURL("javascript:JSMethod();");
ince yürütür Ama yapmam gereken aynı çağrıyı kullandığınızda bir document.getElementById('text1').focus()
- imleç elemanı ulaşmak yok ama Soft Keyboard
dışarı pop olmaz. Sayfadaki bir düğmeden yürütüldüğünde aynı javascript kodu istenen etkiye sahiptir. text1 imleci koyun ve SoftKeyboard açılır -
Ben 3 düğmelerini
Focus Text1
sahiptir kaynak kodu ekleme.Java Focus Text1
- Aynı JS'yi yürütmek için Java'yı çağırır. Sadece imleci orada gösterir ve klavyenin dışına çıkmazJava Focus Text1 And Keyboard Open
- Java ve Forces Keyboard'dan JS'yi açar.
Anladığım kadarıyla, JS yürütme işlemi, tarayıcıdan bir düğme/olay kullanarak veya Java'dan WebView.loadURL()
aracılığıyla gönderilip gerçekleştirilmediyse, aynı şekilde çalışmalıdır.
İşte Button#2
kullanırken
- bir şey eksik benim Sorguları var? İşte bu benim geçerli kodumdur ve sadece imlecin ayarlandığını görüyorum ancak SoftKeyboard açılmıyor.
- Mantığı
Button#3
'da yazıldığı gibi kullandığımda, bazen imleci alan üzerinde görmüyorum, ancak bana istenen etkiyi veriyor ve açılır klavyede bir şey yazdığımda imleç görünür hale geliyor. Button#2
'da gördüğüm davranış Android JS uygulamasında bir hata olabilir mi? Ya daWebView
'un odağı olmaması sadece imlecin görüntülenmesinin nedeni olabilir mi? Ben dewebview.requestFocus()
denedim -requestFocusOnTouch()
yazamıyorum çünkü sahip olduğum tek Görünüm ve otomatik olarak odaklanmasını bekliyorum.
davranışı tanıtıyor Java kodu
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class WebViewProjectTestJSHTMLFocusActivity extends Activity {
Activity _current = null;
WebView wv = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_current = this;
//setContentView(R.layout.main);
String data = "<html><body>" +
"<script>function focusser() { document.getElementById(\"text1\").focus(); } </script>" +
"<script>function javaFocusser() { javautil.javaFocus(false); } </script>" +
"<script>function javaFocusserKeyboard() { javautil.javaFocus(true); } </script>" +
"Text 1<input type='text' id='text1'/><br/>" +
"Text 2<input type='text' id='text2'/><br/>" +
"<input type='button' value='Focus Text1' onClick='focusser()'/>" +
"<input type='button' value='Java Focus Text1' onClick='javaFocusser()'/>" +
"<input type='button' value='Java Focus Text1 And Keyboard Open' onClick='javaFocusserKeyboard()'/>" +
"</body></html>";
wv = new WebView(this);
wv.getSettings().setJavaScriptEnabled(true);
// Set some HTML
wv.loadDataWithBaseURL("file:///android_asset/", data, "text/html", "UTF-8", null);
// Call back required after page load finished
wv.setWebViewClient(new CustomWebViewClient());
// Enable Alert calls
wv.setWebChromeClient(new CustomWebChromeClient());
// For JS->Java calls
wv.addJavascriptInterface(this, "javautil");
setContentView(wv);
}
/**
* Calls the same javascript and forces the keyboard to open
*/
public void javaFocus(final boolean shouldForceOpenKeyboard) {
Thread t = new Thread("Java focusser thread") {
public void run() {
wv.loadUrl("javascript:focusser();");
if(shouldForceOpenKeyboard) {
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT);
}
}
};
// Run on the View Thread.
_current.runOnUiThread(t);
}
/**
* Calls focus method after the page load is complete.
*/
final class CustomWebViewClient
extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
// javaFocus(true);
Log.d("TestExamples", "focusser call complete");
}
}
final class CustomWebChromeClient
extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("TestExamples", "JS Alert :: " + message);
return false;
}
}
}
Çözüm Güncelleme 24-06-2011 sadece gerçek JS odak çağrısından önce wv.requestFocus(View.FOCUS_DOWN)
kullanmak gerekir, bu işi yapmak için olduğunu. Yukarıdaki javaFocus()
yöntemini aşağıdaki doğru sürüme geçirdim. Daha önce, requestFocus() kullandığımı belirttiğimde, WebView
onCreate()
yönteminde başlatıldığında bunu kullanıyordum. Birincil fark şu anda Javascript document.getElementById("text1").focus();
yürütülmeden önce her defasında odaklanmak için WebView
'u zorluyoruz.Ayrıca
public void javaFocus(final boolean shouldForceOpenKeyboard) {
Thread t = new Thread("Java focusser thread") {
public void run() {
wv.requestFocus(View.FOCUS_DOWN);
wv.loadUrl("javascript:focusser();");
if(shouldForceOpenKeyboard) {
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(wv, InputMethodManager.SHOW_IMPLICIT);
}
}
};
// Run on the View Thread.
_current.runOnUiThread(t);
}
bu konu, ben Görüntülenen WebView'da 5 saniye sonra javaFocus() başlatmak için bir arka plan iş parçacığı kullanıyorum dokunma vb yoluyla tetiklenen çünkü odak sabit değildi emin olmak için. Değiştirilen onCreate()
aşağıda. ..... More onCreate code before....
// Enable Alert calls
wv.setWebChromeClient(new CustomWebChromeClient());
// For JS->Java calls
wv.addJavascriptInterface(this, "javautil");
setContentView(wv);
new Thread("After sometime Focus") {
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
javaFocus(true);
}
}.start();
.... onCreate() ends after this....
Ayrıntılı açıklama için teşekkürler. Aynı problem vardı ama bu çözüm benim için Android 3.2'de çalışmadı. Sonunda, sahada gerçek bir dokunuşu simüle eden bir işlev yazmak zorunda kaldım. Çözümün neden işe yaramadığını anlamıyorum. WebView sadece tuhaflarla dolu. – Pre101
Bu kodu Android 3.x/4.x'te test etmedim. Ama bu örnek programı her ikisinde de çalıştırmayı denediniz mi? – Swaroop
Bir tür = sayı girdisinin aslında sayısal bir klavye aldığından emin olmak için bu yaklaşımı kullanıp kullanamayacağınızı bilmek isterim. Elde ettiğim kadarıyla, InputMethodManager sadece standart klavye düzenini (Qwerty) açabiliyor, çünkü hangi HTML elemanının odağı olduğunu bilmiyor. Wv.requestFocus kullanımı yardımcı olmadı. – Wytze