我希望我的大部分页面都保持静止,并且安卓键盘会在它们之上,所以在 AndroidManifest.xml 我有
android:windowSoftInputMode="adjustPan"
在一个特定的页面上,我希望键盘能够推送内容,由webview中的javascript / java桥接器触发,因此是JavaScriptFunctions类。吐司纯粹是文本界面正在工作(吐司确实出现)。从{i}内部的javascript调用pushKeyboard()
。
MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
.
.
public static Context cont;
protected void onCreate(Bundle savedInstanceState) {
.
.
webView.addJavascriptInterface(new JavaScriptFunctions(), "AndroidNative");
cont = MainActivity.this;
// this "works", but is useless because it changes the soft input for the whole application:
//getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
public class JavaScriptFunctions {
@JavascriptInterface
public void pushKeyboard() {
Toast.makeText(MainActivity.this, "Balls.", Toast.LENGTH_LONG).show();
// MainActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); // This gives error "can't reference non-static method from static context"
((Activity)getApplicationContext()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); // fails
// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); // fails
//((Activity)cont).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); // extreme failure
}
}
}
显示器显示此错误:
W / System.err:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
在onCreate()中,代码确实设置了软输入模式,但我无法在JavaScriptFunctions内部工作。我尝试了很多变体,包括在MainActivity中创建一个Context。 我如何使这个工作?
答案 0 :(得分:1)
侧咆哮 - public static Context cont; cont = MainActivity.this;
永远不要这样做。这是内存泄漏。如果需要全局上下文,请使用应用程序上下文并创建一个静态来保存应用程序上下文。不要持有对活动的静态引用。
至于你的错误 - 你需要从UI线程调用UI效果函数。如果你不能(由于从奇怪的地方通过JS调用)在主线程上调用pushKeyboard,然后将消息发布到处理程序并使UI影响那里的调用。
答案 1 :(得分:0)
在this answer的帮助下工作,我认为这正是Gabe所说的。欢迎提出任何意见或改进。
<强> MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
.
.
protected void onCreate(Bundle savedInstanceState) {
.
.
webView.addJavascriptInterface(new JavaScriptFunctions(), "AndroidNative");
}
public void resize() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
});
}
public class JavaScriptFunctions {
@JavascriptInterface
public void pushKeyboard() {
resize();
}
}
}