一 原因

以为某些原因,需要重写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版本不同,我就不多废话

 

转载于:https://www.cnblogs.com/July7th/p/6666977.html

更多相关文章

  1. C语言函数的递归(上)
  2. Flutter中高级培训
  3. Android(安卓)的RIL驱动模块
  4. 【基础系列】Input控件专题
  5. Android(安卓)8.0新特性
  6. Swift 的强大之处 - iOS移动开发周报
  7. 使用Kotlin高效地开发Android(安卓)App(一)
  8. Android(安卓)的 MediaPlayer源码框架讲解
  9. startActivity兼容性问题总结

随机推荐

  1. android shape的使用
  2. Ant编译android工程之环境搭建
  3. 通过AndroidTestCase来进行android 单元
  4. Android高手进阶教程(五)之----Android(
  5. Android:Eclipse+ADT+Android(安卓)SDK
  6. Android(安卓)Studio系列-签名打包
  7. Android中选取并绑定AppWidget
  8. android 自定义 permission 权限
  9. Android(安卓)ActionBarSherlock的使用
  10. android焦点问题