Unity使用Android系统剪贴板复制&粘贴
2017-11-13 11:58
405 查看
Unity3d开发的移动应用,默认只有在InputField输入文本时,可以调用系统剪贴板(ex.吐槽下Unity引擎键盘的Layout十分不人机)。如果有类似选中某个文本,复制其中内容的需求,就要使用原生插件来提供这个方法了。如:
开发原生插件的流程应该已经有很多教程了,这个不再重复,直接贴Java代码。因为身边的Java朋友推荐,我倾向于使用AndroidStudio。
1. Java代码package com.company.product;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.ClipData;
//import com.unity3d.player.UnityPlayer;
//import com.unity3d.player.UnityPlayerActivity;
public class NativePlugin extends Fragment //注意,这里继承的是Fragment,懂的朋友也可以改成UnityPlayerActivity或没有继承
{
private static final String TAG = "Plugin";
private static NativePlugin Instance = null;
private String gameObjectName;
public static NativePlugin GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new NativePlugin();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
//拷贝String到剪贴板
public void onClickCopy(String str) {
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", str); //Label是任意文字标签
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
}
//粘贴
public String onClickPaste(){
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
String result = "";
ClipData clipData = cm.getPrimaryClip();
//result = cm.toString(); //ClipData{ text/plain "Label"{T:"str"}}; //取出的是ClipData
//result = cm.getText().toString(); //"str" //方法deprecated
ClipData.Item item = clipData.getItemAt(0); //这里获取第一条,也可以用遍历获取任意条
CharSequence charSequence = item.coerceToText(getActivity().getApplicationContext());
result = charSequence.toString();
return result;
}
}
2. 因为没有继承Activity,编译输出后,只需要拷贝*.jar包到Unity工程下/Plugins/Android/libs,不需要AndroidManifeset。
3. C#代码,分别去Call() Java Code中的两个方法。
public class AndroidImpl : MonoBehaviour
{
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.company.product.MyPluginClass"); //和java代码包名统一
jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name); //Main Camera
}
public void OnCopy()
{
jo.Call("onClickCopy", m_clipInputField.text);
}
public void OnPaste()
{
clipText.text = jo.Call<string>("onClickPaste");
}
}
开发原生插件的流程应该已经有很多教程了,这个不再重复,直接贴Java代码。因为身边的Java朋友推荐,我倾向于使用AndroidStudio。
1. Java代码package com.company.product;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.ClipData;
//import com.unity3d.player.UnityPlayer;
//import com.unity3d.player.UnityPlayerActivity;
public class NativePlugin extends Fragment //注意,这里继承的是Fragment,懂的朋友也可以改成UnityPlayerActivity或没有继承
{
private static final String TAG = "Plugin";
private static NativePlugin Instance = null;
private String gameObjectName;
public static NativePlugin GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new NativePlugin();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
//拷贝String到剪贴板
public void onClickCopy(String str) {
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", str); //Label是任意文字标签
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
}
//粘贴
public String onClickPaste(){
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
String result = "";
ClipData clipData = cm.getPrimaryClip();
//result = cm.toString(); //ClipData{ text/plain "Label"{T:"str"}}; //取出的是ClipData
//result = cm.getText().toString(); //"str" //方法deprecated
ClipData.Item item = clipData.getItemAt(0); //这里获取第一条,也可以用遍历获取任意条
CharSequence charSequence = item.coerceToText(getActivity().getApplicationContext());
result = charSequence.toString();
return result;
}
}
2. 因为没有继承Activity,编译输出后,只需要拷贝*.jar包到Unity工程下/Plugins/Android/libs,不需要AndroidManifeset。
3. C#代码,分别去Call() Java Code中的两个方法。
public class AndroidImpl : MonoBehaviour
{
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.company.product.MyPluginClass"); //和java代码包名统一
jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name); //Main Camera
}
public void OnCopy()
{
jo.Call("onClickCopy", m_clipInputField.text);
}
public void OnPaste()
{
clipText.text = jo.Call<string>("onClickPaste");
}
}
相关文章推荐
- Android系统剪贴板(ClipboardManager)的使用: 通过代码复制和粘贴数据
- Android 复制 粘贴 剪贴板的使用 ClipboardManager
- Android 复制 粘贴 剪贴板的使用 ClipboardManager
- Vim 使用系统粘贴板复制粘贴
- VB.NET中调用系统的剪贴板完成数据的复制和粘贴
- <Android>使用系统时间命名文件夹
- 在DOS命令行中,使用Adb shell复制Android系统文件(Ophone系统)
- Android复制粘贴到剪贴板
- Android复制粘贴到剪贴板
- Android 复制文本内容到系统剪贴板的最简单实践
- Android中将字符串文字内容复制到系统剪贴板
- [Unity]Android(安卓)代码安卓APK时,使用系统安装器安装的[最正确]办法(不弹出选择打开的程序)
- VIM复制粘贴系统剪贴板
- 项目中在Android.mk文件中根据项目名称选择不同的AndroidManifest.xml文件 && 如何使用系统设定的日期显示格式
- VI/VIM 无法使用系统剪贴板(clipboard)?(Ubuntu&Mac OS X已解决)
- [EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART4——Unity&PIAB
- 使用剪贴板的复制/粘贴程序
- vim 使用系统粘贴板复制粘贴
- Android中将字符串文字内容复制到系统剪贴板
- Android--入门---3---(Android 系统的使用&开发前的设置)