java - Android 在 onCreate() 之外使用 javascript/java 桥设置软输入模式

标签 java android android-studio

我希望我的大部分页面保持静止,并且 Android 键盘位于它们之上,因此在 AndroidManifest.xml 中我有

android:windowSoftInputMode="adjustPan"

在一个特定页面上,我希望键盘上推内容,由 Web View 中的 javascript/java 桥触发,因此是 JavaScriptFunctions 类。 Toast 纯粹是为了显示界面正在工作的文本(Toast 确实出现)。 pushKeyboard() 从 webview 内的 javascript 调用。

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: 只有创建 View 层次结构的原始线程才能触摸其 View 。

在 onCreate() 内部,代码确实设置了软输入模式,但我无法让它在 JavaScriptFunctions 内部工作。我尝试了很多变体,包括在 MainActivity 中创建上下文。 我该如何让它工作?

最佳答案

旁白-public static Context cont; cont = MainActivity.this; 切勿这样做。这是内存泄漏。如果您需要全局上下文,请使用应用程序上下文并创建一个静态来保存应用程序上下文。不要保存对 Activity 的静态引用。

至于您的错误 - 您需要从 UI 线程调用 UI 影响函数。如果您无法(由于通过 JS 从某个奇怪的地方调用)在主线程上调用 PushKeyboard,则向处理程序发布一条消息,并使 UI 在那里影响调用。

关于java - Android 在 onCreate() 之外使用 javascript/java 桥设置软输入模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916232/

相关文章:

android - 如何在android studio中打补丁?

android-studio - 在 Android Studio 4.0 中找不到 "extract string resource"选项

java - 将 OpenJDK 与 install4j 安装程序捆绑在一起

java - Java Primitive 的父类(super class)(或)类定义?

java - 互相关 : Android AudioRecord create sample data for TDoA

java - 在 Glassfish 中将 JDBC 资源配置到连接池

android - Smali .local 格式

android - 无法将 ffmpeg 集成为 Android NDK 项目的 native 依赖项

android - 除了使用 isPressed() 方法还有其他方法吗?

android - 在 Android Tv 中,如何实现图标始终可见的标题(抽屉导航)