Android结合robotium实现自定义waitForText(String text),解决控件无法找到问题

Android结合robotium实现自定义waitForText(String text),解决控件无法找到问题

可能有人会问,robotium自带了waitForText(String text)方法为何还需要自己写,首先看其最终执行的代码片段如下:

1 if(scroll && !scroller.scrollDown()){
2             logMatchesFound(regex);
3             return null;
4         }
5         if(!scroll){
6             logMatchesFound(regex);
7             return null;
8         }      

我们知道方法在执行的时候会首先在当前界面查找控件,但是当前界面未找到指定view的时候则会调用solo.scrollDown()方法,但在实际自动化编码过程中会发现上面的方法并不一定完全适合自己。
查看solo.scrollDown()最终的代码:

01     /**
02      * Scrolls up and down.
03      *
04      * @param direction the direction in which to scroll
05      * @param allTheWay <code>true</code> if the view should be scrolled to the beginning or end,
06      *                  <code>false</code> to scroll one page up or down.
07      * @return {@code true} if more scrolling can be done
08      */
09  
10 public boolean scroll(int direction, boolean allTheWay) {
11  
12         final ArrayList viewList = RobotiumUtils.
13                 removeInvisibleViews(viewFetcher.getAllViews(true));
14         @SuppressWarnings("unchecked")
15         ArrayList views = RobotiumUtils.filterViewsToSet(newClass[] { ListView.class,
16                 ScrollView.class, GridView.class, WebView.class}, viewList);
17         View view = viewFetcher.getFreshestView(views);
18  
19         if (view == null)
20         {
21             return false;
22         }
23  
24         if (view instanceof AbsListView) {
25             return scrollList((AbsListView)view, direction, allTheWay);
26         }
27  
28         if (view instanceof ScrollView) {
29             if (allTheWay) {
30                 scrollScrollViewAllTheWay((ScrollView) view, direction);
31                 return false;
32             else {
33                 return scrollScrollView((ScrollView)view, direction);
34             }
35         }
36         if(view instanceof WebView){
37             return scrollWebView((WebView)view, direction, allTheWay);
38         }
39         return false;
40     }

上面代码以要拖动的为listview为例,假如拖动的界面是listview那么则会调用下面的代码片段:

1 if (view instanceof AbsListView) {
2     return scrollList((AbsListView)view, direction, allTheWay);
3 }

有兴趣可以继续追scrollList的实现(其实就是view.setSelection(lineToMoveTo)),那么每次拖动多少距离呢,从这里可以看出实际上模拟拖动的距离是和listview的item的高度有关,因此引出下面我们要自定义waitforText()方法的原因;下面是我画的一张图:
sh1

可以点击放大查看,主要描述的意思是当listview的第一个item的高度超过一屏,而且item中又存在多个控件,要查找字符串为“robotium中文网”的控件,且实际是在屏幕外面的,并且在实际的软件界面可能没有加载进来,如果用robotium的solo.waitForText(“robotium中文网”)方法执行查找时,流程为首先在当前界面查找,未找到则执行scrollDown()向下滚动,假如我认为最小只滚动1行的距离,那么出现的可能原因是要查找的显示为”robotium中文网”的view从屏幕下方外滚动到屏幕上方外,此时再执行当前界面查找时也不会找到该控件,因此出现明明有这个控件但是solo.waitForText()无法找到的情况。我们没必要从头写,直接借鉴和结合robotium即可:

01 * search Text
02 @param solo
03 @param text
04 @return
05 */
06 public static boolean waitForText(Solo solo, String text){
07         final long endTime = SystemClock.uptimeMillis() + TIMEOUT;
08         boolean foundAnyMatchingView = false;
09         int y = 100;  //自定义滚动距离,指定滑动屏幕高度的1/4距离也可以
10         while (SystemClock.uptimeMillis() < endTime) {
11             foundAnyMatchingView = solo.waitForText(text, 0,1false);
12             if (foundAnyMatchingView){
13                 return true;
14             }
15             scrollVertical(solo, y);
16         }
17         return foundAnyMatchingView;
18     }

scrollVertical(solo, y)方法是如何来的呢,请移步:http://www.robotium.cn/archives/1323

若有错误,欢迎指正!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现步数统计的功能可以使用Android系统提供的传感器API,例如计步器传感器。而加入数据库的功能,则需要使用Android系统提供的SQLite数据库API。 下面是一个简单的实现步数统计并加入数据库的自定义控件的示例: 1. 创建一个自定义控件类,继承自View或其子类。 ``` public class StepCounterView extends View implements SensorEventListener { private SensorManager sensorManager; private Sensor stepSensor; private int stepCount = 0; private boolean isSensorActive = false; public StepCounterView(Context context) { super(context); init(); } public StepCounterView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public StepCounterView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { sensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE); stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (stepSensor != null) { sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL); isSensorActive = true; } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (isSensorActive) { sensorManager.unregisterListener(this); isSensorActive = false; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制步数 String text = "步数:" + stepCount; Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setTextSize(50); canvas.drawText(text, 0, 50, paint); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) { stepCount = (int) event.values[0]; // 更新UI invalidate(); // 将步数保存到数据库中 saveToDatabase(stepCount); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void saveToDatabase(int stepCount) { // 创建数据库 SQLiteDatabase db = getContext().openOrCreateDatabase("step.db", Context.MODE_PRIVATE, null); // 创建表 db.execSQL("CREATE TABLE IF NOT EXISTS step (id INTEGER PRIMARY KEY AUTOINCREMENT, step_count INTEGER)"); // 插入数据 ContentValues values = new ContentValues(); values.put("step_count", stepCount); db.insert("step", null, values); // 关闭数据库 db.close(); } } ``` 2. 在布局文件中添加自定义控件。 ``` <com.example.StepCounterView android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 3. 运行程序,即可看到实时步数的显示,并且步数也会被保存到名为“step.db”的数据库中。 ### 回答2: 要实现Android中的自定义控件实现步数统计并加入数据库的功能,可以按照以下步骤进行: 1. 创建一个自定义控件,继承自Android中的View类,并实现自己的界面布局和逻辑。 2. 在自定义控件中,可以使用SensorManager类来获取传感器数据,如加速度传感器或计步传感器,用于实时地获取步数信息。 3. 在自定义控件中,可以使用SQLiteOpenHelper类来创建一个数据库,并定义数据库的表结构,用于存储步数信息。 4. 在自定义控件中,可以使用ContentValues类来组装步数信息的数据,并通过SQLiteDatabase类来插入数据库中。 5. 在自定义控件中,可以使用SharedPreferences类来保存用户的步数目标和历史步数数据,以便实现目标的设定和步数统计的管理。 6. 在自定义控件中,可以使用Paint类来绘制步数信息的界面,如文字、图标等,以便将统计结果显示在界面上。 7. 在使用自定义控件的Activity中,可以通过findViewById方法找到控件,并根据需要设置控件的属性和监听器。 通过以上步骤,就可以实现Android中的自定义控件实现步数统计并加入数据库的功能。用户可以使用该控件来实时统计步数,并将步数信息存储到数据库中,方便后续查看和管理。 ### 回答3: 要实现 Android 中的自定义控件实现步数统计并加入数据库的功能,可以按照以下步骤进行。 首先,创建一个自定义的视图类,继承自 Android 的 View 类。在该类中,定义用于展示步数的 TextView 控件,并提供一些方法用于更新步数的显示。 其次,为该自定义视图类添加一些必要的属性和方法,比如记录当前步数的变量、获取、设置步数的方法等。 然后,为了实现步数的统计功能,我们需要在该自定义视图类中添加与传感器相关的代码。可以使用 Android 提供的传感器 API,如 SensorManager、SensorEventListener 等。通过注册传感器监听器,并在监听器中根据步行算法来统计步数的变化。 接着,我们需要将统计到的步数存入数据库中。首先,创建一个数据库类,继承自 Android 的 SQLiteOpenHelper 类。在该类中,定义用于创建和升级数据库的方法,并提供一些方便操作数据库的方法,比如插入数据、查询数据等。 在自定义视图类中,获取到步数后,调用数据库类的方法将步数存入数据库中。可以通过 ContentValues 类来组织要插入的数据,并使用 SQLiteDatabase 类的 insert() 方法将数据插入到数据库中。 最后,在使用该自定义控件的 Activity 中,实例化数据库类,并在合适的地方调用自定义视图类的方法来更新步数的显示,并将获取到的步数存入数据库中。 通过以上步骤,我们就可以实现 Android自定义控件实现步数统计并加入数据库的功能。同时,我们可以通过数据库来保存历史步数数据,并在需要的时候进行查询和展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值