Как показать экранную клавиатуру на 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
            }
        });
    }

    ...
}

0 ответов

Другие вопросы по тегам