Android小知识总结

  |   0 评论   |   534 浏览

onCreate中计算View的高度

可以借助getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度,示例代码如下:


mWebView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mWebView.getWidth();
                mWebView.getHeight();
                //防止调用多次
                mWebView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });

PopupWindow计算高度

PopupWindow在初始化创建好后,我想知道它的高度和宽度,可以这样计算: 

popupWindow.getContentView().measure(0, 0);
popupWindow.getContentView().getMeasuredWidth();
popupWindow.getContentView().getMeasuredHeight(); 

Theme.NoDisplay

在Android中想进行一些无界面的处理又不适合使用service时,此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:

android:theme=”@android:style/Theme.NoDisplay  

activity父级activity的重建

当我们从其他App跳转到我们应用内部时,可能我们跳转到的不是应用的第一层级页面而是深层次的页面,这时候我们需要在关闭应用内部页面时,对高层的页面进行重建。

  1. 为activity指定父级activity

<application> 
    <!-- 首层activity -->
    <activity android:name="com.example.Mainactivity"/> 
     <!-- 第二层级activity -->
     <activity android:name="com.example.SecondeActivity" android:parentActivityName="com.example.Mainactivity" > 
         <!-- 父activity的meta-data,用来支持4.0以下版本 -->
         <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.Mainactivity" />
     </activity>
</application>  
 二级页面返回时,重建任务栈 
@Override 
public void onBackPressed() { 
    // 获得指向父级activity的intent,NavUtils在support v4 包中 
    Intent upIntent = NavUtils.getParentActivityIntent(this); 
    // 判断是否需要重建任务栈 
    if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
         // 这个activity不是这个app任务的一部分, 所以当向上导航时创建
         // 用合成后退栈(synthesized back stack)创建一个新任务。
          TaskStackBuilder.create(this)
         // 添加这个activity的所有父activity到后退栈中
          .addNextIntentWithParentStack(upIntent)
           // 向上导航到最近的一个父activity
           .startActivities();
     } else {
         // 这个activity是这个app任务的一部分, 所以
         // 向上导航至逻辑父activity.
         NavUtils.navigateUpTo(this, upIntent);
     }
     super.onBackPressed();
}   

兼容低版本修改图片的tintColor

drawable.setColorFilter(Color.RED,PorterDuff.Mode.SRC_IN);  

使用dumpsys命令查看系统信息

dumpsys命令很强大,可以查看当前系统的信息,用的还比较多,dumpsys常用命令如下:

dumpsys     [options]
             meminfo 显示内存信息
             cpuinfo 显示cpu信息
             account 显示accounts信息
             activity 显示所有的activities信息
             window 显示键盘、窗口信息
             wifi 显示wifi信息    
例如:查看某个程序内部内存信息 

adb shell dumpsys meminfo 包名 or pid

再或者查看当前打开app的页面信息,这个很有用
adb shell dumpsys window windows | grep -E 'mCurrentFocus'    
结果类似如下: 
mCurrentFocus=Window{43469d60 u0 com.jikexueyuan.geekacademy.debug/com.jikexueyuan.geekacademy.ui.activity.ActivityHomeV3}  

Recyleview的LayoutManager设置成StaggeredGridLayoutManager后获取某个字view的spanIndex(也就是在第几列)

private static class MyItemDecoration extends RecyclerView.ItemDecoration {
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int index = ((StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex();
    } 

如果获取当前手机为每个app分配的堆大小,也就是内存大小

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
int heapSize = manager.getMemoryClass(); 
注意:这里获得heapSize是M为单位返回的
	duplicate entry: android/support/annotation/ColorRes.class

解决方案,只需要在app下的build.gradle加入以下配置就好了:

configurations { all*.exclude group: 'com.android.support', module: 'support-v4' }   

方便快捷实现Activity变暗,并带有动画 

  /**
     * 调整窗口的透明度
     * @param from>=0&&from<=1.0f
     * @param to>=0&&to<=1.0f
     * 
     * */
    private void dimBackground(final float from, final float to) {
        final Window window = getWindow();
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);
        valueAnimator.setDuration(500);
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.alpha = (Float) animation.getAnimatedValue();
                window.setAttributes(params);
            }
        });

        valueAnimator.start();
    } 
然后这样调用 
/** 窗口背景变暗*/
dimBackground(1.0f,0.5f);
/** 窗口背景变亮*/
dimBackground(0.5f,1.0f); 

>