首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定在使用monkeyrunner时是否在屏幕上显示软键盘

如何确定在使用monkeyrunner时是否在屏幕上显示软键盘
EN

Stack Overflow用户
提问于 2012-10-16 05:00:25
回答 4查看 2.3K关注 0票数 3

我正在尝试使用monkeyrunner(使用AndroidViewClient )自动化一些屏幕点击和输入

每当屏幕上有编辑文本时,软键盘就会弹出来,如果我想通过findViewById按下一个按钮,(假设这个特定的按钮在软键盘后面)就会失败。它不是点击这个按钮,而是点击软键盘上的某个按钮。所以作为一个变通办法,我需要通过猴子跑步者按back键来隐藏软键盘。

我的问题是,在从monkeyrunner运行时,如何确定软键盘是否显示在屏幕上。

当我查看logcat时,我在显示软键盘时看到了以下内容

代码语言:javascript
运行
复制
I/SurfaceFlinger( 2045): id=143(28) createSurf 0x4326743c (720x593),1 flag=0, InputMethod

并在移除软键盘时显示此信息

代码语言:javascript
运行
复制
I/SurfaceFlinger( 2045): id=142 Removed InputMethod idx=4 MapSz=3
I/SurfaceFlinger( 2045): id=142 Removed InputMethod idx=-2 MapSz=3

如果有人能提供一个如何从monkeyrunner脚本解析adb logcat输出的示例,我可以将其作为最后一个选项,如果找到任何合适的替代解决方案的话。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-31 06:16:21

你在回答中提到的内容可能是对AndroidViewClient的一个很好的补充,我会尽快将其纳入其中。

无论如何,有一种方法可以获得相同的信息,尽管是以一种更复杂的方式:

代码语言:javascript
运行
复制
...
from com.dtmilano.android.viewclient import ViewClient

vc = ViewClient(*ViewClient.connectToDeviceOrExit())
view = vc.findViewByIdOrRaise('id/no_id/1')
view.getXY() # getXY() calls __dumpsWindowsInformation()
for w in view.windows:
    if view.windows[w].activity == 'InputMethod':
        print view.windows[w].visibility

更新日期:11-2月15日

最新的AndroidViewClient/culebra版本支持isKeyboardShown()方法。像这样使用:

代码语言:javascript
运行
复制
#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2014  Diego Torres Milano
Created on 2015-02-11 by Culebra v10.0.8
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os


try:
    sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
except:
    pass

from com.dtmilano.android.viewclient import ViewClient

TAG = 'CULEBRA'

_s = 5
_v = '--verbose' in sys.argv


kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
print "Is keyboard shown:", device.isKeyboardShown()
票数 3
EN

Stack Overflow用户

发布于 2013-10-30 23:08:33

有一种方法可以使用monkeyrunner中的adb shell执行您想要的操作,并且它不需要单独的第三方库。

代码语言:javascript
运行
复制
if ('mInputShown=true' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is showing goes here>

代码语言:javascript
运行
复制
if ('mInputShown=false' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is not showning goes here>

其中,device是连接的设备的MonkeyDevice实例。

我发现,通常在手动启动时显示软键盘输入的应用程序,在使用monkeyrunner启动时不会可靠地显示软键盘。如果脚本逻辑依赖于软键盘是否显示,我在脚本中使用上面的测试来检查软键盘是否显示。

下面的解释包括一些关于如何解决这类问题的思考。

代码语言:javascript
运行
复制
adb shell dumpsys

返回设备上运行的所有服务的非常大且详细的转储。可以为单个服务请求dumpsys转储,在本例中为输入服务。这个用法是

代码语言:javascript
运行
复制
adb shell dumpsys input_method

这将返回一个小得多的转储,它只是当前输入法管理器的状态。该转储将包括所有当前InputMethod实例、带有输入法管理器客户端通用参数的输入法管理器客户端、输入法客户端状态和输入法服务器状态。输入法管理器客户端的一组通用参数涉及是否显示输入法(例如,软键盘),以及关于输入法显示是否被请求、明确地请求或强制以及它是否被显示的一些参数。

输入法是否被显示是一个令人感兴趣的问题,因为当显示软键盘时输入法为真,而当软键盘未显示时输入法为假。该参数的名称为

mInputShown

并将看起来像

mInputShown=true

mInputShown=false

取决于软键盘是否显示。

下一步是在monkeyrunner脚本中使用此信息。MonkeyDevice类包括一个方法,用于从monkeyrunner对桥的使用中运行ADB shell命令,并返回一个对象,该对象是执行ADB shell命令后返回给ADB shell的值。在monkeyrunner脚本中,这看起来像

代码语言:javascript
运行
复制
shell_cmd_return_stuff = device.shell('dumpsys input_method')

其中device是所连接设备的MonkeyDevice类的实例,shell_cmd_return_stuff是保存所有外壳命令输出的变量--在本例中是转储输出。最后,由于我们要在文本中查找特定的参数/值对,并且知道它的样子,因此可以使用标准Jython在返回的输出中查找该字符串,而无需将其保存在变量中并使用Jython string in布尔运算符

代码语言:javascript
运行
复制
if ('mInputShown=true' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is showing goes here>

代码语言:javascript
运行
复制
if ('mInputShown=false' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is not showning goes here>

取决于我们是否想知道软键盘当前是否显示。

享受吧!

票数 4
EN

Stack Overflow用户

发布于 2012-10-23 06:05:41

我找到了一个克服这个问题的方法。因此,基于此,我编写了以下函数。

代码语言:javascript
运行
复制
def isKeyboardShown():                                                                                                                                                                                          
     return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12903907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档