标签 android_studio 下的文章

问题

Android Studio一直 Download fastutil-x.x.x.jar, 应该是被墙了。

解决方法

在项目目录下面的 build.gradle 里面添加 aliyun

buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/google';
        }
        maven {
            url 'https://maven.aliyun.com/repository/public';
        }
        maven {
            url 'https://maven.aliyun.com/repository/jcenter';
        }
        google()
        mavenCentral()
    }
    dependencies {
        ...
    }
}

参考:

Android Studio一直Download fastutil-x.x.x.jar
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/118637583?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
Download fastutil-8.4.0-sources jar一直加载问题
https://blog.csdn.net/qq_48092631/article/details/119818131

button 背景色无效

修改 themes.xml 把 parent 中的 "Theme.MaterialComponents.DayNight.DarkActionBar" 修改为 "Theme.MaterialComponents.DayNight.DarkActionBar.Bridge" 即可。

参考: https://blog.csdn.net/try17875864815/article/details/110409078
https://blog.csdn.net/weixin_50679163/article/details/115279933

button 添加图片

可以直接使用 android:drawableLeft 这样的,但是如果需要按钮的尺寸比较大的话,会发生图片和文字分离比较开的情况,所以建议在外面套一层 layout,这个 layout 作为需要触摸的尺寸,并且使用和按钮同样的背景色,button 本身使用 wrap_content即可,这样就不容易出现图片文字分离的情况了。

参考: https://blog.csdn.net/actual_/article/details/6910529
https://blog.csdn.net/qq_41218412/article/details/88422058
https://www.cnblogs.com/dolphin0520/p/3383804.html

按钮设置了背景色后,按下就没什么效果了。

参考: https://blog.csdn.net/muyang_ren/article/details/46523027

添加 maven { url "https://jitpack.io" }

  • 旧版本在 project 的 build.gradle 中增加:
    allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
    }
  • 新版本在 project 的 settings.gradle 中增加:
    dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }
        jcenter() // Warning: this repository is going to shut down soon
    }
    }

添加 implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'

在 app 中的 build.gradle 中增加: implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'

在 xml 中增加:

<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/mvDetailLineChart"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp200"/>

参考:

https://blog.csdn.net/briblue/article/details/77305697
https://blog.csdn.net/jinmie0193/article/details/90239935
https://www.cnblogs.com/leshen/p/12606161.html
MPAndroidChart个人使用总结(一)
https://www.jianshu.com/p/9746e2dd2fbe
MPAndroid 中文文档(转)
https://www.jianshu.com/p/fc31df1e8679
笑谈Android图表-MPAndroidChart
https://www.imooc.com/article/71442

activity

基本用法

  • AndroidManifest.xml文件中,android:label决定了 app 的名称
  • menu

intent

  • 隐式 intent 注意 category 和 action 的名称都要匹配, category 在 xml 文件中可以是多个。
  • 隐式 intent 还能调用系统提供的功能,比如浏览器 view,拨号 dial 等等
  • intent 通过 putExtra 和 get*Extra 来传递数据
  • startActivityResult 可以获得返回值的打开新 activity

life cycle

  • onCreate onDestory, onStart onStop, onResume onPause, onRestart
  • 暂停状态 一般只有在对话框的情况下出现,对话框处于栈顶,原来的 activity 不处于栈顶,但是仍然可见。所以只会调用 onPause 而不会进入 onStop
  • 为了防止 activity 被回收后数据丢失,所以使用 onSaveInstanceState 来储存临时数据。

start mode

  • standard 每次 startActivity 都会创建一个新的。
  • singleTop 每次非栈顶的情况就会创建新的。
  • singleTask 每次栈里面没有才会创建新的。
  • singleInstance 所有标记为这个的都会被放到一个单独的栈里面,这个单独的栈里面的是可以被多个程序进行调用的。

优化

  • BaseActivity 继承 AppCompatActivity,每次 onCreate 的时候, logd 打印当前是哪个 activity
  • AcitvityCollector 里面使用类静态列表,储存 activity,每次创建和删除都在列表中进行操作,额外再用一个 finishAll 来一次性关闭所有 activity 并清空列表,这样可以避免需要多次后退才能退出的问题。
  • 在被调用的 activity 里面增加 actionStart(Content content, String data1, String data2) 这样的函数,是的调用者可以很容易看出需要传入哪些数据,用来启动 activity.

UI

common

  • android:textAllCaps 这个默认是 true 会让 button 上面的文字默认全部大写。
  • editText 属性 android:hint 用来提示文字,android:maxLines 用来设置最多显示几行,多了就滚动显示。
  • imageView 大小属性都选择 wrap_content 比较好,android:srcsetImageResource 分别是 xml 和 java 中设置图片的方法。
  • 旋转等待图标一般是使用 visiable invisiable gone 这三种来控制显示
  • 水平进度条在 xml 中设置 styleandroid:max,然后在 java 中通过 getProgress setProgress 来控制进度条。
  • AlertDialog 用于警告对话框.ProgressDialog 用于长时间加载对话框,如果 setCancelable 设置为 false,那么 后面需要使用 dimiss() 来关闭对话框。

layout

  • layout_gravity 决定是布局时候的位置,当水平布局时,只能选择 top center_vertical bottom,当垂直布局的时候,只能选择 left center_horizontal end. gravity 决定的时内部文字的位置。
  • 如果使用 layout_weight, 那么相应的 layout_width 或者 layout_height 应该设置为 "0dp"。可以部分空间使用 wrap_content 另外一部分使用 layout_weight 来分空间。
  • RelativeLayout 中可以使用 alignParentTop 这样的布置到父界面的边角处的,也可以用 layout_above layout_toLeftOf 这样的布置到其他空间的相对位置的,也可以用 layout_alignTop 这样的和其他空间边缘对其的。
  • FrameLayout 使用场景很少,一般也就用 layout_gravity = "left" 之类的。
  • 可以通过引入 percent 来扩展 FrameLayoutRelativeLayout

custom

  • 可以把复用的部分写入一个 xml 布局文件里面,比如说标题栏。然后再其他布局里面通过 <include layout="@layout/title" 这样的形式引入这个复用的部分。
  • 原来的标题栏可以通过 getSupportActionBarhide 来进行隐藏.
  • 如果复用的还需要响应用户操作,并且在多个 activity 中响应动作时一样的,那么就需要自定义控件,新建类继承自 LinearLayout,然后重写他的构造函数,主要是 LayoutInflater.from(context).inflate(R.layout.title, this)用来动态加载 title.xml。 修改调用的 xml 代码, <com.example.uicustomviews.TitleLayout ...。 然后在子类里面写上响应的代码即可。

ListView

  • 简单的字符串列表,直接使用 ArrayAdapter android.R.layout.simple_list_item_1 即可。
  • 定制创建新的类,包含 list 中 item 需要的内容。然后需要继承 ArrayAdapter写一个相应的 adapter 类专门处理这个 item。还要创建一个新的 xml 专门描述这个 item 内容。最后就可以把这些合起来,使用自定义的 ListView 了。
  • 优化提升效率,使用 convertView 避免每次都要 LayoutInflater,新建一个类保存 findViewById 返回的内容,然后把这个类使用 setTag 保存到 convertView 中。
  • 点击事件,直接使用 setOnItemClickListener 即可。

RecyclerView

  • build.gradledependencies 里面可以不增加 implementation 'androidx.recyclerview:recyclerview:1.1.0'
  • 如果出现一行占据一个屏幕的现象,那就检查 fruit_item.xml 看看里面的 root 节点下的 layout_height 是不是 match_parent。 奇怪的是,这样的设置在 ListView 中就没有问题。
  • 想要横向滚动,只要修改 xml 文件,并且使用 setOrientation(LinearLayoutManager.HORIZONTAL) 即可。
  • 想要瀑布,只要使用 StaggerredGridLayoutManager 即可。
  • 点击事件,针对需要的使用 setOnClickListener 即可。

参考: https://www.cnblogs.com/rustfisher/p/12254732.html

paractise

  • 在 androidstudio 中,右键 png 图片,选择 create 9-patch file,即可创建9图片,然后在需要拉伸的地方用鼠标在边框上描黑,保存即可。然后删除原来的 png 文件就行了。
  • 使用 RecyclerView 时,有新的数据,可以使用 notifyItemInserted 来通知列表插入新数据,使用 scrollToPosition 来让列表滚动到需要的位置。

fragment

usage

  • fragment 直接使用 xml,然后新建类继承 Fragment 即可。
  • 动态加载,那么 xml 里面需要使用 FrameLayout来预先占据 fragment 的位置。使用 getSupportFragmentManager beginTransaction replace commit 来把 fragment 动态加载到这个 frame layout 里面去。
  • 按后退键能够类似 activity 一样,可以使用 addToBackStack 这个方法。
  • activity 调用 fragment 中的方法,首先使用 getSupportFragmentManager().findFragmentById(R.id.right_fragment 这样的方法获取到 fragment 实例,然后就可以调用方法了。
  • fragment 获取 activity 方法,可以使用 getActivity 来获取到 activity 实例,然后就可以调用方法了。

life

  • activity 进入停止状态,fragment 也会自动停止。或者使用 FragmentTranscation 的 remove, replace 方法移除 fragment。
  • fragment 专门的回调函数,onAttach onDetach 是 fragment 和 activity 建立解除关联时调用。 onCreateView onDestoryView 是创建视图加载布局或者相反时调用。 onActivityCreated 和 fragment 相关联的 activity 一定已经创建完毕时调用。
  • 添加 fragment -> onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume + onPause -> onStop -> onDestoryView -> onDestory -> onDetach -> 销毁。
  • onDestoryView -> onCreateView.
  • 如果使用了 addToBackStack ,那么切换 fragment 的时候,可以让当前的 fragment 只执行 onDestoryView 而不执行 onDestory,使用返回键的时候跳过 onCreate 直接进入 onCreateView
  • onSaveInstanceState 可以用来保存临时数据,防止被系统因为内存问题直接回收了。

trick

  • 可以新建文件夹 layout-large,当系统认为当前设备是 large 的时候,就会调用这个文件夹下面的布局文件,否则调用 layout 文件夹下面的布局文件。 具体可以看 P158
  • 还可以手动指定最小宽度,新建 layout-sw600dp,当屏幕宽度大于等于 600dp 的时候,就会加载这个文件夹下面的布局文件。 具体可以看 P159

practice

  • android:ellipsize 文本超过控件宽度,文本从尾部进行缩略。
  • Configurations for activity_main.xml must agree on the root element's ID. 这个报错是因为在多个 layoutactivity_main.xml 中 root 节点的 android:id 必须一致。

转自: https://blog.csdn.net/qq_28193019/article/details/91050915

生成TAG

logt+Tab键:

private static final String TAG = "Extract";

生成Log.d()

logd+Tab键:

Log.d(TAG, "onCreate: ");

生成Log.e()

loge+Tab键:

Log.e(TAG, "onCreate: ",new Throwable());

生成Log.i/w类似

Log.i(TAG, "onCreate: ");
Log.w(TAG, "onCreate: ", );

logm+Tab:打印参数

Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");

logr+Tab:打印返回值

Log.d(TAG, "onCreate() returned: " + );

查看日志输出

在Android Studio Logcat选项卡,中可以选择过滤的级别,来过滤日志输出,比如Verbose、Debug、Error等,上面的选项(如Debug)会包含下面选项(如Error)的日志

如果没有正确加载第三方 so 库,编译可以通过,但是一旦运行,就报错,无法找到对应的 so 库。

经过测试,最简单加载第三方 so 库的方法如下,不需要修改 build.gradle:

  • 把 so 库直接放到 app\src\main\jniLibs\armeabi-v7a 目录下面,如果没有目录就创建。

类似如下:

project/
├──libs/
|  └── *.jar       <-- if your library has jar files, they go here
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/ 
           ├── arm64-v8a/                       <-- ARM 64bit
           │   └── yourlib.so
           ├── armeabi-v7a/                     <-- ARM 32bit
           │   └── yourlib.so
           └── x86/                             <-- Intel 32bit
               └── yourlib.so
  • 重新编译后,验证的方法是把 app\build\outputs\apk\debug 下面的 apk 直接解压,确认 lib 文件夹里面是否有 so 库。

参考

https://stackoverflow.com/questions/24357687/how-to-include-so-library-in-android-studio
https://stackoverflow.com/questions/16683775/include-so-library-in-apk-in-android-studio?rq=1
https://blog.csdn.net/sinat_22657459/article/details/53420047

使用 android studio 编译 7.0.1 上面运行的 app 时,build.gradle 里面设置为 25:

android {
    compileSdk 25

    defaultConfig {

        targetSdk 25
    }
}

结果报错: resource android:attr/dialogCornerRadius not found

结果搜索,并多次尝试后,发现解决方法也很简单:

  1. file -> settings -> android sdk 安装 android 9.0
  2. file -> project structure -> modules -> properties -> compile sdk version 选择 28。

上面两步操作会再 build.gradle 里面增加 compileSdkVersion 28。 然后重新编译工程就可以了。

参考:

https://www.cnblogs.com/hupo376787/p/10285910.html
https://blog.csdn.net/ygz111111/article/details/104272161
https://blog.csdn.net/weixin_43465451/article/details/83185112

  1. 远程建立仓库
  2. vcs --> import into version control --> create git respository
  3. 选中整个工程(project 页面) vcs --> git -> add
  4. vcs --> git --> remote 配置远程仓库
  5. vcs --> update project --> merge --> ok
  6. vcs --> git --> commit
  7. 在项目目录下打开 git bash,输入 git pull origin master -–allow-unrelated-histories
  8. vcs --> git --> push

参考: https://www.jianshu.com/p/059ed1e01229 https://blog.csdn.net/qq_30389893/article/details/90600250