如何在显示软键盘时“按下”屏幕

时间:2014-01-30 20:41:32

标签: android libgdx soft-keyboard


我在我的LibGDX android应用程序中有一个表,下面是一些文本字段(一行)和一个下面的按钮(提交)。 我的问题是,当文本区域聚焦(点击它)并且软键盘出现时,如何“滑动”桌子,文本框和按钮? 换句话说,如何使软键盘来覆盖我的其他对象。 此解决方案可能与此问题相关: How can i find the height of soft-keyboard in a LibGDX application

非常感谢。

3 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法,它正在运行,但我认为太干净了。 所以,我的情景是:

  • 一个包含ScrollPane(另一个表)的容器表,在此滚动表下有两个TextField,下面是一个Submit按钮
  • 容器表设置为填充父级(全屏)
  • 文本字段和按钮对齐到容器表的底部

问题是,当OnscreenKeybord可见时,它覆盖了底部对象(文本字段和按钮)和滚动表的一部分。

我的解决方案/解决方法是:

    keyboard = new OnscreenKeyboard() {
        @Override
        public void show(boolean visible) {
            Gdx.input.setOnscreenKeyboardVisible(visible);
            // Hmmmm...
            container.invalidate();
            if (visible) {
                // TODO get OsK height somehow!!!
                container.padBottom(310);
            } else {
                container.padBottom(0);
            }
        }
    };
    textFld1.setOnscreenKeyboard(keyboard);
    textFld2.setOnscreenKeyboard(keyboard);

并在Submit按钮的InputListener上(在touchDown上)我有一个清理函数,如:

    textFld1.setText("");
    textFld2.setText("");
    stage.unfocus(textFld1);
    stage.unfocus(textFld2);
    keyboard.show(false);

这样,当显示软键盘时,容器表将被填充,并且在按下提交按钮后将恢复容器表。软键盘也是隐藏的。

现在,此解决方法存在两个问题:

  • 我还没有办法获得软键盘的高度;正如你在示例代码中看到的那样,我为up padding选择了一个任意值,所以在我的模拟器上看起来很好看

  • 如果按下模拟器中的硬按钮Back或ESC,软键盘将隐藏,但表格的上翻仍然存在;我没有找到如何来确定软键盘是否可见

如果有人为我的问题找到了其他解决方案,请发布。

感谢。

答案 1 :(得分:0)

我也完全正在努力解决这个问题,但我认为我找到了一个非常好的解决方案。

理论上的解决方案:

当键盘弹出时,它会调整屏幕大小,从而调用libgdx的调整大小回调。

<强>优点:

  • 无需具有与键盘可见性检测相关的逻辑
  • 无需获得键盘高度
  • 处理libgdx屏幕类的调整大小回调中的所有内容
  • 易于实施(我认为)

<强>缺点

  • app无法再全屏;状态栏显示和事物

怎么做:

  1. 创建一个main_layout.xml文件,(....YourLibGdxThing\android\res\layout\main_layout.xml),其中包含以下XML:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <FrameLayout
            android:id="@+id/main_frame_layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
    </LinearLayout>
    
  2. 修改你的android启动器类(....YourLibGdxThing\android\src\your\name\space\android\AndroidLauncher.java),使得onCreate看起来像这样:

    public class AndroidLauncher extends AndroidApplication
    {
        @Override
        protected void onCreate (Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_layout);
            AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
            FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main_frame_layout);
            frameLayout.addView(initializeForView(new YourGame(),config));
        }
    }
    
  3. android:windowFullScreenstyle.xml)中的....YourLibGdxThing\android\res\values\styles.xml属性更改为false; XML应该在style.xml

    中看起来像这样
    <resources>
    
        <style name="GdxTheme" parent="android:Theme">
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:colorBackgroundCacheHint">@null</item>
            <item name="android:windowAnimationStyle">@android:style/Animation</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowContentOverlay">@null</item>
            <item name="android:windowFullscreen">false</item>    <!-- IMPORTANT -->
        </style>
    
    </resources>
    
  4. 将属性android:windowSoftInputMode="adjustResize"添加到Android清单,进入活动代码...我的AndroidManifest(....YourLibGdxThing\android\AndroidManifest.xml)如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="my.project.reverse.domain.thing"
              android:versionCode="1"
              android:versionName="1.0" >
    
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/GdxTheme" >
        <activity
            android:name="my.project.reverse.domain.thing.AndroidLauncher"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize"       <!-- IMPORTANT -->
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
  5. 谢谢!我希望它有帮助!!!!!!!!!!

答案 2 :(得分:-1)

android:windowSoftInputMode块中将adjustPan设置为<activity>以获得所需的结果。请参阅文档:https://developer.android.com/guide/topics/manifest/activity-element.html#wsoft