一 原因

以为某些原因,需要重写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库的实现

  1. public class SDKActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState)
  4. {
  5. Resources resources = this.getResources();//加载res资源
  6. String packageName = this.getPackageName();//包名
  7. int id = resources.getIdentifier("activity_sdk", "layout", packageName);//获取Activity的layout
  8. super.onCreate(savedInstanceState);
  9. setContentView(id);
  10. //设置Activity中的EditText,为了打开软键盘
  11. final EditText textArea = (EditText)findViewById(resources.getIdentifier("textArea", "id", packageName));
  12. textArea.setText("");
  13. textArea.setBackgroundColor(0x00000000);
  14. textArea.setTextColor(0x00000000);
  15. textArea.setFocusableInTouchMode(true);
  16. textArea.requestFocus();
  17. textArea.setCursorVisible(true);
  18. TextWatcher textWatcher = new TextWatcher() {
  19. @Override
  20. public void onTextChanged(CharSequence s, int start, int before,
  21. int count) {
  22. }
  23.  
  24. @Override
  25. public void beforeTextChanged(CharSequence s, int start, int count,
  26. int after) {
  27. }
  28.  
  29. @Override
  30. public void afterTextChanged(Editable s) {
  31. }
  32. };
  33.  
  34. textArea.addTextChangedListener(textWatcher);
  35. //点击了软键盘的完成
  36. textArea.setOnEditorActionListener(new OnEditorActionListener()
  37. {
  38.  
  39. @Override
  40. public boolean onEditorAction(TextView arg0, int arg1,KeyEvent arg2)
  41. {
  42. Log.e("点击", "完成");
  43. SendData(0,arg0.getText().toString());
  44. finish();
  45. return true;
  46. }
  47. });
  48. }
  49.  
  50. // 向unity返回数据
  51. void SendData(int code, String info)
  52. {
  53. UnityPlayer.UnitySendMessage("Plugins", "OnCustomInputAction",info);
  54. }
  55. }

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

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

  1. public class AndroidKeyboard
  2. {
  3. Activity context = null;
  4. InputMethodManager inputMethodManager = null;
  5. TextWatcher textWatcher = null;
  6. boolean mode = false;
  7.  
  8. public AndroidKeyboard()
  9. {
  10. context = UnityPlayer.currentActivity;
  11. inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
  12. }
  13.  
  14. //打开Activiy,并且显示输入法
  15. public void Open(final String text,final boolean mode)
  16. {
  17. if(context == null)
  18. {
  19. Log.e("unity", "context null when open keyboard");
  20. return ;
  21. }
  22. context.runOnUiThread(new Runnable()
  23. {
  24. @Override
  25. public void run()
  26. {
  27. Log.e("unity", "1111111111111");
  28. Intent intent = new Intent();
  29. intent.setClassName(context, "com.android.keyboardsdk.SDKActivity");
  30. context.startActivity(intent);
  31. }
  32. });
  33.  
  34. }
  35.  
  36. }

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

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

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

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

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:layout_gravity="center_vertical|center_horizontal" >
  5. <EditText
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:layout_centerHorizontal="true"
  9. android:inputType="textNoSuggestions|textMultiLine"
  10. android:ems="10"
  11. android:imeOptions="actionDone"
  12. android:id="@+id/textArea"
  13. android:layout_alignParentTop="true"
  14. android:layout_alignParentRight="true"
  15. android:layout_alignParentEnd="true"
  16. android:layout_alignParentLeft="true"
  17. android:layout_alignParentStart="true"
  18. android:layout_alignParentBottom="true"
  19. android:textSize="0.01dp"
  20. android:gravity="top" />
  21. </RelativeLayout>

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

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

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

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

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

  1. 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即可

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

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

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

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

    原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步 ...

  2. Android控制软键盘的弹出和隐藏

    弹出软键盘 前提:必须要有一个可以编辑的控件(EditText),并且当前已经获取焦点 /** * 弹出软键盘 */ public void openKeyboard(View view) { // ...

  3. 彻底搞定Android开发中软键盘的常见问题

    软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog.        InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参 ...

  4. Android中点击隐藏软键盘最佳方法——Android开发之路4

    Android中点击隐藏软键盘最佳方法 实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEve ...

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

    前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...

  6. Android软键盘遮挡的四种解决方案

    问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...

  7. 关于android软键盘enter键的替换与事件监听

    android软键盘事件监听enter键  软件盘的界面替换只有一个属性android:imeOptions,这个属性的可以取的值有 normal,actionUnspecified,actionNo ...

  8. Android点击其他任意位置收起软键盘

    在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些 ...

  9. Android学习笔记_点九绘图与软键盘和事件传递

    最近项目里遇到的几个小问题,以前只是用吗没有深入看过,现在总结到一起,防止以后这种小问题占用太多时间.还是通过网上别人总结的很多博客学习了,挑选出最易懂明了的. 还有leader很小的问题都不放过,亲 ...

随机推荐

  1. CentOS7攻克日记(一) —— 安装ISO

    因为工作需要,开发环境需要装在centos7上面,这对用惯了ubuntu 这种Debian系的我,此刻只想说一句MMP   自从刚开始弄到现在VM里面已经躺了一堆的Centos7的尸体了,这次从头初始 ...

  2. 使用bootstrap-select有时显示“Nothing selected”

    .html()后加 $('#courseList').selectpicker('refresh'); $('#courseList').selectpicker('render'); 来源

  3. 开发者中心没有勾选 ipad却需要传宣传图片的解决方法

    1.通过模拟器 运行一个ipad 把ipad的比例调到100% 然后保存图片,如果没有适配ipad会出现上下左右黑色边框,这些不必在意,把保存的图片拖到开发者中心即可,勾选右侧 ,都使用12.9英寸图 ...

  4. UVA - 11468 (AC自动机+动态规划)

    建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG ...

  5. _spellmod_aura_on_classmask

    -- 修改职业所有技能,公共冷却时间.冷却时间等--小技巧: 根据职业107,108来修改(近期会有改动) `aura` 技能光环ID `spellfamily` 职业代码 `type1` 百分比还是 ...

  6. Hash索引和BTree索引区别【转】

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  7. POJ 1321 棋盘问题(搜索的方式)

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  8. 雷林鹏分享:jQuery EasyUI 数据网格 - 动态改变列

    jQuery EasyUI 数据网格 - 动态改变列 数据网格(DataGrid)列可以使用 'columns' 属性简单地定义.如果您想动态地改变列,那根本没有问题.为了改变列,您可以重新调用dat ...

  9. Lab 10-3

    This lab includes a driver and an executable. You can run the executable from anywhere, but in order ...

  10. 基于apache的虚拟主机

    apche支持3种类型虚拟主机: 基于IP的虚拟主机 基于端口的虚拟主机 基于主机名的虚拟主机 配置两个站点虚拟主机: /data/web1 /data/web2 一.基于IP虚拟主机 添加一个IP: ...