Как показать экранную клавиатуру на Android из класса вне MainActivity?
В настоящее время я работаю над проектом OpenGL ES на android, и в какой-то момент в моей программе я хочу использовать клавиатуру для получения некоторого ввода. Я использую GLSurfaceView.Renderer в качестве игрового цикла, и я хочу иметь возможность отображать и скрывать клавиатуру внутри этого класса, чтобы ее не нужно было всегда активировать или всегда скрывать, но если я попытаюсь показать клавиатура из этого класса, а не из моей основной деятельности я получаю ошибку.
android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.
Для активации клавиатуры я использую линию
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
или же
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
спрятать клавиатуру
Итак, мой вопрос: как активировать клавиатуру из класса, отличного от основного занятия? Должен ли я использовать другой метод, чтобы показать и скрыть клавиатуру?
РЕДАКТИРОВАТЬ:
Поэтому я попробовал предложение Марка Кина и больше не получаю сообщение об ошибке, но когда я пытаюсь скрыть клавиатуру от своего рендерера, она не работает, даже если я использую ту же самую строку кода в реальном классе Activity, она работает. Я также уверен, что он вводит метод showKeyboard() в Activity, потому что я вижу форму Log как в то время, когда активность показывает клавиатуру, так и в тот момент, когда Renderer скрывает ее.
Основной код деятельности:
... //Imports
public class LaunchActivity extends Activity {
private Surface surface;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
surface = new Surface(this);
surface.setEGLContextClientVersion(2);
surface.setRenderer(new Main(surface.getResources(), this, this));
surface.setPreserveEGLContextOnPause(true);
showKeyboard(); //This works
setContentView(surface);
}
... //Other methods
public void showKeyboard() {
Log.e("Map", "Visible");
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
public void hideKeyboard() {
Log.e("Map", "Hidden");
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
}
Код рендерера:
... //Imports
public class Main implements GLSurfaceView.Renderer {
... //Other variables
public static LaunchActivity activity;
... //Other variables
public Main(Resources resources, Context context, LaunchActivity activity) {
... //Other initialization
handler = new Handler(Looper.getMainLooper());
... //Other initialization
}
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
...
hideKeyboard(); //This does not work
}
... //Other methods
public static void showKeyboard() { //This does not work
handler.post(new Runnable() {
public void run() {
activity.showKeyboard(); //This does not work
}
});
}
public static void hideKeyboard() { //This does not work
handler.post(new Runnable() {
public void run() {
activity.hideKeyboard(); //This does not work
}
});
}
...
}