android - 如何同时监听触摸事件和软键盘事件
问题描述
我想在 EditText 上同时收听三个不同的事件
- 文本更改事件
- 触摸事件
- 软键盘事件
我正在使用带有软键盘的触摸屏。具体来说,我想将这些事件记录到文件中以供进一步处理。问题是我无法同时收听所有三个事件。此外,我根本无法捕捉到软键盘事件。当我搜索时,我发现我用于键事件的代码仅适用于硬键盘,但我想从软键盘中捕获这些事件。
我在堆栈溢出中阅读了几个答案,但它们并没有解决我的问题,例如
如何为 ImageButton 组合 OnClickListener 和 OnTouchListener
使用 Android 接收 onTouch 和 onClick 事件
几天来我一直在尝试解决这个问题,但我没有成功。我在触摸侦听器上返回 false 以允许其他侦听器捕获事件,但这也没有解决问题。任何帮助或指导将不胜感激。
phrase.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
String formattedDate = df.format(c.getTime());
String[] data = {formattedDate,"Acceleration","","","","","","","","","","","","","", "",
"","","", "", "", "", "","", "", "", "", "", "", "", "","", "", "","", "", "", "", "", "", "", "",
"During",timeStamp+"",Xacc+"",Yacc+"",Zacc+"",};
writeDataToXls(data);
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
String formattedDate = df.format(c.getTime());
String[] data = {formattedDate,"Acceleration","","","","","","","","","","","","","", "",
"","","", "", "", "", "","", "", "", "", "", "", "", "","", "", "","", "", "", "", "", "", "", "",
"During",timeStamp+"",Xacc+"",Yacc+"",Zacc+"",};
writeDataToXls(data);
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
String formattedDate = df.format(c.getTime());
String[] data = {formattedDate,"Acceleration","","","","","","","","","","","","","", "",
"","","", "", "", "", "","", "", "", "", "", "", "", "","", "", "","", "", "", "", "", "", "", "",
"During",timeStamp+"",Xacc+"",Yacc+"",Zacc+"",};
writeDataToXls(data);
}
});
phrase.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
String formattedDate = df.format(c.getTime());
int action=event.getAction();
int actionIndex=event.getActionIndex();
int actionMasked= event.getActionMasked();
int btnState=event.getButtonState();
long downTime=event.getDownTime();
long eventTime=event.getEventTime();
int EdgeFlags=event.getEdgeFlags();
int Flags= event.getFlags();
int MetaState=event.getMetaState();
float orientation=event.getOrientation();
int pointerCount=event.getPointerCount();
float pressure=event.getPressure();
float size=event.getSize();
int source=event.getSource();
float toolMajor=event.getToolMajor();
float toolMinor=event.getToolMinor();
float touchMajor=event.getTouchMajor();
float touchMinor=event.getTouchMinor();
float xAxis=event.getAxisValue(AXIS_X);
float yAxis=event.getAxisValue(AXIS_Y);
float x=event.getX();
float y=event.getY();
float rawX=event.getRawX();
float rawY=event.getRawY();
float XPrecision=event.getXPrecision();
float YPrecision=event.getYPrecision();
String[] data = {formattedDate,"Touch","","","","","","","","","","","","", "","",
action+"",actionIndex+"",actionMasked+"", btnState+"", downTime+"", eventTime+"",EdgeFlags+"",Flags+"", MetaState+"",
orientation+"",pointerCount+"", pressure+"", size+"", source+"", toolMajor+"",toolMinor+"", touchMajor+"", touchMinor+"",
xAxis+"", yAxis+"", x+"", y+"", rawX+"", rawY+"", XPrecision+"", YPrecision+""
,timeStamp+"",Xacc+"",Yacc+"",Zacc+"",};
writeDataToXls(data);
System.out.println("touch");
return false;
}
});
phrase.setOnKeyListener(new EditText.OnKeyListener()
{
public boolean onKey(View v, int keyCode, KeyEvent event)
{
String formattedDate = df.format(c.getTime());
int action= event.getAction();
int keyCode2=event.getKeyCode();
char dispLabel=event.getDisplayLabel();
long downtime=event.getDownTime();//in ms
long eventTime= event.getEventTime();//in ms
int flags=event.getFlags();
int metaState=event.getMetaState();
int modifiers=event.getModifiers();
int number= event.getNumber();
int repeatCount= event.getRepeatCount();
int scanCode= event.getScanCode();
int source= event.getSource();
int unicodeChar=event.getUnicodeChar();
String[] data = {formattedDate,"Key",action+"",keyCode+"",keyCode2+"",dispLabel+"",downtime+"",eventTime+"",flags+"",metaState+"",modifiers+"",number+"",repeatCount+"",scanCode+"", source+"",unicodeChar+"",
"","","", "", "", "", "","", "", "", "", "", "", "", "","", "", "","", "", "", "", "", "", "", "",
"","","","","","","",""};
writeDataToXls(data);
System.out.println("Key");
return true;
}
});
解决方案
我必须创建一个可爱的键盘,以便能够在同时获取加速度数据的同时处理触摸和按键。
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_typing, container, false);
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
senSensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
initializeTheCSVfile();
mKeyboard = new Keyboard(getActivity(), R.xml.keyboard);
phrase= view.findViewById(R.id.typing_edittxt);
okBtn=view.findViewById(R.id.okbtn);
okBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String formattedDate = df.format(c.getTime());
int ld=Utilities.getLevenshteinDistance("earth quakes are predictable",phrase.getText().toString());
String[] data = {formattedDate,"LevenshteinDistance=",ld+""};
writeDataToXls(data);
mListener.onFragmentInteraction(2,xlsfile);
}
});
phrase.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event); // handle the event first
//Hide the system keyboard when the user touch the edittext
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // hide the soft keyboard
}
showKeyboardWithAnimation();
return true;
}
});
mKeyboardView = (CustomKeyboardView) view.findViewById(R.id.keyboard_view);
mKeyboardView.setKeyboard(mKeyboard);
mKeyboardView
.setOnKeyboardActionListener(new BasicOnKeyboardActionListener(
getActivity())
{
public void onKey(int primaryCode, int[] keyCodes) {
super.onKey( primaryCode,keyCodes);
//aquire the pressed key code and displayed label
KeyPrimaryCode=primaryCode;
typedDisplayedLabel=Character.toLowerCase(displayedLabel);
}
});
mKeyboardView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
String formattedDate = df.format(c.getTime());
int action=event.getAction();
long downTime=event.getDownTime();
long eventTime=event.getEventTime();
float orientation=event.getOrientation();
int pointerCount=event.getPointerCount();
float pressure=event.getPressure();
float size=event.getSize();
float toolMajor=event.getToolMajor();
float toolMinor=event.getToolMinor();
float touchMajor=event.getTouchMajor();
float touchMinor=event.getTouchMinor();
float xAxis=event.getAxisValue(AXIS_X);
float yAxis=event.getAxisValue(AXIS_Y);
float x=event.getX();
float y=event.getY();
float rawX=event.getRawX();
float rawY=event.getRawY();
float XPrecision=event.getXPrecision();
float YPrecision=event.getYPrecision();
System.out.println("**************TouchKeyboard:"+action);
v.onTouchEvent(event); // handle the event first
if(action==0 && KeyPrimaryCode!=67 && KeyPrimaryCode!=62 ) {
KeyPrimaryCode = -9000;
typedDisplayedLabel='$';
}
else if(action==2 && KeyPrimaryCode!=67 && KeyPrimaryCode!=62 ){
KeyPrimaryCode=-2000;
typedDisplayedLabel='$';}
String[] data = {formattedDate,KeyPrimaryCode+"",typedDisplayedLabel+"",
action+"",downTime+"", eventTime+""
,orientation+"",pointerCount+"", pressure+"", size+"", toolMajor+"",toolMinor+"", touchMajor+"", touchMinor+"",
xAxis+"", yAxis+"", x+"", y+"", rawX+"", rawY+"", XPrecision+"", YPrecision+""
,timeStamp+"",Xacc+"",Yacc+"",Zacc+""};
writeDataToXls(data);
System.out.println("KeyCode:"+KeyPrimaryCode);
System.out.println("Displayed label:"+typedDisplayedLabel);
System.out.println("Handle TouchKeyboard:"+action);
return true;
}
});
return view;
}//on create view
推荐阅读
- powershell - ForEach 和 $_ 空结果
- html - 覆盖而不使用相对父级和填充子级
- c# - 如何使用 C# 读取 MiCOM 继电器的保持寄存器(ModBus RTU over RS-485 通信)
- mysql - Mysql数据库别名过滤器
- node.js - Dockerfile 和 npm prune --production
- javascript - 当网站在 iPhone 中加载时,预加载器不工作
- sql - 从不同表中提取动态日期范围后计算付款金额
- swift - 从 3d 对象创建 ARRaycastQuery
- docker - 通过 docker 命令运行 cypress 时,cypress type() 未定义
- logging - nftables:如何记录从路由器发出的数据包?