一、内部类的”this指代”导致的问题
现今有两个activity,分别为aaaActivity和bbbActivity。在aaaActivity的某个内部类代码(经常是Handler和监听器)中,若要实现从aaaActivity跳转到bbbActivity的逻辑,则如下是错误的:
startActivity(new Intent(this, bbbActivity.class));
应该是:
startActivity(new Intent(aaaActivity.this, bbbActivity.class));
总之记住,在内部类中编写逻辑代码要细心,出了错,检查一下是不是指代问题。
二、在Activity的某个生命周期方法(比如onCreate()方法)中使用自定义方法的便捷做法
- 常规做法便是先在Activity中定义该自定义方法(和其他生命周期方法同级),比如
initView();
然后在生命周期方法中调用该方法。- 利用AS的智能代码提示,可以先在生命周期方法中调用该方法,此时该方法名爆红;然后鼠标移至该方法名,Alt+enter,AS便会帮你创建该方法的方法体(默认是
private void xxx(){}
),此时再实现该方法即可。
三、当activity界面中有许多待监听的控件时如何做比较易于管理
(设已经通过findViewById
获取到三个待监听的控件实例aa、bb、cc,它们原来的id分别是a、b、c)
1、 在Activity中定义一个自定义方法
initView()
或init()
,设置所有控件的监听器为该Activity。
在这个方法中实现界面的初始化,具体来说,就是findViewById
获取控件实例,然后绑定监听器……等。其中绑定监听器使用:
aaa.setOnClickListener(this);
bbb.setOnClickListener(this);
ccc.setOnClickListener(this);
2、 让该Activity实现监听器接口。
此时this都会爆红,将鼠标移至this上面,按Alt+enter,选择“ Make ‘当前Activity名字’ implement ‘android.view.View.OnClickListener’ ” ,在弹出的“Select Methods to Implement” 框中选择onClick()方法。之后,AS便会帮你将当前Activity实现监听器接口。具体就是帮你把当前Activity添加上“implements View.OnClickListener
”语句,并在Activity中定义了onClick
方法的方法体。(onClick ()
方法与Activity的其他生命周期方法同级!)
3、实现
onClick()
方法。
其实就是用switch语句来统一实现和管理各个控件的监听事件,如下:
//设置各个控件的监听事件
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.a:
......
break;
case R.id.b:
......
break;
case R.id.c:
......
break;
}
}
四、在AS导入别人(或GitHub)的AS项目代码
刚开始是无法运行的,大多是版本原因导致的错误,此时:(设之前在你的AS上运行无问题的项目为项目A)
- 修改被导入项目的 app->build.gradle中的compileSdkVersion、targetSdkVersion为项目A的compileSdkVersion、targetSdkVersion。
- 修改被导入项目的 app->build.gradle中的dependencies依赖,改implementation ‘com.android.support:appcompat-vx:xx.x.x’ 为项目A的implementation ‘com.android.support:appcompat-v7:26.1.0’。
- 然后再clean project、rebuild project,然后运行。
- 此时会有一些提示信息,让你去sync。其实就是要同步下载此项目的版本用到的依赖。
- 下载完依赖,再运行,就跑通了。
五、在xml中要对某些控件(比如Button)设置背景透明
其实,换个角度来想,就是要设置为”没有背景”。这样的话,就很简单了,只要为该控件添加下面属性:
android:background="@null"
六、从a Activity跳转至 b Activity发生闪退的可能原因
- 标题栏样式不一致如果a Activity跳转至其他Activity不发生闪退,那一定是b Activity的原因。可能是b Activity的ActionBar标题栏样式与a Activity不一致导致的冲突。
- 目标Activity是否有注册b Activity是否在AndroidManifest.xml中注册了。如果已经注册了,它的位置是否正确放置在
<application></application>
中。
(特别的,当看到错误日志中的ActivityNotFoundException,十有八九就是目标Activity忘记注册了)
七、启动app时发生闪退的可能原因
1、app需要的权限是否已经声明。
一般是AndroidManifest.xml中忘记配置相关权限。
2、xml布局文件不合理。
一些控件的特定属性忘记添加。
3、APP的sdk和手机的系统不兼容。
八、findViewById返回null的可能原因
1、在另一个view的元素应该用
baseView.findViewById()
来拿控件实例。
findViewById()
是要指定view的,如果在该view下找不到,自然报null。平时注意养成写view.findViewById()
的习惯就不容易错了。
2、
findViewById
被放在setContentView(R.layout.main);
之前。
即在setContentView
调用之前,调用了findViewById
去找main布局中的界面元素,那么所得到的一定是null。正确的做法是将findViewById
挪至setContentView
方法调用之后即可。
3、clean一下工程,让ID重新生成。
这种情况是调用LayoutInflater.inflate
将布局xml规定的内容转化为相应的对象。
比如有rowview.xml布局文件(比如在自定义Adapter的时候,用作ListView中的一行的内容的布局),假定在自定的Adapter的getView方法中有类似如下的代码:
View rowview = (View)inflater.inflate(R.layout.rowview, parent, false);
TextView tv_contact_id =(TextView)rowview.findViewById(R.id.tv_contact_id);
TextView tv_contact_name =(TextView)rowview.findViewById(R.id.tv_contact_name);
发现rowview非空,但tv_contact_id和tv_contact_name都是null!仔细看代码,怎么也看不出错误来。到底是什么原因造成的呢?其实是Eclipse造成的,要解决这个问题,需要将这个项目clean一次(Project菜单 -> Clean子菜单),这样就OK了。
4、setContentView使用错误的布局xml。
导致该布局文件中不包含你所需的控件。
九、finish()方法在Activity跳转中的作用
1、解释说明
原来像下面代码这样用 Intent 从 A activity 跳到 B activity :
startActivity(new Intent(A.this, B.class));
当成功跳到 B activity 的时候再点击返回键,就再次返回到了 A activity 页面中。
而在跳转逻辑完成后加一句finish();
startActivity(new Intent(A.this, B.class));
finish();
这样,当从 A activity 跳转到 B activity 的时候,再点击返回键,B activity 会跳转到 A activity 之前的那个 activity,而不会返回到 A activity (如果 A activity是主界面, 即 A activity 之前没有 activity,那么会直接返回到手机主界面)。
2、页面跳转时finish()方法应用的业务场景
- 场景1
在很多APP中,首次进入APP时需要登录才能进入到APP首页,但成功登录并跳转到APP的首页后,再按返回键,应该直接返回到手机主界面而不是登录界面。 - 场景2
在订单列表中,A activity 中点击新建订单进入新建订单 B activity 中,点击保存后,跳转到订单详情 C activity 中(在 B activity 的跳转到 C activity 时加入finish()
方法),在 C activity 中点击返回键就可以直接返回到 A activity 中。
3、结论
跳转后再按返回键时,不需要返回到原 activity 时就可以使用finish()
方法。