Android基础教程

App运行日志
  • Android采用Log工具打印日志,它将各类日志划分为五个等级
    • Log.e:错误信息,比如可能导致程序崩溃的异常
    • Log.w:警告信息
    • Log.i:一般消息
    • Log.d:调试信息,可把程序运行时的变量值打印出来,方便跟踪调试
    • Log.v:冗余信息
Log.d("MainActivity","HelloWorld"); //添加一行日志信息
涉及语言
  • java:Java是Android开发的主要编程语言

  • Kotlin:Kotlin是谷歌官方力推的又一种编程语言,它与Java同样基于JVM(Java Virtual Machine,即Java虚拟机),且完全兼容Java语言

  • C/C++:Android的SDK开发包内部定义了许多JNI接口,包括图像读写在内的底层代码均由C/C++编写,再由外部通过封装好的Java方法调用

  • XML:可扩展标记语言,利用各种标签表达页面元素,以及各元素之间的层级关系及其排列组合。每个XML标签都是独立的控件对象,标签内部的属性以“android:”打头,表示这是标准的安卓属性,各属性分别代表控件的某种规格

    • <TextView
      android:id="@+id/tv_hello"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello World!" />
      
    • id:控件的编号

    • layout_width:控件的布局宽度,wrap_content表示刚好包住该控件的内容。

    • layout_height:控件的布局高度,wrap_content表示刚好包住该控件的内容。

    • text:控件的文本,也就是文本视图要显示什么文字

App的工程结构

App工程目录结构在这里插入图片描述

  1. app 模块
  • manifests子目录,下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件。

  • java子目录,下面有3个com.example.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。

  • res子目录,存放当前模块的资源文件。res下面又有4个子目录:

    • drawable目录存放图形描述文件与图片文件。

    • layout目录存放App页面的布局文件。

    • mipmap目录存放App的启动图标。

    • values目录存放一些常量定义文件,例如字符串常量strings.xml、像素常量dimens.xml、颜色常量colors.xml、样式风格定义styles.xml等。

  1. Gradle Scripts:主要是工程的编译配置文件
  • build.gradle,该文件分为项目级与模块级两种,用于描述App工程的编译规则。
  • proguard-rules.pro,该文件用于描述Java代码的混淆规则。
  • gradle.properties,该文件用于配置编译工程的命令行参数,一般无须改动。
  • settings.gradle,该文件配置了需要编译哪些模块。初始内容为include ‘:app’,表示只编译app模块。
  • local.properties,项目的本地配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等。s
简单控件
  • 文本显示、视图基础、常用布局、按钮触控、图像显示
文本显示
  1. 在XML设置
<Textview
    android:id="@+id/tv_hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"//设置文本内容
    android:textColor="#00ff00"//设置文本颜色
    android:textSize="30sp"/>//设置文本大小
  1. 在java中配置
Textview tv_hello = findViewById(R.id.tv_hello);//通过id获取tv_hello文本视图
tv_hello.setText("Hi World!");//设置tv_hellod的文本内容
tv_hello.setTextColor(0x00ff00);
tv_hello.setTextSize(30);//设置tv_hello文本的大小
  • 尺寸单位

    • px:px是手机屏幕的最小显示单位,它与设备的显示屏有关。一般来说,同样尺寸的屏幕(比如6英寸手机),如果看起来越清晰,则表示像素密度越高,以px计量的分辨率也越大
    • dp:也写作dip,指的是与设备无关的显示单位,它只与屏幕的尺寸有关。一般来说,同样尺寸的屏幕以dp计量的分辨率是相同的,比如同样是6英寸手机,无论它由哪个厂家生产,其分辨率换算成dp单位都是一个大小。
    • sp:sp的原理跟dp差不多,但它专门用来设置字体大小。手机在系统设置里可以调整字体的大小(小、标准、大、超大)。设置普通字体时,同数值dp和sp的文字看起来一样大;如果设置为大字体,用dp设置的文字没有变化,用sp设置的文字就变大了。
  • 文本内容

//使用@string的资源方式写字符串
//res/value/strings.xml
<resources>
	<string name="world">HelloWorld</string>
</resources>
//xml
	android:text="@string/world"
//java
	tv_hello.setText(R.string.world);
  • 文本颜色

    • xml更改文本颜色:XML文件无法引用Color类的颜色常量,为此Android制定了一套规范的编码标准,将色值交由透明度alpha和RGB三原色(红色red、绿色green、蓝色blue)联合定义。默认透明度FF(完全不透明)
    //方式一:直接写入
    		android:textColor="#ooffoo"
    //方式二:通过res/values/colors.xml
    <resources>
    	<color name="green">#00ff00</color
    </resources>
            android:textColor="@color/green"
    
    • java更改文本颜色
tv_hello.setTextColor(Color.GREEN);//通过COlor类
//Color类:	黑色(BLACK)、绿色(GREEN)、蓝色(BLUE)、黄色(YELLOW)、白色(WHITE)、红色(RED)、玫红(MAGENTA)、青色(CYAN)、灰色(GRAY)、深灰(DKGRAY)、浅灰(LTGRAY)、透明(TRANSPARENT)

tv_hello.setTextColor(0x00ff00);//默认透明度为0,看不到
tv_hello.setTextCOlor(0xff00ff00);
视图基础
  1. xml中设置视图宽高
android:layout_width="match_parent"
android:layout_height="wrap_content"
  • 三种取值方式
    • match_parent:与上级视图保持一致
    • wrap_content:与内容自适应
    • 以dp为单位的具体尺寸
  1. java中设置视图宽高(较复杂)
  • 步骤一:调用控件对象的getLayoutParams方法,获取该控件的布局参数,参数类型为ViewGroup.LayoutParams。
  • 步骤二:布局参数的width属性表示宽度,height属性表示高度,修改这两个属性值,即可调整控件的宽高。
  • 步骤三:调用控件对象的setLayoutParams方法,填入修改后的布局参数使之生效。
    • 注意:布局参数的width和height两个数值默认是px单位,需要将dp单位的数值转换为px单位的数值,然后才能赋值给width属性和height属性
// 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f); // 四舍五入取整
}
------------------------
// 获取名为tv_code的文本视图
TextView tv_code = findViewById(R.id.tv_code);
// 获取tv_code的布局参数(含宽度和高度)
ViewGroup.LayoutParams params = tv_code.getLayoutParams();
// 修改布局参数中的宽度数值,注意默认px单位,需要把dp数值转成px数值
params.width = Utils.dip2px(this, 300);
tv_code.setLayoutParams(params); // 设置tv_code的布局参数
  1. 设置视图间距
  • margin:设置当前视图与外部视图之间的距离(外边距)

  • padding:设置当前视图与内部视图之间的距离(内边距)

android:layout_margin="10dp" //一次性设置四周的外间距
android:layout_marginTop="5dp"//单独设置外上边距

android:layout_padding="5dp" //一次性设置四周的内边距
android:layout_paddingBottom="5dp"//单独设置内下边距
  1. 设置视图对齐方式
  • layout_gravity:当前视图往上级视图的对齐方式
  • gravity:下级视图相对于当前视图的对齐方式
android:layout_gravity="right|bottom"
android:gravity="center"
常用布局
  1. 线性布局LinearLayout
  • android:orientation:设置线性方向

    • horizontal:水平方向
    • vertical:垂直方向
  • 权重weight

    • 如果layout_width填0dp,则layout_weight表示水平方向的权重,下级视图会从左往右分割线性布局;
    • 如果layout_height填0dp,则layout_weight表示垂直方向的权重,下级视图会从上往下分割线性布局。
<LinearLayout
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:orientation="horizontal">
	<TextView
		android:layout_width="0dp"
		android:layout_height="wrap_content"
		android:layout_weight="1"  //宽度权重占1/3
		android:text="横排第一个"
		android:textSize="17sp"
		android:textColor="#000000" />
	<TextView
		android:layout_width="0dp"
		android:layout_height="wrap_content"
		android:layout_weight="2"  //宽度权重占2/3
		android:text="横排第二个"
		android:textSize="17sp"
		android:textColor="#000000" />
</LinearLayout>
  1. 相对布局RelativeLayout
  • 用于确定下级视图位置的参照物分两种,一种是与该视图自身平级的视图;另一种是该视图的上级视图(也就是它归属的RelativeLayout)。
相对指定视图取值说明相对上级视图取值说明
layout_toLeftOf左边layout_centerInParent中间
layout_toRightOf右边layout_centerHorizontal水平居中
layout_above上方layout_centerVertical垂直居中
layout_below下方layout_alignParentLeft左侧对齐
layout_alignLeft左侧对齐layout_alignParentRight右侧对齐
layout_alignRight右侧对齐layout_alignParentTop顶部对齐
layout_alignTop顶部对齐layout_alignParentBottom底部对齐
layout_alignBottom底部对齐
android:layout_centerInParent="true"  //中间
android:layout_centerHorizontal="true"//水平中间
android:layout_alignParentLeft="true"//与上级左边对齐
android:layout_alignParentTop="true"//与上级顶部对齐

android:layout_toLeftOf="@+id/tv_center" //相对左对齐
android:layout_alignTop="@+id/tv_center" //顶部平齐
  1. 网格布局GridLayout
<!-- 根布局为两行两列的网格布局,其中列数由columnCount指定,行数由rowCount指定 -->
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:columnCount="2"  //设置列数
	android:rowCount="2">	 //设置行数
<TextView ... /><TextView ... />
<TextView ... /><TextView ... />
</GridLayout>
  1. 滚动视图ScrollView
  • 垂直滚动视图:ScrollView,layout_width属性值设置为match_parent,layout_height属性值设置为wrap_content
  • 水平滚动视图:HorizontalScrollView,layout_width属性值设置为wrap_content,layout_height属性值设置为match_parent
    • 注意:滚动视图节点下面必须且只能挂着一个子布局节点,否则会在运行时报错Caused by:java.lang.IllegalStateException:ScrollView can host only one direct child
按钮触控
  1. 按钮触控Button
  • textAllCaps属性,默认为true,表示英文全部转为大写,如果设置为false则表示不转为大写。

  • onClick属性,当用户点击按钮时,就自动调用该方法

android:textAllCaps="false"  //按钮文本不转为大写
android:onClick="doClick"	//点击该按钮触发java代码中的doClick方法
  1. 点击事件和长按事件
  • 点击监听器,需要实现接口View.OnClickListener,并重写onClick方法补充点击事件的处理代码,再由按钮调用setOnClickListener方法设置监听器对象
// 从布局文件中获取名为btn_click_single的按钮控件
Button btn_click_single = findViewById(R.id.btn_click_single);
// 给btn_click_single设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_single.setOnClickListener(new MyOnClickListener());
-------------------
// 定义一个点击监听器,它实现了接口View.OnClickListener
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) { }// 点击事件的处理方法
}
// 从布局文件中获取名为btn_click_public的按钮控件
Button btn_click_public = findViewById(R.id.btn_click_public);
// 设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_public.setOnClickListener(this);
-------------------
@Override
public void onClick(View v) { // 点击事件的处理方法
if (v.getId() == R.id.btn_click_public) { }// 来自于按钮btn_click_public
}
  • 长按事件:当控件被按住超过500毫秒会触发,可调用按钮对象的setOnLongClickListener方法设置长按监听器要捕捉按钮的长按事件
// 从布局文件中获取名为btn_click_public的按钮控件
Button btn_longclick_public = findViewById(R.id.btn_longclick_public);
// 设置长按监听器,一旦用户长按按钮,就触发监听器的onLongClick方法
btn_longclick_public.setOnLongClickListener(this);
------------------
@Override
public boolean onLongClick(View v) { // 长按事件的处理方法
if (v.getId() == R.id.btn_longclick_public) { )// 来自于按钮btn_longclick_public
return true;
}
  • 值得注意的是,点击监听器和长按监听器不局限于按钮控件,其实它们都来源于视图基类View,凡是从View派生而来的各类控件,均可注册点击监听器和长按监听器。譬如文本视图TextView,其对象也能调用setOnClickListener方法与setOnLongClickListener方法,此时TextView控件就会响应点击动作和长按动作。因为按钮存在按下和松开两种背景,便于提示用户该控件允许点击,但文本视图默认没有按压背景,不方便判断是否被点击,所以一般不会让文本视图处理点击事件和长按事件。
  1. 禁用与恢复按钮
  • xml中,通过属性 android:enabled 设置,属性值为true时启用按钮,为false时禁用按钮
  • java中,通过 setEnabled 方法设置按钮的可用状态,true为启用,false为禁用
图像显示
  1. 图像视图ImageView
  • 由于图像通常保存为单独的图片文件,因此需要先把图片放到res/drawable目录,然后再去引用该图片的资源名称。比如现在有张苹果图片名为apple.png,那么XML文件通过属性android:src设置图片资源,属性值格式形如“@drawable/不含扩展名的图片名称”。
//xml
<ImageView
	android:id="@+id/iv_scale"
	android:layout_width="match_parent"
	android:layout_height="220dp"
	android:src="@drawable/apple"
    android:scaleType="fitCenter"/>//缩放属性
-----------
//java
ImageView iv_scale = findViewById(R.id.iv_scale);// 从布局文件中获取名为iv_scale的图像视图
iv_scale.setImageResource(R.drawable.apple); // 设置图像视图的图片资源
iv_scale.setScaleType(ImageView.ScaleType.FIT_CENTER);// 将缩放类型设置为“保持宽高比例,缩放图片使其位于视图中间”
  • 缩放类型的取值说明
XML中缩放类型ScaleType类中的缩放类型说明
fitCenterFIT_CENTER保持宽高比例,缩放图片使其位于视图中间
centerCropCENTER_CROP缩放图片使其充满视图(超出部分会被裁剪),并位于视图中间
centerInsideCENTER_INSIDE保持宽高比例,缩小图片使之位于视图中间(只缩小不放大)
centerCENTER保持图片原尺寸,并使其位于视图中间
fitXYFIT_XY缩放图片使其正好填满视图(图片可能被拉伸变形)
fitStartFIT_START保持宽高比例,缩放图片使其位于视图上方或左侧
fitEndFIT_END保持宽高比例,缩放视图使其位于视图下方或右侧
  1. 图像按钮ImageButton
  • 其并非继承Button,而是继承了imageView,所以凡是ImageView拥有的属性和方法,但它毕竟是个按钮呀,按钮家族常用的点击事件和长按事件其也有
  1. 同时展示文本和图像
  • 使用按钮Button即可实现文字周围放置图片
    • drawableTop:指定文字上方的图片。
    • drawableBottom:指定文字下方的图片。
    • drawableLeft:指定文字左边的图片。
    • drawableRight:指定文字右边的图片。
    • drawablePadding:指定图片与文字的间距。
<Button
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:drawableLeft="@drawable/ic_about"
	android:drawablePadding="5dp"
	android:text="图标在左"
	android:textSize="17sp" />
活动Activity
启停活动页面
  1. Activity的启动和结束
// 从当前页面跳到指定的新页面(ActFinishActivity)
//startActivity(new Intent(ActStartActivity.this,ActFinishActivity.class));
startActivity(new Intent(this, ActFinishActivity.class));
----------------------------
finish(); // 结束当前的活动页面
  1. Activity的生命周期
  • onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
  • onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
  • onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
  • onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交互。
  • onStop:停止活动。此时活动页面将不在屏幕上显示。
  • onDestroy:销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
  • onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建过程,而是走onRestart的重启过程。
  • onNewIntent:重用已有的活动实例。
    在这里插入图片描述
  1. Activity的启动模式
  • App两种方法设置活动页面的启动模式

    • 修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行。
    • 在代码中调用Intent对象的setFlags方法,表明后续打开的活动页面采用该启动标志。
  • 在xml中设置

<activity android:name=".JumpFirstActivity" android:launchMode="standard" />\\默认为standard(标准模式)
launchMode属性值说明
standard标准模式,无论何时启动哪个活动,都是重新创建该页面的实例,并放入栈顶。如果不指定launchMode属性,则默认为标准模式
singleTop启动新活动时,判断如果栈顶正好就是该活动的实例,则重用该实例;否则创建新的实例并放入栈顶,也就是按照standard模式处理
singleTask启动新活动时,判断如果栈中存在该活动的实例,则重用该实例,并清除位于该实例上面的所有实例;否则按照standard模式处理
singlelnstance启动新活动时,将该活动的实例放入一个新栈中,原栈的实例列表保持不变
  • 在Java中设置
//实现一:在两个活动之间交替跳转
// 创建一个意图对象,准备跳到指定的活动页面
Intent intent = new Intent(this, JumpSecondActivity.class);
// 当栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 设置启动标志
startActivity(intent); // 跳转到意图对象指定的活动页面
----------------------
//实现二:登录成功后不再返回登录页面
// 创建一个意图对象,准备跳到指定的活动页面
Intent intent = new Intent(this, LoginSuccessActivity.class);
// 设置启动标志:跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // 跳转到意图指定的活动页面
setFlags方法说明
Intent.FLAG_ACTIVITY_NEW_TASK开辟一个新的任务栈
Intent.FLAG_ACTIVITY_SINGLE_TOP当栈顶为待跳转的活动实例之时,则重用栈顶的实例
Intent.FLAG_ACTIVITY_CLEAR_TOP当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例
Intent.FLAG_ACTIVITY_NO_HISTORY栈中不保存新启动的活动实例
Intent.FLAG_ACTIVITY_CLEAR_TASK跳转到新页面时,栈中的原有实例都被清空
注意:该标志需要结合LAG_ACTIVITY_NEW_TASK使用,即setFlags方法的参数为“FLAG_ACTIVITY_CLEAR_TASK | LAG_ACTIVITY_NEW_TASK”
中级控件
图形定制
  1. 图形Drawable
  • Drawable 类型表达了各种各样的图形,包括图片、色块、画板、背景等。包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性的XML文件,而图片文件一般放在具体分辨率的drawable目录下
    • drawable-ldpi里面存放低分辨率的图片(如240×320),现在基本没有这样的智能手机了。
    • drawable-mdpi里面存放中等分辨率的图片(如320×480),这样的智能手机已经很少了。
    • drawable-hdpi里面存放高分辨率的图片(如480×800),一般对应4英寸~4.5英寸的手机(但不绝对,同尺寸的手机有可能分辨率不同,手机分辨率就高不就低,因为分辨率低了屏幕会有模糊的感觉)。
    • drawable-xhdpi里面存放加高分辨率的图片(如720×1280),一般对应5英寸~5.5英寸的手机。
    • drawable-xxhdpi里面存放超高分辨率的图片(如1080×1920),一般对应6英寸~6.5英寸的手机。
    • drawable-xxxhdpi里面存放超超高分辨率的图片(如1440×2560),一般对应7英寸以上的平板电脑。
  1. 形状图形
  • Shape图形又称形状图形,它用来描述常见的几何形状,包括矩形、圆角矩形、圆形、椭圆等等

  • 形状图形的定义文件是以shape标签为根节点的XML描述文件,它支持四种类型的形状

    • rectangle:矩形。默认值
    • oval:椭圆。此时corners节点会失效
    • line:直线。此时必须设置stroke节点,不然会报错
    • ring:圆环
  • 除了根节点shape标签,形状图形还拥有下列规格标签:

形状类型描述属性
size
(尺寸)
宽高尺寸height:像素类型,图形高度;
width:像素类型,图形宽度
stroke
(描边)
描边规格color:颜色类型,描边的颜色;
dashGap:像素类型,每段虚线之间的间隔;
dashWidth:像素类型,每段虚线的宽度,若dashGap和dashWidth有一个值为0,则描边为实线;
width:像素类型,描边的厚度
corners
(圆角)
圆角大小bottomLeftRadius:像素类型,左下圆角的半径;
bottomRightRadius:像素类型,右下圆角的半径。;
topLeftRadius:像素类型,左上圆角的半径;
topRightRadius:像素类型,右上圆角的半径;
radius:像素类型,4个圆角的半径(若有上面4个圆角半径的定义,则不需要radius定义)
solid
(填充)
填充色彩color:颜色类型,内部填充的颜色
padding
(间隔)
与周围边界的间隔top:像素类型,与上方的间隔;
bottom:像素类型,与下方的间隔;
left:像素类型,与左边的间隔;
right:像素类型,与右边的间隔
gradient
(渐变)
颜色渐变angle:整型,渐变的起始角度。为0时表示时钟的9点位置,值增大表示往逆时针方向旋转;
type:字符串类型,渐变类型;linear(线性渐变,默认值),radial( 放射渐变,起始颜色就是圆心颜色),sweep(滚动渐变,即一个线段以某个端点为圆心做360度旋转);
centerX:浮点型,圆心的X坐标。当android:type="linear"时不可用;
centerY:浮点型,圆心的Y坐标。当android:type="linear"时不可用;
gradientRadius:整型,渐变的半径。当android:type="radial"时需要设置该属性;
centerColor:颜色类型,渐变的中间颜色;
startColor:颜色类型,渐变的起始颜色;
endColor:颜色类型,渐变的终止颜色;
useLevel:布尔类型,设置为true为无渐变色、false为有渐变色。
  • 在实际开发中,形状图形主要使用3个节点:stroke(描边)、corners(圆角)和solid(填充)。至于shape根节点的属性一般不用设置(默认矩形即可)
生成一个XML描述文件:右击drawable目录,并依次选择右键菜单的New→Drawable resource file
//圆角矩形,内部填充色为土黄色,边缘线为灰色。
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 指定了形状内部的填充颜色 -->
	<solid android:color="#ffdd66" />
	<!-- 指定了形状轮廓的粗细与颜色 -->
	<stroke
		android:width="1dp"
		android:color="#aaaaaa" />
	<!-- 指定了形状四个圆角的半径 -->
	<corners android:radius="10dp" />
</shape>
------------------
//椭圆,内部填充色为玫红色,边缘线为灰色
<shape xmlns:android="http://schemas.android.com/apk/res/android"
	android:shape="oval" >
	<!-- 指定了形状内部的填充颜色 -->
	<solid android:color="#ff66aa" />
	<!-- 指定了形状轮廓的粗细与颜色 -->
	<stroke
		android:width="1dp"
		android:color="#aaaaaa" />
</shape>
创建一个测试页面,并在页面的XML文件中添加名为v_content的View标签,并视图背景设置
// 从布局文件中获取名为v_content的视图
View v_content = findViewById(R.id.v_content);
// v_content的背景设置为圆角矩形
v_content.setBackgroundResource(R.drawable.shape_rect_gold);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵逼树下的懵逼果

谢谢谢谢谢,好人一生平安

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值