unity重写软键盘for Android NGUI

一 原因

以为某些原因,需要重写Unity游戏中Android的软键盘的样式,然而unity对android和ios的ios的软键盘都有封装,在Unity中TouchScreenKeyboard.Open可以打开一个软键盘,然而对这个软键盘的操作函数少的可怜,所以有了这篇文章.

二 目的

本文的主要目的是重写NGUI的UIInput,也就是TouchScreenKeyboard.Open函数,调用自己写的Android原生的键盘

三 准备

需要Android的环境 jdk sdk 还有eclise,不会安装的请百度自行安装,unity 和 ngui插件

四 实现原理

首先需要建立一个Android的工程,里面内容很简单,只要一个Activity和一个EditText,并且当打开这个工程Activity的时候,自动弹出一个软键盘,这很容易实现,当unity中有需要打开软键盘的时候,unity跳转到这个Activity,按下软键盘的完成键把数据传回到Unity.

五 Android库的实现

public class SDKActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        Resources resources = this.getResources();//加载res资源
        String packageName = this.getPackageName();//包名
        int id = resources.getIdentifier("activity_sdk", "layout", packageName);//获取Activity的layout
        super.onCreate(savedInstanceState);
        setContentView(id);
        //设置Activity中的EditText,为了打开软键盘
        final EditText textArea = (EditText)findViewById(resources.getIdentifier("textArea", "id", packageName));
        textArea.setText("");
        textArea.setBackgroundColor(0x00000000);
        textArea.setTextColor(0x00000000);
        textArea.setFocusableInTouchMode(true);
        textArea.requestFocus();
        textArea.setCursorVisible(true);
        TextWatcher textWatcher = new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        };

        textArea.addTextChangedListener(textWatcher);
        //点击了软键盘的完成
        textArea.setOnEditorActionListener(new OnEditorActionListener()
        {

            @Override
            public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2)
            {
                Log.e("点击", "完成");
                SendData(0,arg0.getText().toString());
                finish();
                return true;
            }
        });
    }

    // 向unity返回数据
    void SendData(int code, String info)
    {
        UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);
    }
}

代码很简单,就是在OnCreate中设置一下EditText的属性,在点击的软键盘的完成键后SendData向Unity返回数据

还需要一个类用来供Unity调用,用来打开这个Activity,也就是打开这个软键盘

public class AndroidKeyboard
{
    Activity context = null;
    InputMethodManager inputMethodManager = null;
    TextWatcher textWatcher = null;
    boolean mode = false;

    public AndroidKeyboard()
    {
        context = UnityPlayer.currentActivity;
        inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    //打开Activiy,并且显示输入法
    public void Open(final String text,final boolean mode)
    {
        if(context == null)
        {
            Log.e("unity", "context null when open keyboard");
            return ;
        }
        context.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                Log.e("unity", "1111111111111");
                Intent intent = new Intent();
                intent.setClassName(context, "com.android.keyboardsdk.SDKActivity");
                context.startActivity(intent);
            }
        });

    }

}

代码没什么好说的,就是Unity调用Open函数的时候打开这个Activity,并且显示软键盘

六 unity资源设置和AndroidManifest.xml设置

主要是设置上面的Activity的layout和软键盘的属性

附上Acitvity的xml,里面就放了一个EditText

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical|center_horizontal" >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:inputType="textNoSuggestions|textMultiLine"
        android:ems="10"
        android:imeOptions="actionDone"
        android:id="@+id/textArea"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:textSize="0.01dp"
        android:gravity="top" />
</RelativeLayout>

然后需要在Unity的AndroidManifest.xml中设置

    <activity
        android:configChanges="keyboard|keyboardHidden|orientation"
        android:screenOrientation="landscape"
        android:windowSoftInputMode="adjustResize|stateVisible"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
        android:name="com.android.keyboardsdk.SDKActivity">
    </activity>

主要是注册一下上面创建的Activity,不然在unity调用后打不开

七 unity中调用这个库,并打开软键盘

把上面创建的lib导出后放到unity中就可以提供给unity使用了

AndroidJavaObject _input= new AndroidJavaObject("com.android.keyboardsdk.AndroidKeyboard");_input.Call("Open", text, multiLines);

这两行代码很好理解,就是new了一个AndroidKeyboard类的实例(上面你自己创建的),并且调用了Open函数

最后还要接收一下Android软键盘传回来的消息,就是SendData函数传递回来的

UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);

需要在unity创建一个名字为Plugins的GameObject,然后挂上一个脚本,实现函数OnCustomInputAction即可

    void OnCustomInputAction(string data)
    {
    //data就是软键盘传回来的数据
    }

八 替换掉NGUI UIInput的TouchScreenKeyboard.Open,并实现相关的逻辑,因为ngui版本不同,我就不多废话

时间: 2024-10-17 01:03:28

unity重写软键盘for Android NGUI的相关文章

【转】Android点击空白区域,隐藏输入法软键盘

原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏.为了更好的体验,我们可以实现当用户使用完毕软键盘时.点击空白区域即可实现隐藏的功能.效果如图所示: 代码实现 代码块语法遵循标准markdown代码,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

android安卓屏蔽禁用系统输入法,自定义软键盘,解决EditText光标问题demo

目前很多的输入法都有自动提示补全功能,在一些应用场景里不适用,需要禁用系统输入法,自定义软键盘,EditText的光标问题是比较头疼的,网上的说法很多,然而大部分都是解决不了问题的.以下是本人做的一个demo供网友参考. 直接上代码: xml软键盘:         <android.inputmethodservice.KeyboardView             android:id="@+id/keyboard_view"             android:lay

Android 获取软键盘的删除delete事件

对于软键盘删除事件,网上有很多方案是如下,但是 google api也说明了,这个只是监听硬件键盘,对于软键盘并不负责触发(我测试了一下,软键盘能够监听delete键,其他键像数字字母等没有触发这里的监听方法). editText.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //You can identify which

Android App监听软键盘按键的三种方式(转)

最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中

Android App监听软键盘按键的三种方式

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE

android软键盘弹出引起的各种不适终极解决方案

很多写登录界面的开发者都会遇到一个问题:那就是在登录界面时,当你点击输入框时,下边的按钮有时会被输入框挡住,这个不利于用户的体验,所以很多人希望软键盘弹出时,也能把按钮挤上去.很多开发者想要监听键盘的状态,这无疑是一个很麻烦的做法. 我们可以在AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize" ,软键盘弹出时,要对主窗口布局重新进行布局,并调用onSizeChanged方法,切记一点

Android软键盘的显示隐藏

一.软键盘显示的原理     软件盘的本质是什么?软键盘其实是一个Dialog!     InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示. 二.活动主窗口调整     android定义了一个属性,名字为windowSoftInputMode, 用它

Android 控制软键盘

通过设置android:windowSoftInputMode="" 控制展示软键盘 参数分为两类:state* 与 adjust* ,前者设置软键盘的显示与隐藏,后者设置对当前展示页面布局的影响.可以同时设置一个state*与adjust*两个参数,例如:<activity android:windowSoftInputMode="stateVisible|adjustResize" > stateUnspecified 未指定状态,有输入框时显示软键

Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究

在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听/监控方法做一些总结,以备后用. 一.点击空白处隐藏软键盘 这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法. 首先获得InputMethodManager:        InputMethodManager manager = (InputMethodManager) getS