Android在onCreate()外面用javascript / java bridge设置软输入模式

时间:2016-12-01 16:56:44

标签: java android android-studio

我希望我的大部分页面都保持静止,并且安卓键盘会在它们之上,所以在 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。 我如何使这个工作?

2 个答案:

答案 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();
        }
    }
}