Android开发笔记 第五周作业
Android开发笔记 第五周作业
一、第一章节(基础界面)
1.学习内容:
View视图、界面编写方式、常用的布局、常用的资源
1.1 Android应用遵循MVC模式:Controller即Activity/Frament,View即用户界面元素,Model即自行编写代码
1.2 Activity通过布局管理添加各种View组件,调用Activity的setContentView方法可以将指定的视图对象呈现出来
1.3 ViewGroup布局以及注意事项
图
注意:View支持padding,但是不支持margin,viewGroup支持padding和margin
1.4 界面布局编写方式
- 推荐在XML文件中编写布局
- 也可在Java代码中编写布局,通过关键字new创建出View
注:具体创建的方法如下图:
-
1.4.1图
-
1.4.2布局之 LinearLayout
-
1.4.3例子(登录界面)
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:orientation="vertical"
android:padding="60dp">
<ImageView
android:layout_width="80dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:src="@drawable/image1" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:src="@drawable/login_user_name" />
<EditText
android:id="@+id/et_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="请输入用户名"
android:textSize="22dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="20dp"
android:src="@drawable/password" />
<EditText
android:id="@+id/et_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="请输入密码"
android:textSize="22dp" />
</LinearLayout>
<CheckBox
android:id="@+id/cb_auto_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:text="自动登录"
android:textSize="18sp" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="#f7a421"
android:text="登录"
android:textColor="#FFFFFF"
android:textSize="24sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:background="#fafafa"
android:text="立即注册"
android:textColor="#afafaf"
android:textSize="10dp" />
<Button
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:background="#fafafa"
android:text="找回密码?"
android:textColor="#afafaf"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
- 效果图
- 1.4.4 RelativeLayout 布局
- 练习(代码)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_pic"
android:src="@drawable/image1"
android:layout_centerInParent="true"
android:layout_width="64dp"
android:layout_height="64dp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左边"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/iv_pic"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上面"
android:layout_centerHorizontal="true"
android:layout_above="@+id/iv_pic"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右边"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/iv_pic"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下面"
android:layout_centerHorizontal="true"
android:layout_below="@+id/iv_pic"/>
</RelativeLayout>
-
1.4.5 TableLayout布局
-
练习(随机布局)
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="2">
<TableRow>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
android:text="按钮1"/>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:text="按钮2"/>
</TableRow>
<TableRow>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:text="按钮3"/>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="按钮4"/>
</TableRow>
<TableRow>
<Button
android:layout_weight="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:text="按钮5"/>
</TableRow>
</TableLayout>
- 1.4.6 FrameLayout布局
-
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@mipmap/ic_launcher"
android:foregroundGravity="left">
<Button
android:layout_width="300dp"
android:layout_height="450dp"
android:text="按钮1" />
<Button
android:layout_width="200dp"
android:layout_height="200dp"
android:text="按钮2" />
</FrameLayout>
- 效果图
-
1.4.7 单位和尺寸介绍
2.课外补充内容:
链接: l一文带你全面了解MVC、MVP、MVVM模式(含实例讲解).
链接: lAndroid:我们该如何做一名合格的代码开源者.
二、第二章节(基础控件)
2.1文本控件TextView
2.1.1 布局文件
<TextViewandroid:id="@+id/tv_show"
android:text="@string/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/green"
android:textSize="@dimen/title"
android:lines="1"
android:maxWidth="40dp"
android:ellipsize="middle"
android:focusable="true"
android:focusableInTouchMode="true"/>
2.1.2控件属性
android:id 控件唯一标识
android:text 显示的文本信息
android:layout_width 控件宽度
android:layout_height 控件高度
android:textSize 字体大小
android:textColor 字体颜色
android:lines 文本显示行数
android:maxWidth 最大显示宽度
android:ellipsize 设置当文本过长时如何显示文本内容
start:省略号显示在开头
middle:省略号显示在中间
end:省略号显示在结尾
marquee:以跑马灯方式显示
android:focusable 是否获得焦点
android:
focusableInTouchMode 触摸模式后是否可获得焦点
3.对象获取
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取文本对象
TextView tv_show = (TextView) findViewById(R.id.tv_show);
//获取android:text属性值
String text = tv_show.getText().toString();
//后台日志输出
Log.i("wl",text);
//设置android:text
tv_show.setText("Hello Man");
//通过getResources()获得资源常量 tv_show.setTextColor(getResources().getColor(R.color.colorPrimary));
//吐司 在app中输出
Toast.makeText(this,text,Toast.LENGTH_LONG).show();
}
2.2按钮控件Button
2.2.1布局文件
<Buttonandroid:id="@+id/btn_show"
android:text="按钮"
android:textSize="20sp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"/>
2.2.2注册监听
(1)匿名内部类
//获取按钮对象
Button btn_show = (Button) findViewById(R.id.btn_show);
//注册点击监听
btn_show.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Toast.makeText(MainActivity.this,"点击按钮",Toast.LENGTH_LONG).show();
}
});
(2)接口实现
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//声明控件对象 Button btn_show ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取按钮对象
btn_show = (Button) findViewById(R.id.btn_show);
//注册点击监听
btn_show.setOnClickListener(this);
}
//实现接口类 @Override
public void onClick(View v) {
Toast.makeText(this,"点击按钮",Toast.LENGTH_LONG).show();
}
}
(3)设置onclick属性
public void btnClick(View v){
Toast.makeText(this,"点击按钮",Toast.LENGTH_LONG).show();
}
2.2.3按钮背景图片设置及点击效果
(1)在res/drawable下创建btn_selector.xml,选择选中和没选中时的背景图片
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_bg2" android:state_pressed="false"/>
<item android:drawable="@drawable/btn_bg_p" android:state_pressed="true"/></selector>
(2)按钮布局文件中背景图片使用btn_selector.xml
<Buttonandroid:text="卸载"
android:layout_width="100dp"
android:layout_height="50dp"
android:background="@drawable/btn_selector"
android:textColor="#fff"
android:textSize="18sp"/>
2.3图片控件ImageView
2.3.1布局文件
<ImageViewandroid:src="@drawable/danger"
android:background="@drawable/danger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
2.3.2控件属性
android:src
设置ImageView中显示的图片
– 是前景,显示在前面
– 可根据宽高缩放,但是保持图片原有比例
android:background
设置ImageView控件的背景
– 是背景,显示在后面
– 可根据宽高缩放,但是不保持图片原有比例
– 除了图片以外,背景还可以是颜色
2.3.3图片资源
(1)注意命名中不得含有中文或大写字母
(2)首字母必须以字母开头
(3)格式png,jpg
2.4输入控件EditText
2.4.1布局文件
<EditTextandroid:hint="请输入"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
2.5 switch的使用
2.5.1 背景: switch_track.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/switch_selected_track" android:state_checked="true" />
<item android:drawable="@drawable/switch_unselected_track" />
</selector>
2.5.2滑块: switch_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 滑动块的宽高 -->
<size
android:width="20dp"
android:height="20dp" />
<solid android:color="#FFFFFF" />
<!-- 透明的描边-->
<stroke
android:width="3dp"
android:color="@android:color/transparent" />
</shape>
2.5.3选中背景:switch_selected_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="20dp" />
<corners android:radius="10dp" />
<solid android:color="#00C653" />
</shape>
2.5.4未选中背景: switch_unselected_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<size android:height="20dp"/>
<corners android:radius="10dp"/>
<solid android:color="#D9D9D9" />
</shape>
2.5.5使用方法
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:switchMinWidth="20dp"
android:thumb="@drawable/switch_thumb"
android:track="@drawable/switch_track" />
2.6ListView的使用
2.6.1 布局文件
- 总体布局
<ListView
android:id="@+id/lv_good"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 每一项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<ImageView
android:id="@+id/iv_pic"
android:layout_width="120dp"
android:layout_height="90dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="桌子"
android:textSize="20sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_price_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="价格:"
android:textSize="20sp"/>
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="100"
android:textColor="#ff8f03"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
2.6.2 适配器
package com.example.listviewdemo;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class GoodsAdapter extends BaseAdapter {
private Context context;
private List<Goods> datas;
public GoodsAdapter() {
}
public GoodsAdapter(Context context, List<Goods> datas) {
this.context = context;
this.datas = datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int i) {
return datas.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder = null;
if (view == null) {
view = View.inflate(context, R.layout.item_list, null);
holder = new ViewHolder();
holder.tvTitle = view.findViewById(R.id.tv_title);
holder.tvPrice = view.findViewById(R.id.tv_price);
holder.ivPic = view.findViewById(R.id.iv_pic);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
Goods goods = datas.get(i);
holder.tvTitle.setText(goods.getTitle());
holder.tvPrice.setText(goods.getPrice());
holder.ivPic.setBackgroundResource(goods.getIcon());
return view;
}
static class ViewHolder {
TextView tvTitle;
TextView tvPrice;
ImageView ivPic;
}
}
2.6.3 主文件的使用
package com.example.listviewdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.PipedReader;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private String[] titles = {"桌子", "苹果", "蛋糕", "毛衣", "猕猴桃", "围巾"};
private String[] prices = {"1800元", "10元/千克", "300元", "350元", "10元/kg", "280元"};
private int[] icons = {
R.drawable.table, R.drawable.apple, R.drawable.cake, R.drawable.wireclothes, R.drawable.kiwifruit, R.drawable.scarf
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
ListView lvGoods=findViewById(R.id.lv_good);
BaseAdapter adapter=new GoodsAdapter(this,goods);
lvGoods.setAdapter(adapter);
lvGoods.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Goods goods=(Goods) parent.getItemAtPosition(position);
Toast.makeText(MainActivity.this,goods.toString(),Toast.LENGTH_LONG).show();
}
});
}
private List<Goods> goods;
private void initData() {
goods=new ArrayList<>();
for (int i=0;i<titles.length;i++){
goods.add(new Goods(titles[i],prices[i],icons[i]));
}
}
}
2.6.4 补充类的创建
package com.example.listviewdemo;
import java.io.Serializable;
public class Goods implements Serializable {
private String title;
private String price;
private int icon;
public Goods() {
}
public Goods(String title, String price, int icon) {
this.title = title;
this.price = price;
this.icon = icon;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
@Override
public String toString() {
return "Goods{" +
"title='" + title + '\'' +
", price='" + price + '\'' +
", icon=" + icon +
'}';
}
}
- 效果图
三、第三章节(Activity)
3.1生命周期讲解
Activity的生命周期共七个指示器:onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。
-
3.1.1 onCreate() ,不可见状态
在Activity被创建时回调,第一个生命周期。我们一般在创建Activity时需要重写该方法做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。 -
3.1.2 onStart() ,可见状态
该方法回调表示Activity正在启动,此时Activity处于可见状态,只是还没有在前台显示,因此用户也无法交互。可以简单理解为Activity已显示却无法被用户看见。 -
3.1.3 onResume() ,可见状态
此方法回调时,Activity已在在屏幕上显示UI并允许用户操作了。从流程图可见,当Activity停止后(onPause、onStop方法被调用),重新回到前台时也会调用onResume方法。可以在onResume方法中初始化一些资源,比如打开相机或开启动画。 -
3.1.4 onPause() ,可见状态
此方法回调时,Activity正在停止(Paused形态),通常接下来 onStop() 会被回调 。但通过流程图可见,另一种情况是onPause() 执行后直接执行了onResume方法,这可能是用户点击Home键,让程序退回到主界面,程序在后台运行时又迅速地再回到到当前的Activity,此时onResume方法就会被回调。我们可以在onPause方法中做一些数据存储、动画停止、资源回收等操作。另外,onPause方法执行完成后,新Activity的onResume方法才会被执行。所以onPause不能太耗时,因为这可能会影响到新的Activity的显示。 -
3.1.5 onStop() ,不可见状态
此方法回调时,Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作,不能太耗时。 -
3.1.6 onRestart(),可见状态
此方法回调时,表示Activity正在重新启动,由不可见状态变为可见状态。这种情况,一般发生在用户打开了一个新的Activity时,之前的Activity就会被onStop,接着又回到之前Activity页面时,之前的Activity的 onRestart方法就会被回调。 -
3.1.7 onDestroy() ,不可见状态
此方法回调时,表示Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。 -
如图所示
-
3.1.8 课外补充:启动模式
-
启动模式
standard 模式
每次start都会创建一个新的实例
singleTop 模式
栈顶复用模式,顾名思义,在这种模式下,如果有新的Activity已经存在任务栈的栈顶,那么此Activity就不会被重新创建新实例,而是复用已存在任务栈栈顶的Activity。
singleTask 模式
栈内复用模式,在这种模式下,如果任务栈已经有要启动的Activity,那么此Activity就不会被重新创建新实例,而是复用已经存在的Activity,并将这个Act之上的其他Activity移除。
singleInstance 模式
以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。如果singleInstance的Activity被复用了,会将原来的act直接移动到现在位置上,不像singleTask那样会移除其他实例。从singleInstance启动其他Act,回退时不会显示原来的singleInstance Act,会在回退顺序的最后一层显示(除开singleInstance本来就是初始界面的情况)。
3.2Intent介绍
3.2.1 intent
Intent分为两种类型:
(1) 显式Intent
知道要启动的组件确切名称,通过传入具体组件名称来启动组件。 通常启动自己应用中的组件都是通过显式Intent,因为要启动的 Activity 或服务的类名我们是知道的。
通常这样来使用:
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
(2)隐式Intent
在不确切的知道要打开哪个组件的情况下,通过指出action、data、category等信息,系统会寻找到匹配的组件。 例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
3.2.2 使用
ntent对象携带了 Android 系统用来确定要启动哪个组件的信息(例如,准确的组件名称或应当接收该 Intent 的组件类别),以及收件人组件为了正确执行操作而使用的信息(例如,要采取的操作以及要处理的数据)。Intent 中包含的主要信息如下:组件名称,要启动的组件名称。如需在应用中启动特定的组件,则应指定该组件的名称。如下所示,其中SecondActivity.class即为限定的组件名称,可用Intent构造函数或setComponent()、setClass()、setClassName()设置组件名称:
方法1:在构造函数中传入Component
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
方法2:设置Component
Intent intent = new Intent();
ComponentName componentName = new ComponentName(this, SecondActivity.class);
// 或者ComponentName componentName = new ComponentName(this, "com.example.myapplication.SecondActivity");
// 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.myapplication.SecondActivity");
intent.setComponent(componentName);
startActivity(intent);
方法3:设置Class
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
// 或者intent.setClassName(this, "com.example.myapplication.SecondActivity");
// 或者intent.setClassName(this.getPackageName(), "com.example.myapplication.SecondActivity");
startActivity(intent);
3.3Fragment
3.3.2 课外知识引用
Fragment和Activity的交互:
1、在Fragment中调用Activity中的方法:
Fragment可以通过getActivity()方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。例如:
View listView = getActivity().findViewById(R.id.list);
但是注意调用getActivity()时,fragment必须和activity关联(attached to an activity),否则将会返回一个null。
另外,当碎片中需要使用Context对象时,也可以使用getActivity()方法,因此获取到的活动本身就是一个Context对象。
在Activity中调用Fragment中的方法:(要用到接口回调)
activity也可以获得一个fragment的引用,从而调用fragment中的方法。获得fragment的引用要用FragmentManager,之后可以调用findFragmentById() 或者 findFragmentByTag()。例如:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
也可以通过接口回调的方式来进行fragment给activity传值
文章结束
包含课内和课外的知识点
本文地址:https://blog.csdn.net/weixin_49762671/article/details/109002653