安卓杂记3

安卓杂记3

安卓杂记2
这个应该是最后一篇了,也算是结束了对书的学习

滑动菜单栏覆盖了主界面内容

原因:我们配置TextView的时候,发现没有layout_gravity,于是就用gravity代替,以为是一样的。但是不一样,于是就导致了对应的问题:我们的TextView把我们的主内容覆盖掉了。

首先展示解决方法:那就直接加上这个:android:layout_gravity="start"反正又不报错,只是没有提示出来。

然后解释原因:(有些类似安卓杂记1-CSDN博客中提到的padding和margin直接的关系)

  • gravity:表示控件内的控件的出现位置
  • layout_gravity:表示此控件在它的parent控件的位置

所以呢,设置gravity是无法使得此控件“藏起来的”,那就类似普通的两个控件覆盖了。

悬浮按钮图片一团黑

好像是因为图片太大了,一般要求24*24dp大小的图片,可以自己去修图,也可以找它自带的图:drawable->new->Vector,然后界面:
在这里插入图片描述

沉浸式标题栏的冲突问题

由于一些原因,如果只设置:android:fitsSystemWindows="true"的话,那么很多时候只在协调器布局CoordinatorLayout下奏效,具体参考郭霖大神的这篇博客

然后,就是主题的ActionBarToolbar的发生了冲突,一般在对相关活动设置主题的时候,在后面再点一个:.NoActionBar代表关闭掉这个自带的Actionbar,以及把它的颜色设置为透明的

如:

<style name="FruitActivityTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

当然,也可以自己重新定义一个标题栏,然后对应的活动使用这个标题栏就可以了:

them下多定义一个主题:

<style name="Theme.Weather" parent="Theme.Material3.DayNight.NoActionBar"/>

AndroidManifest下:

 <activity
            android:name=".ui.home.weather.WeatherActivity"
            android:exported="false"
            android:theme="@style/Theme.Weather"/>
<!--注意这个是@style而不是@them-->

OnLifecycleEvent弃用

参考安卓文档

文档建议使用:DefaultLifecycleObserver或者LifecycleEventObserver应该是原本的用法不太好吧,这两个方法也只是在原本的写法上做了些改变。

这里展示LifecycleEventObserver的用法:

class MyObserver:LifecycleEventObserver {
    //重写状态改变方法:
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        //可以用:source.lifecycle来获取lifecycle,再得到对应的currentState之类的
        when(event){
            //可以单独写if来判断
            //如果用when的话,下面的情况要写全,不需要的可以为空。
            Lifecycle.Event.ON_CREATE -> {
                // 执行 CREATE 时的逻辑
            }
            Lifecycle.Event.ON_START -> {
                // 执行 START 时的逻辑
            }
            Lifecycle.Event.ON_RESUME -> {
                // 执行 RESUME 时的逻辑
            }
            Lifecycle.Event.ON_PAUSE -> {
                // 执行 PAUSE 时的逻辑
            }
            Lifecycle.Event.ON_STOP -> {
                // 执行 STOP 时的逻辑
            }
            Lifecycle.Event.ON_DESTROY -> {
                // 执行 DESTROY 时的逻辑
            }
            Lifecycle.Event.ON_ANY -> {
                // 处理异常
            }
        }
    }

}

最后记得在对应的活动或碎片中添加观察者哦

找不到Transformations?

由于一些原因,在更新的时候,把swithchMap和Map的使用方式改了。如果导入的依赖是书里的版本,还是可以用的,若是最新版本就这样:

class {
    val userIdLiveData : MutableLiveData<String>()

    val user : LiveData<String> = userIdLiveData.switchMap {
        //就是对应的调用方法改变了,map的调用也是一样的
        userId -> Repository.getUser(userId)
    }

    fun getUser(val userId: String) {
        userIdLiveData.value = userId
    }
}

参考网址:实时数据 |Android 开发人员 (google.cn)

补充: 它右边有个目录,往下滑就可以找到了。

status is null

大概率是写数据类的时候把对应的变量名打错了…。然后,我敲错的地方,确实有点多…找了大半天…

沉浸式状态栏

效果:
在这里插入图片描述

实现方式一

可以直接使用如下布局,开启对应的fitsSystemWindows效果

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff66ff"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

然后记得设置状态栏的颜色,其实不设置也应该没什么问题

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.statusBarColor = Color.TRANSPARENT
    }
}
实现方式二

我们在许多时候并不想使用这两个布局,就单纯的想在普通布局下实现对应的效果:

val frameLayout = findViewById<FrameLayout>(R.id.titleLayout)
//这个frameLayout
        val insetsController =  WindowInsetsControllerCompat(window,frameLayout)
        //获得视图插入控制器,window(窗口),
        //frameLayout(FrameLayout控件,嫌麻烦直接用window.decorView获取设备视图也是可以接受的)
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.R){  //判断版本
            //使内容在状态栏下面,主要是为了不覆盖对应控件
            insetsController.systemBarsBehavior =
                WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            //隐藏状态栏和导航栏,
            insetsController.hide(WindowInsetsCompat.Type.statusBars() or
                    WindowInsetsCompat.Type.navigationBars())
        }else{
            //API30以下的写法:
            frameLayout.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    )
            val button = findViewById<Button>(R.id.button)
            //处理被覆盖的控件button,实现偏移
            ViewCompat.setOnApplyWindowInsetsListener(button) { view, insets ->
            val params = view.layoutParams as FrameLayout.LayoutParams
            params.topMargin = insets.systemWindowInsetTop
            insets
            }
            
        }

当然,也是要记得开启对应的fitsSystemWindows效果的:

<FrameLayout
        android:id="@+id/titleLayout"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:fitsSystemWindows="true">
<!--如果没有使用这个布局,直接在跟布局下设置fitsSystemWindows也是一种写法-->

参考网址:

再学一遍android:fitsSystemWindows属性_android setdecorfitssystemwindows-CSDN博客

WindowInsetsController | Android Developers (google.cn)

用Android Studio push到GitHub仓库中发现push失败

一个是对应内容没有添加到代码仓暂缓区,

导致文件都是红色的:于是在commite的时候提交的东西老是空的。

在这里插入图片描述

这个时候如果点了Cancel,导致代码没有添加进代码仓暂缓区,或者其他原因导致对应的文件是红色的。

没关系,只需要:选中对应的文件,右键点开,git->add自己再手动添加到暂缓区。(这个暂缓区存储的是等会要进行commit的代码)

在这里插入图片描述

然后依次commit,push就好了。

如果push的时候被提示是ssh问题:

在这里插入图片描述

这是因为这个新建的项目没有设置密钥,这个去配置一下ssh密钥就可以了。如果我不想每一个新建的仓库都去设置一下ssh密钥的话那就改一下push的路径:
在这里插入图片描述

点这个可以添加一个新的路径,

在这里插入图片描述

记得改名字,不能重复,然后下面那个URL就填你的HTTPS的那个路径就好了:
在这里插入图片描述

然后就选中这个路径的名字(你自己敲的)去push就可以完成push了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值