Android怎么在非activity的类里修改控件?

前面的文章说到了App横竖屏切换的时候会销毁当前的Activity然后重新创建一个,我们可以自行在生命周期的每个方法里都添加打印Log的语句,以此来进行判断。又或者设一个按钮一个TextView点击按钮后,修改TextView 文本,然后横竖屏切换,这时我们就会发现TextView文本变回之前的内容了。

1、禁止屏幕横竖屏自动切换

  • unspecified:默认值,由系统来判断显示方向,判定的策略是和设备相关的,所以不同的设备会有不同的显示方向。
  • landscape:横屏显示(宽比高要长)。
  • portrait:竖屏显示(高比宽要长)。
  • user:用户当前首选的方向。
  • sensor:由物理的感应器来决定,如果用户旋转设备这屏幕会横竖屏切换。
  • nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。

2、横竖屏时想加载不同的布局

(1)方法一:准备两套不同的布局

Android会自己根据横竖屏加载不同布局,方法是创建两个布局文件夹:layout-land横屏、layout-port竖屏,然后把这两套布局文件丢这两文件夹里,文件名一样,Android就会自行判断,然后加载相应布局了!

(1)方法二:自己在代码中进行判断

这样的话我们就能自己想加载什么就加载什么,我们一般是在onCreate()方法中加载布局文件的,我们可以在这里对横竖屏的状态做下判断,关键代码如下:

这个其实我们之前说过了,通过一个Bundle savedInstanceState参数即可完成,三个核心方法是:

这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个Activity。可能你会觉得挺纳闷的,我自己写的代码怎么会不知道这是哪一个Activity呢?很不幸的是,在你真正进入到企业之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是你需要在某个界面上修改一些非常简单的东西,但是你半天找不到这个界面对应的活动是哪一个。学会了本节的技巧之后,这对你来说就再也不是难题了。

这样我们就在 onCreate() 方法中获取了当前实例的类名,并通过 Log 打印了出来。

接下来我们需要让 BaseActivity 成为工程项目中所有具有共同属性的Activity的父类,这样虽然项目中的Activity不再直接继承自 Activity 了,但是它们仍然完全继承了 Activity 中的所有特性,并且加入了我们最新的功能。

有时我们可能会打开了很多个Activity,突然来个这样的需求,在某个页面可以关掉所有的Activity并退出程序。别以为这不会是真的,比如如果目前你手机的界面还停留在 SecondActivity,你会发现当前想退出程序是非常不方便的,需要连按两次 Back 键才行。有可能你会说:按Home键就行了呀。但是按 Home 键只是把程序挂起,并没有退出程序。所以这个问题就足以引起我们的思考,如果我们的程序需要一个注销或者退出的功能该怎么办呢?必须要有一个随时随地都能退出程序的方案才行。

好吧,下面提供一个关闭所有Activity的方法, 就是用一个list集合来管理所有Activity,然后就方便后续的退出操作了。

新建一个 ActivityCollector 类作为活动管理器,代码如下所示:

从此以后,不管我么想在什么地方退出程序,只需要调用 ActivityCollector.finishAll() 方法就可以了。

上面说的是关闭所有Activity的,但是有些时候我们可能想杀死整个App,连后台任务都杀死 杀得一干二净的话,可以使用搭配着下述代码使用:

首先,我们提供一种使用命令行查看当前所有Activity的命令

使用下述命令即可,前提是你为SDK配置了环境变量:

其次,我们可以用这个Activity管理类来更精确的管理Activity:

* 获取当前Activity(堆栈中最后一个压入的) * 结束当前Activity(堆栈中最后一个压入的)

1、定义一个变量来标识是否退出

// 利用handler延迟发送更改状态信息

假设 SecondActivity 中需要用到两个非常重要的字符串参数,在启动 SecondActivity 的时候必须要传递过来,那么我们很容易会写出如下代码:

这样写是完全正确的,不管是从语法上还是规范上,只是在真正的项目开发中经常会有对接的问题出现。比如 SecondActivity 并不是由你开发的,但现在你负责的部分需要有启动 SecondActivity 这个功能,而你却不清楚启动这个Activity需要传递哪些数据。这时无非就有两种办法,一个是你自己去阅读 SecondActivity 中的代码,二是询问负责编写 SecondActivity 的同事,但这样你会不会觉得很麻烦呢?其实只需要换一种写法,就可以轻松解决掉上面的窘境。

这样写的好处在哪里呢?最重要的一点就是一目了然, SecondActivity 所需要的数据全部都在方法参数中体现出来了,这样即使不用阅读 SecondActivity 中的代码,或者询问负责编写 SecondActivity 的同事,你也可以非常清晰地知道启动 SecondActivity 需要传递哪些数据。另外,这样写还简化了启动活动的代码,现在只需要一行代码就可以启动 SecondActivity,如下所示:

养成一个良好的习惯, 给你编写的每个Activity都添加类似的启动方法,这样不仅可以让启动Activity变得非常简单,还可以节省不少你同事过来询问你的时间。

不过有的时候这种方法并不能奏效,解决方法有两种:

(2)Activity对话框风格的实现

在某些情况下,我们可能需要将Activity设置成对话框风格的,Activity一般是占满全屏的, 而Dialog则是占据部分屏幕的,实现起来也很简单。

// 设置左上角小图标

所谓的过场动画就是切换到另外的Activity时加上一些切换动画,比如淡入淡出,放大缩小,左右互推等。当然,我们并不在这里详细讲解动画,后面我们会有专门的篇幅来讲解这个,这里只教大家如何去加载动画,另外给大家提供了一些比较常用的过渡动画,只要将相关动画文件添加到res/anim目录下,然后下述方法二选一 就可以实现Activity的切换动画了。

通过style进行配置,这个是全局的,就是所有的Activity都会加载这个动画。

其中的四个item分别代表:

好的,Activity过场动画就这样设置好了。

这种方法比较简单,只有一个步骤,只需要在配置文件中把需要设置为透明的Activity的样式设置为:

即可,这种方式只改变背景的颜色,对其他控件没有影响,但是它只能把背景设置为完全透明,如果要设置为半透明或者要设置透明的程度无法实现。

这种方法也比较简单,只需要在方法一的基础上,再布局文件中配置背景颜色就可以:

“#”中的“01”表示的是背景透明的程度,这个值只能设置01及以上的值,不能设置为00,及不能设置为完全透明,不过设置为01其实和透明的效果也很接近了,肉眼几乎看不出来区别了,这种方法同样对其他控件没有影响。

这种方法稍微复杂些,有几个步骤,这种方法对其他控件的透明度也会产生影响,并且可以自己设置透明的程度,相对来说要灵活一些。

  • 在res/values下建立colors.xml文件,设置一个背景颜色,在这里可以设置你背景的颜色和透明度。

如果想设置所有的activity都使用这个风格,可以把这句标签语句添加在<application>中。

这个方法不仅对背景透明有效,而且对其他控件也有效,如果其他控件没有设置背景颜色,会呈现出透明的效果。这种方法比较复杂些,如果不是需要对整个页面及控件都有透明度要求,建议使用前面两种方法。

感谢优秀的你跋山涉水看到了这里,欢迎关注下让我们永远在一起!

这里需要把Instrumentation类的视频的上、中、下三集一起看,把内容总结一下。。。

如何在一个app中做event事件?(touch、滑动和按键等)

1、Robotium的运行原理是什么?

根本原因是因为:setup和teardown是junit必须执行的生命周期函数,所有的Test类都是基于这个做的,所以必须要有这两个方法才行。

答:按照理解,这个配置的Instrumentation节点的anroid:name指的就是用以启动的TestRuner的名,只有配置了这个之后,测试程序才能够启动起来,这个启动过程应该又回到上一篇Robotium里面记录的那样了,运行一个测试程序,会先运行一个系统工具Activity Manager,然后Activity

Instrumentation是执行Application Instrumentation代码的基类,当应用程序运行的时候Instrumentation处于开启(备注:需要了解应用程序运行之前就已经开启哪些东西?),Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的交互。

Instrumentaion比较像Windows里面的钩子(Hook),在系统和应用程序之间装了一个特殊装置用以进行监听

1、准备安卓的环境(java环境、eclipse、环境变量配置)

2、写一个安卓的app(被测app)

3、开始写测试框架代码

 测试必须要保证测试app和被测程序签名一致,既然是自己写的,那么肯定是用debug签名比较方便,这样被测代码和测试代码在不同的包中,但是在同一个工程里,签名肯定一致;如果没有源码的话,也需要签名一致,就需要进行重签名了。

具体的代码就是,建一个包名来创建app,然后一个待测程序建立一个包,一个测试程序建立一个包。

Instrumentation对安卓操作系统的版本没有要求,这个是特别好的

serchText方法是将所有的TextView全部找到,放到一个集合中,然后去做对比(通过正则表达式)

InstrumentationTestCase2的。其实东西都是一样的,就是你要知道包名,然后知道类名,然后通过这个类名去findViewById来获取到你需要的控件ID,之后调用方法对这个控件进行操作(包括sendPointSync等注入事件、runOnMainSync、runOnUiThread方法等来操作控件),之后根据当前控件的状态,与你预期想要的状态做一个对比,就可以知道是否达到了想到的结果。另外,还需要在AndroidManifest.xml中进行<Instrumentation>节点的配置,用以告诉ActivityManager要用什么TestRunner。

sendPointerSync方法(能够产生手指操作控件的响应效果)

解决方案:直接在AndroidManifest.xml中进行配置,如果出现类似的这种涉及到perssion的问题,也是类似,直接在Manifest.xml中配置即可,应该都能解决。

说明:得到上下文的一个引用,就可以进一步得到view、windows、控件

说明:以同步方式start一个Activity,即这是一个阻塞性的方法,必须要start起这个Activity之后,返回了结果,然后程序才能继续往下走

所谓同步:就是发出一个请求后什么事都不做,一直等待请求返回后才会继续做事;

所谓异步:就是发出请求后继续去做其他事,这个请求处理完成后会通知你,这时候就可以处理这个回应了。

发送一个具体的点触事件,MotionEvent有obtain方法,可以针对具体的Down或者UP事件进行操作,在某一个特定的坐标位置,通过这个能够看到测试case时,程序上会出现被点击选中的阴影效果,而直接调用button.performClick()方法是没有这个效果的。

新浪微博:金阳光woody

1、百度搜:金阳光测试

修改MainActivity,实现功能,打印Log观察生命周期方法的调用:

我要回帖

更多关于 android标题栏如何修改 的文章

 

随机推荐