我酝酿很久了,在开发中遇到的技巧要一一记录在一个地方,以后就可以方便自己ctrl+c ctrl+v (本文是对其他资料的整理)
1.底部导航栏透明,顶部状态栏半透明
https://www.jianshu.com/p/11a2b780fd9b
方式一:Java代码实现
public static void transparentBar(Window window){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
window.addFlags(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
}
方式二:xml配置文件实现
在values目录下的styles.xml文件,建议使用方式一
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
2.ConstraintLayout约束布局子控件居中
水平居中
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent
垂直居中
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
3.viewPage的setOnPageChangeListener过时
更换为```addOnPageChangeListener```即可
4.自定义图形布局
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false">
<solid android:color="@color/colorAccent"></solid>
<stroke android:color="@color/colorAccent" android:width="1dp"></stroke>
<size android:width="10dp" android:height="10dp" ></size>
</shape>
5.使用注解绑定控件
Android studio配置
android {
...
// Butterknife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
}
使用
一定要加上这句ButterKnife.bind(this);
//切换的页面
@BindView(R.id.leader_page)
public ViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
6.全屏显示
/**
* 全屏显示
* @param window
* @param activity
*/
public void fullScreen(Window window, AppCompatActivity activity){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (window != null) {
if (activity.getActionBar()!=null){
activity.getSupportActionBar().hide();
}
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
}
}
7.延迟进入首页 并 有进入的过度动画
使用之前需要配置下载相应的框架:
//RxJava2
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
配置过渡动画布局 R.anim.left_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1000"
android:fromXDelta="100%p"
android:toXDelta="0" />
<alpha
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
/**
* 延时进入首页
*/
private void delay(){
Observable.timer(Config.LAUNCH_DELAY_TIME, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>()
{
@Override
public void accept(Long aLong) throws Exception
{
startActivity(new Intent(WelcomeActivity.this, HomeActivity.class));
finish();
/*进入首页的过渡动画*/
overridePendingTransition(R.anim.left_in,R.anim.left_out);
}
});
}
8.权限申请
一次申请: 相机权限->电话权限->存储权限 (不应该这样嵌套下去的写法,直觉告诉我还有其他写法,等着发现)
注意:所申请的权限在配之文件AndroidManifest.xml中声明
方式一
/**
* 申请权限
*/
private void applyPermissions(){
RxPermissions permissions = new RxPermissions(this);
permissions.request(Manifest.permission.CAMERA)
.subscribe(new Consumer<Boolean>() {
/*无论是确认获取权限还是取消获取权限,都会执行*/
@Override
public void accept(Boolean aBoolean) throws Exception {
permissions.request(Manifest.permission.READ_PHONE_STATE)
.subscribe(new Consumer<Boolean>() {
/*无论是确认获取权限还是取消获取权限,都会执行*/
@Override
public void accept(Boolean aBoolean) throws Exception {
permissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Consumer<Boolean>() {
/*无论是确认获取权限还是取消获取权限,都会执行*/
@Override
public void accept(Boolean aBoolean) throws Exception {
delay();
}
});
}
});
}
});
}
方式二
public void applyPermissions2(){
String[] permissions = new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE};
ActivityCompat.requestPermissions(this,permissions,100);
}
方式好? 我觉得看使用场景吧,但第一种是真简短,有时候不见得什么地方都适用
9.禁止屏幕旋转
在activity的oncreate方法里面调用
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
10.检查权限是否已获得
/**
* 检查是否获取全部所需权限
*/
private void checkPermissions(){
boolean allAllowed = true;
for (int i = 0 ; i < Config.APP_PERMISSIONS.length;i++){
//这是关键语句
if (ContextCompat.checkSelfPermission(this,Config.APP_PERMISSIONS[i])!= PackageManager.PERMISSION_GRANTED){
allAllowed = false;
}
}
if (allAllowed){
/*延时进入首页*/
delay();
}else{
/*申请权限*/
applyPermissions();
}
}
11.迁移到AndroidX
建议看包映射表,依赖对应的包即可,添加之后最后重启一下IDE
12.material库
implementation 'com.google.android.material:material:1.2.0-alpha01'
13.NavigationView的引入
implementation 'com.google.android.material:material:1.2.0-alpha01'
不得不吐槽一点,有时候ASxml布局文件输入不能提示属性,以为自己打开方式不对,被人项目用的是v4包,我用的是google.android.material包,然后就想在网上找v4吧,贼难找,CSDN有的又需要会员下载,穷鬼一个哪有会员啊,搞了半天,然年后就直接打字上去不需要提示,突然就对了 (我在哪?我是谁?/黑人问号);所以有时候重启一下电脑捉着直接打字上去,先不管他怎么怎么有没有提示,干就完事了,一般新的东西都会兼容旧的东西,除非那个东西真的被废除了.可把我累的
14.fragmentTransaction 二次提交失败
一个实例的fragmentTransaction 只能被提交一次,所以在下一次提交之前,再次实例化一个新得fragmentTransaction 对象即可(这是方法之一,应该还有其他方法)
/*第二次实例化fragmentTransaction,防止二次提交失败*/
fragmentTransaction = fragmentManager.beginTransaction();