Как libgdx обнаруживает присутствие клавиатуры
Когда я пишу в текстовом поле, мне нужно, чтобы мое текстовое поле двигалось вверх, чтобы текстовое поле было видно, когда клавиатура всплывает.
Есть ли в libgdx какой-то метод, который возвращает true, если клавиатура видна, и false, когда она не работает?
3 ответа
Следующий код обнаружит, когда вы нажимаете текстовое поле, предотвращаете отображение клавиатуры, а затем открываете собственный диалог, который перемещается вверх и вниз с помощью клавиатуры. Он возьмет ввод из собственного диалогового окна и, наконец, вернет его обратно в текстовое поле:
textField.setOnscreenKeyboard(new TextField.OnscreenKeyboard() {
@Override
public void show(boolean visible) {
//Gdx.input.setOnscreenKeyboardVisible(true);
Gdx.input.getTextInput(new Input.TextInputListener() {
@Override
public void input(String text) {
textField.setText(text);
}
@Override
public void canceled() {
System.out.println("Cancelled.");
}
}, "Title", "Default text...");
}
});
Удачи!
Я знаю, что отвечаю на старую ветку, но я пытался найти ответ на этот вопрос, но нигде не мог его найти. Теперь я создал решение сам. Вот как это сделать на Android элегантным способом:) Я создаю ApplicationBundle для объединения интерфейсов, чтобы добавить специфичные для платформы вещи. Вы можете сделать это и на iOS, если хотите использовать RoboVM.
Мое решение:
создайте интерфейс SizeChangeListener в основном проекте:
public interface SizeChangeListener {
public void onSizeChange(float width, float height);
}
создайте интерфейс View в основном проекте:
public interface View {
public void onSizeChange(float width, float height);
public void addListener(SizeChangeListener sizeChangeListener);
public float getWidth();
public float getHeight();
}
создайте AndroidView, реализующий интерфейс View:
public class AndroidView implements View {
private ArrayList<SizeChangeListener> listeners = new ArrayList<SizeChangeListener>();
private float width, height;
public AndroidView(int width, int height) {
this.width = width;
this.height = height;
}
public void addListener(SizeChangeListener listener) {
listeners.add(listener);
}
public void onSizeChange(float width, float height) {
this.width = width;
this.height = height;
for(SizeChangeListener listener : listeners)
listener.onSizeChange(width, height);
}
public float getWidth() {
return width;
}
public float getHeight() {
return height;
}
}
создать ApplicationBundle в основном проекте
public class ApplicationBundle {
private final View view;
public ApplicationBundle(View view) {
this.view = view;
}
public View getView() {
return view;
}
}
Сделайте необходимый импорт из основного проекта. В AndroidLauncher в проекте Android добавьте следующее:
public class AndroidLauncher extends AndroidApplication {
private View rootView;
private AndroidView androidView;
private int width, height;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
rootView = this.getWindow().getDecorView().getRootView();
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
width = rect.width();
height = rect.height();
androidView = new AndroidView(width, height);
rootView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
if(!(width == rect.width() && height == rect.height())) {
width = rect.width();
height = rect.height();
androidView.onSizeChange(width, height);
}
}
});
initialize(new DigMeApp(new ApplicationBundle(androidView)), config);
}
}
В вашем основном MyApp в основном проекте в методе create() добавьте реализацию SizeChangeListener к представлению, полученному из конструктора.
public class MyApp extends Game { // or ApplicationAdapter
private View view;
private Stage stage;
// your own variables
public MyApp(ApplicationBundle applicationBundle) {
view = applicationBundle.getView();
}
@Override
public void create () {
stage = new Stage();
// add some textfields
final TextField tf1 = new TextField("", skin);
final TextField tf2 = new TextField("", skin);
tf1.setWidth((float)view.getWidth() * 0.6f);
tf2.setWidth((float)view.getWidth() * 0.6f);
tf1.setHeight((float)view.getHeight() * 0.05f);
tf2.setHeight((float)view.getHeight() * 0.05f);
view.addListener(new SizeChangeListener() {
@Override
public void onSizeChange(float width, float height) {
Gdx.app.log("INFO", "Visible area: " + width + " " + height);
Gdx.app.log("INFO", "Stage area: " + stage.getWidth() + " " + stage.getHeight());
float keyboardHeight = getKeyboardHeight();
// MOVE THEM OUT OF THE WAY :)
tf1.addAction(Actions.moveTo(width / 2 - tf1.getWidth() / 2.0f, keyboardHeight + (6 * (height / 8)), 1, Interpolation.sineOut));
tf2.addAction(Actions.moveTo(width / 2 - tf2.getWidth() / 2.0f, keyboardHeight + (7 * (height / 8)), 1, Interpolation.sineOut));
// Gdx.gl20.
// tf.setPosition(width / 2 - (tf.getWidth() / 2.0f), 0);
}
});
}
Возможно, создайте небольшой метод клавиатуры heigt, как я сделал:
private float getKeyboardHeight() {
return stage.getHeight() - view.getHeight();
}
Пытаться
Gdx.input.isPeripheralAvailable(Input.Peripheral.OnscreenKeyboard);
Я только что посмотрел это в документах, не знаю, действительно ли это помогает. Но
Gdx.input.setOnscreenKeyboardVisible(boolean visible);
Метод также может быть использован (как вы определяете, когда клавиатура видна, а когда нет).