Android开发技巧大全 (持续更新)

我酝酿很久了,在开发中遇到的技巧要一一记录在一个地方,以后就可以方便自己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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值