Android学习过程中的一些知识点梳理

最近基于项目需要,在自学安卓,学习和项目实践过程中遇到的了一些问题,解决问题后作下记录。

  1. 监听抽屉的打开关闭事件
    (1)mDrawLayout.setDrawerListener(DrawerLayout.DrawerListener)
    (2)ActionBarDrawerToggle是DrawerLayout.DrawerListener的具体实现类

    改变android.R.id.home图标(构造方法)
    Drawer拉出、隐藏,带有android.R.id.home动画效果(syncState())
    监听Drawer拉出、隐藏事件
    

    (3)覆写ActionBarDrawerToggle的onDrawerOpen()和onDrawerClose()以监听抽屉拉出或隐藏事件
    (4)覆写Activity的onPostCreate()和onConfigurationChanged()方法

  2. startScroll (int startX, int startY, int dx, int dy)以提供的起始点和将要滑动的距离开始滚动。滚动会使用缺省值250ms作为持续时间。

    startX 表示起点在水平方向到原点的距离(可以理解为X轴坐标,但与X轴相反),正值表示在原点左边,负值表示在原点右边。
    dx 表示滑动的距离,正值向左滑,负值向右滑。dy类似,与现实所想相反(奇葩呀),需要注意。

  3. 隐藏标题栏:Activity的onCreate()中,于setContentView()之前执行。

    1
    2
    3
    4
    5
    6
    7
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    ```
    4. 隐式Intent 可以指定一些协议,如:http,显示地理位置的geo,拨打电话的tel.其setData 方法指定操作数据,如打开拔号界面:
    ```java
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("tel:10086"));
  4. onSaveInstanceState(Bundle bundle) 方法保存临时数据.

  5. 对于返回数据给上一个活动,上一个活动中通过startActivityForResult(intent)跳转到当前活动,并在上一个活动中的onActivityResult(int requestCode, int resultCode, Intent data)
    方法中处理返回数据。当前活动可通过一个事件触发返回数据,也可在onBackPressed()方法中通过返回键返回数据。执行代码如下:

    1
    2
    3
    4
    Intent intent = new Intent();
    ......
    setResult(RESULT_OK,intent);
    finish();
  6. 启动模式
    standard:每个启动都会创建该活动的一个实例。
    singleTop:在启动活动时,如果发现返回栈(Back Stack)的栈顶已经是该活动,则直接使用此活动,不再创建其实例。
    singleTask:每次启动该活动时,首先检查返回栈中是否存在该活动的实例,如果存在,则直接使用该实例,并把此活动之上的所有活动出栈, 如果没有才创建一个新的实例。
    singleInstance: 启动一个新的返回栈。

  7. 对于从一个活动到另一个活动传参问题。在另一活动最好定义一静态方法,名字如actionStart(),写明参数,使用时根据代码提示传入上下文和参数。

  8. PreferenceActivity(Android 3.0以后应使用PreferenceFragment)中有三种常用的控件分别为:checkboxPreference、listPreference和edittextPreference。

  9. TextUtils.isEmpty()方法可以判断字符串是否为空或空字符串。

  10. SQLite新旧数据更替时,最好使用事务,确保没有数据丢失。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    db.beginTransaction();//开始一个事务
    try {
    ...
    db.setTransactionSuccessful();//事务已经执行成功
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    db.endTransaction();//结束事务
    }
  11. keytool -v -list -keystore d:\tools\android\mykey.jks 通过签名文件获取SHA1值。

  12. 在线程里通过 runOnUiThread() 方法可回到主线程。

  13. 请求父控件及祖宗控件不要拦截事件

    1
    2
    3
    4
    5
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    getParent().requestDisallowInterceptTouchEvent(true);
    return super.dispatchTouchEvent(ev);
    }
  14. WebView 的一些设置

    1
    2
    3
    4
    WebSettings = settings = mWebView.getSettings();
    settings.setJavaScriptEnabled(true);// 支持JS,默认是关闭JS功能的
    settings.setBuiltInZoomControls(true);//显示放大缩小按钮
    settings.setUseWideViewPort(true); //支持双击缩放
  15. 使用LruCache可避免内存溢出的情况,(lru即最Least recently use),其会将内存控制在一定的大小之内,这个临界值由开发者自己定。

  16. 使用xUtils3的网络模块可下载文件

    1
    2
    3
    4
    ...
    params.setSaveFilePath(filePath); //传入文件路径
    x.http().get(params, new Callback.ProgressCallback<File>() //泛型一定为File
    时才能下载文件
  17. 打开系统下载安装APK文件

    1
    2
    3
    4
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setDataAndType(Uri.fromFile(result),"application/vnd.android.package-archive");
    startActivityForResult(i, 0); //根据返回结果可作进一步操作
  18. 禁止Checkbox的点击事件,设置父控件拦截的两种方法

    • 布局设置属性如下,不知为何不管用

      1
      2
      3
      android:clickable="false"
      android:focusable="false"
      android:focusableInTouchMode="false
    • 获取其实例后,设置如下

      1
      2
      cbStatus = (CheckBox) findViewById(R.id.cb_status);
      cbStatus.setClickable(false);
  19. adb devices 可罗列出本地所有的设备
    adb shell 进入真机或模拟器,shell前可加参数
    -d Direct an adb command to the only attached USB device.
    -e Direct an adb command to the only running emulator instance.

  20. 设置界面之间跳转的动画

    1
    2
    3
    4
    5
    6
    public void next(View view) {
    startActivity(new Intent(this, Setup2Activity.class));
    finish();
    //两者界面切换动画的设置
    overridePendingTransition(R.anim.next_in, R.anim.next_out); //进入和退出的动画
    }
  21. onClick多击事件的实现

    1
    2
    3
    4
    5
    6
    7
    long[] mHits = new long[2]; //数组长度为点击的次数,长度2则为双击
    private void onDoubleHit( ) {
    System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);
    mHits[mHits.length-1] = SystemClock.uptimeMillis();
    if (mHits[0] >= SystemClock.uptimeMillis()-500) {
    ...
    }
  22. Android 5.x中可用Palette提取颜色,从而让主题动态地适应当前页面的颜色,使用时需要添加依赖。

  23. Imageview设置selector时,pressed的item要放在上面,默认的item要置于下面才会有点击的效果,否则看不到任何效果。