1、Edittext————》hint
:提示的文字
2、layout比重
layout
布局是 多个控件width
与height
都是填充父类时` 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
里面可以指定layoutManager
,spanCount
,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、SwitchCompat
与Switch
android.support.v7.widget.SwitchCompat;
android.widget.Switch
两者均是开关选择器,区别在于SwitchCompat 向下兼容性更好,能使高低版本之间UI保持高度统一,所以开发中优先使用SwitchCompat 。
33、软键盘问题
Activity退出后,键盘不收回,在没有输入框的界面不随便使用windowSoftInputMode
中的键盘状态属性,使用前务必了解详细使用方法:地址
34、SharePreference
SharePreference:commit同步提交,Apply异步提交