Android 工作笔记(小知识点)---(持续更新,190314)

1、Edittext————》hint:提示的文字

2、layout比重
layout布局是 多个控件widthheight都是填充父类时` weight表示的是该控件在布局中渲染的优先级,值越大优先级越低,默认值填写大点。

3、设置文本颜色
Activity中设置文本颜色,背景色等常见背景色 最好用Android系统自带的颜色值android.graphics.Color.(WHITE//可选色)

4、Map
nmap.containsKey("longitude")//判断map中是否含有某个键

5、ListView
customerlv.setDividerHeight(0);// 设置ListView分割线为0,既不可见

6、Edittext
android:focusable="false" //设置Edittext 不可编辑
android:inputType="none"

7、按钮点击效果

 fullscreen.setOnTouchListener(new OnTouchListener() { 
    	 @Override
	    public boolean onTouch(View v, MotionEvent event) {	
	    		 if(event.getAction()==MotionEvent.ACTION_DOWN){  
	    	 		v.setBackgroundResource(R.drawable.ic_vidcontrol_fullscreen_off);  
	   			 }else if(event.getAction()==MotionEvent.ACTION_UP){  
	   				 v.setBackgroundResource(R.drawable.ic_vidcontrol_fullscreen_on);  
	    			}
	    	 return false;
	     		}
	    	 }
     );

8、Edittext

使用android:singleLine="true" 禁止换行

9、混淆

让proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句
proguard.config=proguard.cfg”就可以了

10、定时器

    Timer timer = new Timer();
    		timer.schedule(new TimerTask() {
    			public void run() {
    			}
    
    		}, 500);

11、 随机数

    Random random = new Random();
    StringBuilder builder = new StringBuilder();
    int count = random.nextInt(60);
    for (int i = 0; i < count; i++) {
    builder.append(" " + i);
    		 }

12、关于如何自定义AlertDialog样式:
一、AlertDialog.Builder.setView(View view)。这个view是事先从定义好的XML文件里获取的,关于如何获取可以用下面代码实现:

	LayoutInflater inflater = LayoutInflater.from(Context context);
    View view = inflater.inflate(R.layout.alertdialog, null);

//这里的R.layout.alertdialog即为你自定义的布局文件
二、view.Window.setContentView(View view)。主要代码如下:

     AlertDialog mAlertDialog = builder.create();
    mAlertDialog.show();
    mAlertDialog.getWindow().setContentView(view);

关于两者的区别,大家可以看这个链接:http://www.x2x1.com/show/6040883.aspx。
大致就是setView()只会覆盖AlertDialog的Title与Button之间的那部分,而setContentView()则会覆盖全部。但是否真的是这样呢?还有待验证。

13、TextView

	TextView textview = (TextView) findViewById(R.id.text);`
            /**             * 
             * 只有调用了该方法,TextView才能不依赖于ScrollView而实现滚动的效果。
             * 要在XML中设置TextView的textcolor,否则,当TextView被触摸时,会灰掉。
             */

	textview.setMovementMethod(ScrollingMovementMethod.getInstance());

14、子线程更新UI操作

    private Handler handler = new Handler() {// 主线程消息接收器
    		public void handleMessage(Message msg) {
    			if (msg.what == CHANGE_UI) {
    				mealprompt.setVisibility(View.GONE);
    			}
    		};
    	};
	/**
	* 利用时间定时器 Timer 定时想主线程发送消息,主线程处理提示图片隐藏
	*/
	Timer timer = new Timer();// 时间定时器
	timer.schedule(new TimerTask() {
			public void run() {
				Message message = new Message();
				message.what = CHANGE_UI;
				// message.obj = mealprompt;
				// mealprompt.setVisibility(View.GONE);
				// 如果当前版本大于上次版本,该版本属于第一次启动
				// 将当前版本写入preference中,则下次启动的时候,据此判断,不再为首次启动
				prefs.edit().putInt("VERSION_KEY", currentVersion).commit();
				handler.sendMessage(message);
			}
		}, 3000);

15、AlertDialog警告对话框

		new Builder(WriteEmailActivity.this, AlertDialog.THEME_HOLO_LIGHT)
					.setTitle("    "+infos.getFileName())
					.setIcon(getResources().getDrawable(R.drawable.delete))
					.setMessage("        是否删除当前附件?")
					.setNegativeButton("确定",
							new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									adapter.clearPositionList(arg2);
									int a = adapter.getList().size();
									int count = (int) Math.ceil(a / 4.0);
									gridView.setLayoutParams(new LayoutParams(
											LinearLayout.LayoutParams.MATCH_PARENT,
											(int) (94 * 1.5 * count)));
								}
							}).setPositiveButton("取消", null).create().show();

16、TextUtils

    join(CharSequence delimiter, Object[]/Iterable)

可以把数组或集合根据指定的格式转换成字符串,比如逗号。

    @Test
        public void joinTest() throws Exception {
            String[] strs = {"aaa","bbb"};
            String join = TextUtils.join(",", strs);
            assert join.equals("aaa,bbb");
            List<String> lists = new ArrayList<>();
            lists.add("ddd");
            lists.add("eee");
            String joinList = TextUtils.join(",", lists);
            assert joinList.equals("ddd,eee");
        }

splite

可以跟join相反,可以把字符串根据指定格式转换成数组。

isEmpty(CharSequence)

如果字符串为null或长度为0的话,就会返回true,不用,我们自己判断两个。

equals(CharSequence,CharSequence)

判断两个字符串是否相等

length()

如果字符串isEmpty的话,返回0.

concat(CharSequence… text)

拼接字符串

17、Adapter

Context

之前,做项目时候每次会把Context传到adapter里面。其实,我们可以通过view.getContext()来获取Context对象。

18、Serializable

transient

变量加上transient关键字就会限制序列化。

19、Activity

moveTaskToBack(boolean nonRoot)

让APP进入后台运行。

**runOnUiThread(Runnable) **

可以通过这个方法回到主线程操作,内部也是通过handler实现的

isTaskRoot()

在启动的时候,我们可以通过这个判断,来决定是否显示启动页。

禁止截屏

Activity添加getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

**startActivities() **

startActivities(aIntent,bIntent)。会先进入B,返回的话到A。(跳转详情的时候,返回主页面。是不是有点用?)

20、View

performClick()

调用View的点击事件。

generateViewId()

代码new出来的view没有ID,可以通过这个方法来生成。但是,它需要API 17及以上

setTag(int key, final Object tag)

我们都知道setTag(Object)。但是,有时候会跟其他的冲突,比如(Glide?)。这样,我们就要使用这个带key的setTag方法。这个key,必须是在应用的resources 里面声明的,用来确保唯一性。

isShown()/getVisibility()==View.VISIBLE

isShown是判断它自身及父View是否都显示。getVisibility()只判断它自身是否是显示状态。

setDuplicateParentStateEnabled()

设置子view跟随父view的状态(选择,选中等)

View的selector状态(选中,选择)

代码设置view的选中状态(颜色,Drawable)
View.setSelected()配合ColorStateList ,StateListDrawable 使用

//设置颜色选择状态

    private ColorStateList getSelector(int normalColor) {
            int stateChecked = android.R.attr.state_checked;
            int[][] states = new int[2][];
            states[0] = new int[]{stateChecked};
            states[1] = new int[]{};
            return new ColorStateList(states, new int[]{mThemeColor, normalColor});
        }
    ...

//如果有多个drawable,需要处理的话。需要加上mutate()方法,它们是共享状态。不然,就都修改了

     private Drawable getStateDrawable(Context context) {
            //处理选中情况
            final StateListDrawable mDrawable = new StateListDrawable();
            //选中状态mutate()
            final Drawable pressDraw = context.getResources().getDrawable(R.drawable.icon).mutate();
            if (pressDraw instanceof GradientDrawable) {
                ((GradientDrawable) pressDraw).setStroke(AppUtil.dip2px(context, 0.5f), ThemeConfig.getConfigThemeColor());
                mDrawable.addState(new int[]{android.R.attr.state_checked}, pressDraw);
            }

//设置正常颜色

            final Drawable normalDraw = context.getResources().getDrawable(R.drawable.icon).mutate();
            mDrawable.addState(new int[]{}, normalDraw);
            return mDrawable;
        }

20、Manifest

android:allowbackup="false"防止导出数据

FileProvider 冲突

我们可以写一个类来继承FileProvider。在清单文件里面注册这个继承FileProvider的类。

21、Fragment

getActivity()为null

我们可以在onAttach(Activity)里面来获取它。注意:内存泄漏。

22、自定义view

继承已有的view,布局文件可用merge做根节点

我们都知道布局的优化有ViewStub,merge,include
当我们自定义view引用layout的时候,我们可以用merge作为layout的根节点来减少嵌套。
使用merge后,标签的属性就失效了,我们需要代码来设置属性。(比如,如果继承的是LinearLayout的话,orientation属性就失效了,我们需要在代码中设置).

23、RecyclerView

布局文件指定layoutManager跟spanCount

<declare-styleable name="RecyclerView">
        
        <attr name="layoutManager" format="string" />
        <attr name="android:orientation" />
        <attr name="spanCount" format="integer"/>
        <attr name="reverseLayout" format="boolean" />
        <attr name="stackFromEnd" format="boolean" />
    </declare-styleable>

它的属性attr里面可以指定layoutManagerspanCount,orientation的。不用,我们在代码里设置

24、SharedPreferences

commit,apply

commit是同步操作。apply是异步操作。
我们可以用v4包的方法来处理提交请求。(SharedPreferencesCompat.EditorCompat.getInstance().apply()??

25、网络

判断是否连接到远程服务器
!!!添加网络权限

    Runtime runtime = Runtime.getRuntime();
    
    //-c 是ping几次 ,-w是等待时间,秒为单位
    Process exec = runtime.exec("ping  -c 3 -w 10 www.baidu.com");
    
    if (exec.waitFor() == 0) {
       Log.d("mosr", "连接成功");
    } else {
      Log.d("mosr", "连接失败");
    }
    这里也可以换成自己的服务器来判断。
    
        public String Ping(String str) {
            String resault = "";
            Process p;
            try {                //ping -c 3 -w 100  中  ,-c 是指ping的次数 3是指ping 3次 ,-w 100  以秒为单位指定超时间隔,是指超时时间为100秒
                p = Runtime.getRuntime().exec("ping -c 3 -w 10 " + str);
                int status = p.waitFor();
                InputStream input = p.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(input));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = in.readLine()) != null) {
                    Log.i("mosr", line);
                    buffer.append(line);
                }
                if (status == 0) {
                    resault = "success";
                } else {
                    resault = "faild";
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return resault;
        }
    
        private class NetPing extends AsyncTask<String, String, String> {
            @Override
            protected String doInBackground(String... params) {
                String s = "";
                s = Ping("www.baidu.com");
                Log.i("mosr", s);
                return s;
            }
        }
    
            new NetPing().execute();

网络质量监听

https://github.com/facebook/network-connection-class

26、ArgbEvaluator

设置颜色

ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue)

通过设置起始颜色,获取中间的变化颜色。让颜色平滑过渡。

27、EditText

设置内容右对齐

设置右对齐,我们第一个想到的就是android:gravity:“right”。但是,这个属性在部分手机是有问题的。可以通过添加*android:layoutDirection="rtl"属性,来达到效果.
当设置了内容右对齐后,发现输入纯数字+@(可能有别的)。在某些机型**(OPPO)**上也会有很怪异的行为,所以,还需要添加android:textDirection=“ltr”*这个属性,这样就可以了。

android:layoutDirection="rtl"
android:textDirection="ltr"

28、属性

android:clipChildren 
android:clipToPadding

让控件重叠。(listview在底部tab下面滑过…)

android:animateLayoutChanges

通过动画来更自然的过渡view 显示/隐藏时候,带来的布局变动。
tools:xxx
tools:text="xxx"可以让我们在开发时候预览,而不用担心打包后,显示出来。
当然,还有很多.
targetSdkVersion到28

<application android:usesCleartextTraffic="true">

表明,允许使用明文

android.util.Pair

Pair.create()。但是不是键値对,是通过first,second来获取。equal(比较)是值比较,并不是地址比较

29、Toast自定义

    Toast mToast=new Toast(getApplicationContext());
	      mToast.setView(mView);//显示的布局
	      mToast.setDuration();//显示的时长
	      mToast.setGravity();//显示的位置
	      mToast.setText();//显示的文本

30、ListView与RecyclerView选择
RecyclerView,完全能替代ListView,性能优于ListView,拓展性更强。
但代码量与复杂程度要大于ListView

31、getPackageInfo 使用 Flags 调用:

    mContext.getPackageManager()
    .getPackageInfo(mContext.getPackageName(),PackageManager.GET_SIGNATURES)

避免PackageInfo超过Binder大小的限制(1MB左右),抛出java.lang.RuntimeException: Package manager has died异常

32、SwitchCompatSwitch
android.support.v7.widget.SwitchCompat;
android.widget.Switch
两者均是开关选择器,区别在于SwitchCompat 向下兼容性更好,能使高低版本之间UI保持高度统一,所以开发中优先使用SwitchCompat 。

33、软键盘问题
Activity退出后,键盘不收回,在没有输入框的界面不随便使用windowSoftInputMode中的键盘状态属性,使用前务必了解详细使用方法:地址

34、SharePreference
SharePreference:commit同步提交,Apply异步提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值