Android知识每日小计

1、java一行一行读取文件:

            InputStreamReader is = new InputStreamReader(new FileInputStream(file));
            BufferedReader br = new BufferedReader(is);
            String line;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            Log.i("csdn", sb.toString());
2、设置activity的样式是dialog

在AndroidManifest.xml中加入:android:theme="@android:style/Theme.Dialog"

当然我们也可以自定义样式:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyDialog" parent="android:style/Theme.Dialog"> 
        <!-- 背景颜色及透明程度  -->
        <item name="android:windowBackground">@android:color/transparent</item> 
       <!--  是否有标题  -->
        <item name="android:windowNoTitle">true</item> 
       <!--  是否浮现在activity之上  -->
        <item name="android:windowIsFloating">true</item> 
        <!-- 是否模糊  -->
        <item name="android:backgroundDimEnabled">true</item> 
    </style>
</resources>
在设置了activity的样式是dialog后点击其他的地方activity会消失,为了不让其消失可以调用:setFinishOnTouchOutside(false);默认参数是true,当然如果显示的是new出来的一个dialog那么可以调用:

dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
3、自定义标题栏

首先新建一个xml布局文件,对布局中的内容可以随便设置

然后在onCreate函数中加入代码:

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebtn);
4、让activity去标题栏全屏显示

    4.1常用方法:

    requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏

    或者是:

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    4.2 在application或activity中加入

    android:theme="@android:style/Theme.NoTitleBar"

5、解决音乐播放器中会出现录音的音频文件:

    MediaStore.Audio.Media.IS_MUSIC这个比较关键,在查询的时候加入条件MediaStore.Audio.Media.IS_MUSIC=1就可以了

6、按back键彻底关闭应用程序

    最近遇到了按back键退出程序后再次点击但是运行效果和第一次运行不一样的情况,最后在onDestroy函数中加上:System.exit(0);就可以了

7、android4.4修改launcher默认显示第几页

    在Launcher模块中的WorkSpace.java文件中有一个mDefaultPage变量,这个变量又是通过getInt(R.styleable.Workspace_defaultScreen, 1);获取的,所以我们查看相关的布局文件,在launcher.xml文件中,看到:

        <com.android.launcher3.Workspace
            android:id="@+id/workspace"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
            launcher:pageSpacing="@dimen/workspace_page_spacing"
            launcher:pageIndicator="@id/page_indicator">
        </com.android.launcher3.Workspace>

有一个defaultScreen属性,在这个属性中是通过config_workspaceDefaultScreen值获得的,所以在config.xml中修改config_workspaceDefaultScreen的值就可以了!

8、异常捕获的问题

   最近用到了AIDL远程服务,但是在调用某个接口的时候一直报出异常,异常开始的位置是通过aidl文件自动生成的java文件,原先我以为这个异常在我自己的代码中并不能捕获,但事实是异常也是会一层一层往上传递的,所以我们可以在自己的代码位置捕获异常,这样就避免了程序会报错的问题。

9、android在4.2之后为了区分阿拉伯语言或其他语言的情况下,因为他们是从右开始往左读的,所以我们可以在代码中通过isLayoutRtl()来判断,我们查看View.java的源码,看到:

    /**
     * Indicates whether or not this view's layout is right-to-left. This is resolved from
     * layout attribute and/or the inherited value from the parent
     *
     * @return true if the layout is right-to-left.
     *
     * @hide
     */
    @ViewDebug.ExportedProperty(category = "layout")
    public boolean isLayoutRtl() {
        return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
    }

isLayoutRtl()方法标识为@hide,所以我们外部是不可以调用了,因此我们在判断是layout is right - to - left可以通过getLayoutDirection == LAYOUT_DIRECTION_RTL就可以了。

    或者我们干脆可以通过系统当前是什么语言来判断,例如:

            getResources().getConfiguration().locale.getCountry().equals("CN");// 中文
            getResources().getConfiguration().locale.getCountry().equals("TW");// 繁体中文
            getResources().getConfiguration().locale.getCountry().equals("UK");// 英文(英式)
            getResources().getConfiguration().locale.getCountry().equals("US");// 英文(美式)
            getResources().getConfiguration().locale.getCountry().equals("EG");// 阿拉伯

10、在需求中有时目标图片可能尺寸太大,我们需要将图片缩小到一定的大小,可以通过下面代码实现:

if (mIconBitmap.getWidth()>context.getResources().getDimensionPixelSize(R.dimen.qhd_app_icon_size_bk)) {
    int app_icon_size = context.getResources().getDimensionPixelSize(R.dimen.qhd_app_icon_size);
    mIconBitmap = Bitmap.createScaledBitmap(mIconBitmap, app_icon_size, app_icon_size, true);
}


11、Canvas.saveLayerAlphafangfa

    默认的Canvas只有一个layer,所以平时我们的操作都是在一张layer上操作,有时如果我们需要多张的话就可以通过SaveLayerXXX, 来创建一些中间层,SaveLayerXXX是对layer进行入栈操作,后续的操作都是在此layer上;我们可以通过restore进行出栈操作。例如:

        protected void onDraw(Canvas canvas) {  
            // TODO Auto-generated method stub  
            super.onDraw(canvas);  
            canvas.drawColor(Color.WHITE);  
            canvas.translate(10, 10);  
            mPaint.setColor(Color.RED);  
            canvas.drawCircle(75, 75, 75, mPaint);  
            canvas.saveLayerAlpha(0, 0, 200, 200, 0x88, LAYERS_FLAGS);  
            mPaint.setColor(Color.BLUE);  
            canvas.drawCircle(125, 125, 75, mPaint);  
            canvas.restore();  
        }  

12、解决android程序退出后出现在最近任务中

    在相应的activity中添加:android:excludeFromRecents="true"

13、setRotation设置控件的旋转角度

    虽然setRotation可以设置控件的旋转角度,但是它的默认旋转中心点是控件的中心点,有时我们需要随便设置控件的旋转中心点,可以通过以下方法设置:

    setPivotX()设置旋转中心的x坐标

    setPivotY()设置旋转中心的y坐标

    但是需要注意的是:有时我们直接设置getwidth()相关的坐标时,要考虑这时获取的宽度是不是真的获取到了,有时可能直接返回的是0.

14、为控件定义一个接口,然后在接口中定义一个方法,在一定的时候让控件执行这个接口的方法。我们可以在需要的时候去实现这个接口,这样控件在调用接口方法的时候调用的就是我们已经实现了的方法。

15、android实现按back键隐藏Activity但是不会销毁

   

    public boolean onKeyDown(int keyCode, KeyEvent event) {// 点击返回键以后,不会使activity销毁,只是隐藏
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);//关键代码
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

16、android自定义字体样式

    1)下载ttf字体文件

    2)在assets目录下新建fonts目录

    3)在需要用到的地方通过以下代码获取样式:

    Typeface fontFace = Typeface.createFromAsset(getAssets(),"fonts/digital.ttf");

    4)为控件指定样式:View.setTypeface(fontFace);

17、在线更改eclipse的配色方案

    在help--install new software,name:ColorTheme;site:http://eclipse-color-theme.github.com/update


18、压缩图片到指定的大小(来自:http://blog.csdn.net/cherry609195946/article/details/9264409#comments)

BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;//只读边,不读内容
		bm = BitmapFactory.decodeResource(getResources(), R.drawable.albumart_mp_unknown, options);
		
		options.inJustDecodeBounds = false;
		int w = options.outWidth;
		int h = options.outHeight;
		
		float ww = 200.0f;
		float hh = 200.0f;
		int be = 1; 
		if (w>h && w>ww) {
			be = (int) (w/ww);
		} else if(w<=h&&h>hh){
			be = (int) (h/hh);
		}
		if (be<=0) {
			be = 1;
		}
		options.inSampleSize = be;//设置采样率
		options.inPurgeable = true;//同时设置才有效
		options.inInputShareable = true;//内存不足时可以回收
		bm = BitmapFactory.decodeResource(getResources(), R.drawable.albumart_mp_unknown, options);
19、将一张图片裁剪成圆形(来自:http://blog.csdn.net/edisonlg/article/details/7084977)

Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
				Config.ARGB_8888);
		Canvas canvas = new Canvas(bmp);
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		int pointX = bm.getWidth() / 2;
		int pointY = bm.getHeight() / 2;
		canvas.drawCircle(pointX, pointY, Math.max(pointX, pointY), paint);
		paint.setXfermode(new PorterDuffXfermode(
				android.graphics.PorterDuff.Mode.SRC_IN));//这里可以设置模式,设置选取重叠部分
		canvas.drawBitmap(bm, 0, 0, paint);
		return bmp;
20、
启动一个Activity,但不显示布局
   <activity android:theme="@android:style/Theme.NoDisplay"> </activity>

21、单例模式

 /** Convenience singleton for apps using a process-wide instance. */
    public static Class getDefault() {
        if (defaultInstance == null) {
            synchronized (Class.class) {
                if (defaultInstance == null) {
                    defaultInstance = new Class();
                }
            }
        }
        return defaultInstance;
    }

22、ViewConfiguration常用的两个方法

    ViewConfiguration.getPressedStateDuration()     //用于检测触摸是不是长按事件
    ViewConfiguration.getTapTimeout()     //用于检测触摸点有没有移动

    ViewConfiguration.get(context).getScaledTouchSlop()    //如果滑动距离大于这个值就认为是滑动

23、IllegalArgumentException : y + height must be <= bitmap.height() 

    今天在launcher代码中缩放图标的时候使用了.createBitmap(mIconBitmap, 0, 0, mIconBitmap.getWidth(), mIconBitmap.getWidth(), matrix,true);但是就会报出异常,导致launcher不停的重启,问题还挺严重的,后来查看资料的时候说最好是使用Bitmap.createScaledBitmap(mIconBitmap, width, width, true)方法不容易出错,果然可以了;但是就觉得使用Matrix本身是没有问题的,最后在打log分析的时候发现问题主要是因为mIconBitmap.getWidth(), mIconBitmap.getWidth()得到的大小并不一样,所以导致缩放是有问题的

24、Canvas drawText(String, x, y, paint)

    开始以为是以坐标x, y往下绘制,今儿才发现居然是从下往上绘制!

25、在Service或者BroadCastReceiver中使用AlertDialog是不能显示出来的,因为dialog必须依附于一个确定的Activity之上;为了解决该问题,我们可以将Dialg设置为系统的dialog;具体实现如下:

private void showConfirmDialog(Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle(R.string.confirm_reset);
    builder.setMessage(R.string.confirm_info);
    builder.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Log.i("wrx439", "点击确定");
        }
    });
    builder.setNegativeButton(R.string.confirm_no, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.dismiss();
        }
    });
    AlertDialog dialog = builder.create();
    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    dialog.show();
}

另外这种做法还需要在AndroidManifest.xml文件中增加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>

26、判断SD卡是否挂载

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

27、listview从下往上显示数据

android:stackFromBottom="true"

28、动态获取图片资源

1)通过Android提供的方法:Resources.getIdentifier():

function getResId(String name, Context context) {
    Resources r = context.getResources();
    int id = r.getIdentifier("icon", "drawable", "in.srain.cube.sample");
    return id;
}
但是这种做法不值得推荐:引用了context,调用时间过长

2)通过反射获取

public static int getResId(String variableName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(variableName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    }
}
使用方法:

getResId(name, R.drawable.class);
29)判断view是否可以下拉
public static boolean canChildScrollUp(View view) {
    if (android.os.Build.VERSION.SDK_INT < 14) {
        if (view instanceof AbsListView) {
            final AbsListView absListView = (AbsListView) view;
            return absListView.getChildCount() > 0
                    && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
                    .getTop() < absListView.getPaddingTop());
        } else {
            return view.getScrollY() > 0;
        }
    } else {
        return view.canScrollVertically(-1);
    }
}

30)ListView开始或者最后一行是否显示diviler

由两个属性决定的:

    1)Android:headerDividersEnabled 或者 Android:footerDividersEnabled如果这俩个值为false,那么久不会显示;如果为true,还得满条件2:

    2)listView的高度设置需要时match_parent,只有listview在判断当前最后一个item没有到达顶部的时候才会显示diviler;

31)inset标签的使用

有时绘制图片的时候左右两边不需要,那么久可以使用inset标签定义图片了,如下:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="10dp"
       android:insetRight="10dp">
    <shape android:shape="rectangle">
        <size android:height="1px"/>
        <solid android:color="@color/line"/>
    </shape>
</inset>

32)判断应用程序权限是否开启

public boolean selfPermissionGranted(String permission) {
	// For Android < Android M, self permissions are always granted.
	boolean result = true;

	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
		try {
			final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
			int targetSdkVersion = info.applicationInfo.targetSdkVersion;

			if (targetSdkVersion >= Build.VERSION_CODES.M) {
				// targetSdkVersion >= Android M, we can
				// use Context#checkSelfPermission
				result = context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
			} else {
				// targetSdkVersion < Android M, we have to use PermissionChecker
				result = PermissionChecker.checkSelfPermission(context, permission) == PermissionChecker.PERMISSION_GRANTED;
			}
		} catch (PackageManager.NameNotFoundException e) {
			e.printStackTrace();
		}
	}

	return result;
}

33)

    是布局透到状态栏上面去

if (Build.VERSION.SDK_INT >= 19) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

34)TextWatcher

private void initOrderSn() {
    mOrderSn.addTextChangedListener(new TextWatcher() {
        /**
         * @param s---改变之前的内容
         * @param start---改变的位置
         * @param count---内容减少字符个数
         * @param after---内容增加的字符个数
         */
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            Log.i("wrx1758", "s = " + s);
            Log.i("wrx1758", "count = " + count);
            Log.i("wrx1758", "start = " + start);
            Log.i("wrx1758", "after = " + after);
        }

        /**
         * @param s---改变后的字符
         * @param start---内容改变的开始的位置
         * @param before---内容减少的字符个数
         * @param count---内容增加的字符个数
         */
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.i("wrx1757", "s = " + s);
            Log.i("wrx1757", "count = " + count);
            Log.i("wrx1757", "start = " + start);
            Log.i("wrx1757", "before = " + before);
            /*if (s == null || s.length() == 0) return;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
                if (i != 3 && i != 8 && s.charAt(i) == ' ') {
                    continue;
                } else {
                    sb.append(s.charAt(i));
                    if ((sb.length() == 4 || sb.length() == 9) && sb.charAt(sb.length() - 1) != ' ') {
                        sb.insert(sb.length() - 1, ' ');
                    }
                }
            }
            if (!sb.toString().equals(s.toString())) {
                int index = start + 1;
                if (sb.charAt(start) == ' ') {
                    if (before == 0) {
                        index++;
                    } else {
                        index--;
                    }
                } else {
                    if (before == 1) {
                        index--;
                    }
                }
                mOrderSn.setText(sb.toString());
                mOrderSn.setSelection(index);
            }*/
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值