一、内部类的”this指代”导致的问题

现今有两个activity,分别为aaaActivity和bbbActivity。在aaaActivity的某个内部类代码(经常是Handler和监听器)中,若要实现从aaaActivity跳转到bbbActivity的逻辑,则如下是错误的:

startActivity(new Intent(this, bbbActivity.class));

应该是:

startActivity(new Intent(aaaActivity.this, bbbActivity.class));

总之记住,在内部类中编写逻辑代码要细心,出了错,检查一下是不是指代问题。



二、在Activity的某个生命周期方法(比如onCreate()方法)中使用自定义方法的便捷做法
  1. 常规做法便是先在Activity中定义该自定义方法(和其他生命周期方法同级),比如initView();然后在生命周期方法中调用该方法。
  2. 利用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)

  1. 修改被导入项目的 app->build.gradle中的compileSdkVersion、targetSdkVersion为项目A的compileSdkVersion、targetSdkVersion。
  2. 修改被导入项目的 app->build.gradle中的dependencies依赖,改implementation ‘com.android.support:appcompat-vx:xx.x.x’ 为项目A的implementation ‘com.android.support:appcompat-v7:26.1.0’。
  3. 然后再clean project、rebuild project,然后运行。
  4. 此时会有一些提示信息,让你去sync。其实就是要同步下载此项目的版本用到的依赖。
  5. 下载完依赖,再运行,就跑通了。



五、在xml中要对某些控件(比如Button)设置背景透明

其实,换个角度来想,就是要设置为”没有背景”。这样的话,就很简单了,只要为该控件添加下面属性:

android:background="@null"



六、从a Activity跳转至 b Activity发生闪退的可能原因

  1. 标题栏样式不一致如果a Activity跳转至其他Activity不发生闪退,那一定是b Activity的原因。可能是b Activity的ActionBar标题栏样式与a Activity不一致导致的冲突。
  2. 目标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()方法。