编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/73076519
Android开发中的一些小知识点记录(1-20) (21-40)
41,android:layout_gravity 与 android:gravity 的区别
- android:layout_gravity 表示的是当前的View或者ViewGroup在 ViewGroup当中的位置(子控件在父控件中的位置)
- android:gravity 表示的是当前的 View 或者 ViewGroup的内容所在的位置(控件的内容在控件中的位置)
42,margin和padding的区别
- margin表示外边距
- padding表示内边距
如图:未设边距时,三个边框线是重合的,设置边框线后,margin是外边距,向外扩;padding是内边距,向内扩
43,Android TV开发中获取控件焦点
在每个控件的布局中设置:
android:focusable="true"
这样就可以通过遥控器或按键获取到该控件焦点,然后在控件的状态选择器中设置:
<item android:drawable="@drawable/bg_yellow" android:state_focused="true"/>
<item android:drawable="@drawable/bg_normal"/>
如果不想在状态选择器中设置,也可以在代码中设置:
public class MainActivity extends AppCompatActivity implements View.OnFocusChangeListener {
private static final String TAG = "MainActivity";
private Button mButton;
private EditText mEdittext;
private LinearLayout mLinearLayout;
private CheckBox mCheckBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
public void initView() {
mButton = (Button) findViewById(R.id.button);
mEdittext = (EditText) findViewById(R.id.edittext);
mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout);
mCheckBox = (CheckBox) findViewById(R.id.checkbox);
}
public void initData(){
mButton.setOnFocusChangeListener(this);
mEdittext.setOnFocusChangeListener(this);
mLinearLayout.setOnFocusChangeListener(this);
mCheckBox.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View view, boolean b) {
if(b & view == mEdittext){
view.setBackgroundResource(R.drawable.bg_yellow);
}else if(b & view == mButton){
view.setBackgroundResource(R.drawable.bg_red);
}else if(b & view == mLinearLayout){
view.setBackgroundResource(R.drawable.bg_green);
}else {
view.setBackgroundResource(R.drawable.bg_normal);
}
}
}
44,自定义可更改颜色大小等属性的CheckBox
- 设置CheckBox的button为你自定义的selector
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@drawable/checkbox_selector"/>
- 准备checkbox_focus、checkbox_checked、checkbox_normal这三张图片,大小颜色等属性均由图片确定
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/checkbox_focus"/>
<item android:state_checked="true" android:drawable="@drawable/checkbox_checked"/>
<item android:drawable="@drawable/checkbox_normal"/>
</selector>
45,新建assets目录的位置
在src—>main目录下面,和java、res目录平级,光忘记,记录一下!
46,红橙黄绿青蓝紫的 RGB十六进制表示法
红 #FF0000
橙 #FF8000
黄 #FFFF00
绿 #00FF00
青 #00FFFF
蓝 #0000FF
紫 #8000FF
47,保证Apk的唯一性
包名唯一和应用程序签名的唯一
48,什么是时间戳
时间戳:表示的是格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
时间戳转化为年月日时分秒形式代码:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 时间戳 表示的是格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
// 一般以long格式表示
long timestamp = 1514994617;
String time = formatData("yyyy:MM:dd HH:mm:ss", timestamp);
// time:2018:01:03 23:50:17
Log.i(TAG , "time:" + time);
}
/**
* 将时间戳格式化年月日时分秒形式
*/
public static String formatData(String dataFormat, long timeStamp) {
if (timeStamp == 0) {
return "";
}
timeStamp = timeStamp * 1000;
String result = "";
SimpleDateFormat format = new SimpleDateFormat(dataFormat);
result = format.format(new Date(timeStamp));
return result;
}
}
49,用流读取本地assets文件
InputStream is = getAssets().open("friends.txt");
String json = readTextFile(is);
Log.i(TAG, "json:" + json );
Gson gson = new Gson();
// [] 集合类型 {} 对象类型 集合类型要加List 对象类型直接.class就可以了
List<Friends> friend = gson.fromJson(json , new TypeToken<List<Friends>>(){}.getType());
Log.i(TAG, "friend:" + friend );
private String readTextFile(InputStream is) {
String readStr = "";
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String tmp;
while ((tmp = br.readLine()) != null) {
readStr += tmp;
}
br.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return readStr;
}
50,shape.xml 属性使用
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--固体填充-->
<solid android:color="@color/colorAccent"/>
<!--圆角-->
<corners android:radius="20dp"/>
<!--描边 线宽2dp 虚线 长度9dp 实线 长度9dp-->
<stroke android:color="@color/colorPrimaryDark" android:width="2dp"
android:dashGap="9dp" android:dashWidth="9dp"/>
<!--渐变色 可以指定左中右渐变 可以调整角度 逆时针旋转角度 必须是45的倍数-->
<gradient android:startColor="#FFF" android:centerColor="@color/colorPrimary" android:endColor="#000" android:angle="45"/>
</shape>
51,通过两个点的经纬度计算距离
private const double EARTH_RADIUS = 6378.137;
private static double rad(double d){
return d * Math.PI / 180.0;
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2){
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.Round(s * 10000) / 10000;
return s;
}
52,跟进源码的方法
有时候我们重写了系统方法,并且想查看一下系统方法的关键源码,可以通过在方法中添加堆叠追踪的方法实现。在方法中添加如下代码,你想跟进的系统源码就可以在控制台中打印出来。建议打印出来的最下面的信息就没有必要跟进了,从中间往上面跟进
new Throwable().printStackTrace();
53,通过Release版的签名证书打一个Release包
选中Project点F4出现如下界面:
填写Signing(比如命名为release),Build Types里面的debug和release的Signing Config都改为Signing中添加的那个名字(release)
在控制台Terminal位置输入gradlew assembleRelease,回车等几分钟,就可以在build---->outputs中找到刚打的Release包
54,compileSdkVersion, minSdkVersion 和 targetSdkVersion三者之间的区别
compileSdkVersion 用于告诉Gradle 用哪个 Android SDK 版本编译你的应用,建议设置最新的 SDK 版本进行编译
minSdkVersion 用于设置应用可以正常运行的最低Android SDK 版本
targetSdkVersion 用于设置你想使用新特性的Android SDK 版本,一般也是设置为最新的 SDK 版本,但设置之前需要进行详细的测试
一般来说,三者之间的关系如下:minSdkVersion <= targetSdkVersion <= compileSdkVersion
55,android TV开发如何连接adb
-
用 USB to USB 数据线连接,并需要通过软件或硬件的方式进行打开
软件方式打开:在系统中找USB连接到PC的选项,勾选打开
硬件方式打开:在主板上找到一个针脚的帽子,将帽子拔掉 -
通过adb connect IP地址:端口号,这样的方式打开
56,android中将自己的应用程序设置为launcher
<activity android:name=".activity.SplashActivity"
android:theme="@style/AppSplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
// 如果将应用程序设置为launcher,点击home键启动自己的应用
<category android:name="android.intent.category.HOME" />
// 如果接收隐式意图的话需设置category.DEFAULT,不然将导致 Intent 匹配失败
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
57,2018年3月知识点记录
在命令行中过滤TAG :adb logcat -s TAG名称
Android文件目录下能删掉的文件夹: .idea .gradle build文件 gradlew文件和gradle.bat文件
一大B等于八小b 即 1Byte = 8bit ,八位(比特)等于一字节
获取内网所有在线设备的ip地址: arp -a
获取内网ip地址:ipconfig/all, 获取公网ip地址:curl ip.cn,不停地ping ping ip地址 -t ,ctrl +c 停止
AndroidManifest文件中,permission 和uses-permission权限的区别:uses-permission是指本应用程序正常使用需要申请的权限;permission 是指本应用程序提供给其他应用程序所使用的自定义权限
开发中要做到数据异步和显示异步,保证应用运行流畅
百度地图如果只添加了发布版的SHA1值,没有添加开发版的SHA1值,那么使用的AK打出来的Debug包安装在设备上只能显示出来网格,如果添加了开发版的SHA1值,Debug包上就可以出现地图内容
默认的debug.keystore的秘钥库口令是 android ,查看debug.keystore时使用
58,获取公网IP地址
public void getPublicIP() {
new Thread(new Runnable() {
@Override
public void run() {
URL infoUrl = null;
InputStream inStream = null;
try {
infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
URLConnection connection = infoUrl.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
inStream = httpConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
StringBuilder sb = new StringBuilder();
while ((ip = br.readLine()) != null){
sb.append(ip + "\n");
}
inStream.close();
// 从反馈的结果中提取出IP地址
int start = sb.indexOf("{");
int end = sb.indexOf("}");
String json = sb.substring(start, end + 1);
if (json != null) {
try {
JSONObject jsonObject = new JSONObject(json);
ip = jsonObject.optString("cip");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
59,设置ViewPager的滑动速度
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.animation.Interpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
/**
* ViewPager的滑动速度设置
*/
public class ViewPagerScroller extends Scroller {
/**
* 滑动速度
*/
private int mScrollDuration;
/**
* 设置速度速度
* @param duration
*/
public void setDuration(int duration){
this.mScrollDuration = duration;
}
public ViewPagerScroller(Context context) {
super(context);
}
public ViewPagerScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
// 这里的ViewPager可以换成各种ViewPager的子类,包括竖着滑动的ViewPager等
public void setViewPagerScrollSpeed(ViewPager viewPager, int speed) {
try {
Field field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
ViewPagerScroller viewPagerScroller = new ViewPagerScroller(viewPager.getContext(), new OvershootInterpolator(0.6F));
field.set(viewPager, viewPagerScroller);
viewPagerScroller.setDuration(speed);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
在ViewPager设置Adapter设置之前设置:
ViewPagerScroller scroller = new ViewPagerScroller(this);
// 设置ViewPager的滑动速度为3s钟
scroller.setViewPagerScrollSpeed(mViewPager , 3000);
60,文件存储路径解释
内存卡中保存的内容在/storage/emulated/legacy文件夹或/storage/sdcard0或/mnt/sdcard下找,这三个基本都是对应在/mnt/shell/emulated/0文件夹下
SharedPreference内容保存在/data/data/包名/shared_prefs文件夹下
Gilde图片缓存位置/data/data/包名/cache/image_manager_disk_cache文件夹下
mContext.getCacheDir()是指 /data/data/包名/cache文件夹
mContext.getFilesDir()是指 /data/data/包名/files文件夹
mContext.getExternalCacheDir()是指 /mnt/sdcard/Android/data/包名/cache文件夹
mContext.getExternalFilesDir()是指 /mnt/sdcard/Android/data/包名/files文件夹
mContext.getExternalFilesDir("test")是指 /mnt/sdcard/Android/data/包名/files/test文件夹
mContext.getPackageCodePath()是指 /data/app/包名-1.apk文件夹
mContext.getPackageResourcePath()是指 /data/app/包名-1.apk文件夹
mContext.getDatabasePath("test")是指 /data/data/包名/databases/test文件夹
mContext.getDir("test" , Context.MODE_PRIVATE)是指 /data/data/包名/app_test文件夹
Environment.getDataDirectory() 是指 /data文件夹
Environment.getDownloadCacheDirectory() 是指 /cache文件夹
Envrionment.getExternalStorageDirectory() 是指/mnt/sdcard文件夹
Environment.getRootDirectory 是指/system文件夹
Environment.getExternalStoryPublicDirectory("test") 是指/mnt/sdcard/test文件夹
Android开发中的一些小知识点记录(1-20) (21-40)
因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!