安卓开发基础
Posted lmj957526796
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓开发基础相关的知识,希望对你有一定的参考价值。
项目结构
-
androidManifest.xml
:注册activity (新建时IDE自动注册) -
java后台代码
MainActivity.java
: 程序入口, 同级目录文件夹下存放其他activity- activity: 控制每个页面
- adaptor:控制向前端数据渲染
- view:控制UI界面元素
- bean:存放数据库中对应实体类
- utils:封装工具类,如用于判断从前端获取输入是否为空等
-
layout
- 包含activity ,控制界面元素及其格式
-
drawable
- 包含shape,背景形状控件
-
mipmap
- 包含图片
-
values
string.xml
需要使用的字符串值,便于统一修改color.xml
需要使用的颜色RGB值,便于直接使用dimension.xml
需要用到的尺寸,便于尺寸适配不同机型
-
gradle
-
build.gradle 配置相关依赖
-
gradle-wrapper.properties 配置gradle版本等信息
-
UI界面
参考博客:安卓UI界面开发经典四大布局,此处只记录(B站教学视频里)最常用的两种布局方式。
LinearLayout
整个Android布局中的控件摆放方式是以线性的方式摆放的,最常用。
排列方式:
- 纵向:
android:orientation="vertical"
- 横向:
android:orientation="horizontal"
系统默认采用横向布局
权重:
类似H5前端开发弹性布局中flex的数值,设置总权重时部分权重超过后的元素将被忽略。
线性布局中可以规定控件的权重,通过android:layout_weight=""
实现。下面我们来看一起权重的经典问题。我们先不设置总权重,设置子元素的宽度为0dp
。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:gravity="center_vertical" //对齐方式
android:orientation="horizontal" //布局方向
>
<!--横向布局-->
<ImageView
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:layout_weight="1"/>
<ImageView
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:layout_weight="2"/>
</LinearLayout>
显示效果如下:
RelativeLayout
通过相对布局,可以实现控件的重叠。当控件大量重叠时,用相对布局更加方便。
它在MarginLayout
的基础上,添加了对齐方法layout_alignBottom="@+id/iv"
。
下面是一些简单的属性:
属性 | 作用 |
---|---|
layout_marginRight | 控件与界面右侧距离 |
layout_toRightOf | 将该控件的右边缘与给定ID的控件左边缘对齐 |
layout_alignRight | 将该控件的右边缘与给定ID的右边缘对齐 |
layout_alignParentRight | 将该控件的右部与其父控件的右部对齐 |
layout_centerInParent | 将该控件的置于父控件的中央 |
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="horizontal"
android:weightSum="3">
<View
android:id="@+id/v1"
android:layout_width="300dp"
android:layout_height="200dp"
android:background="@color/colorPrimaryDark" />
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:layout_alignRight="@id/v1"
android:layout_alignBottom="@id/v1"
android:layout_marginRight="50dp"/>
</RelativeLayout>
效果图如下:
事件处理
方法1:通过ID绑定设置事件监听器实现:
在前端指定元素ID:
<Button
android:id="@+id/btn_login"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@string/register"
android:background="@drawable/login_btn">
</Button>
后台根据ID找到元素:
public class MainActivity extends AppCompatActivity {
private Button btnLogin; //声明变量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//根据ID找到元素
btnLogin = findViewById(R.id.btn_login);
//绑定点击事件
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*事件处理*/
}
});
}
}
方法2:实现前端onClick点击事件
前端:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="Login"/>
后台:
public void Login(View view) {
/*处理事件*/
}
SQLite数据库
参考教程:B站安卓零基础入门-第85讲
以单例模式创建工具类,需要注意SQLiteDatabase中主键必须是自增_id
public class DBHelper extends SQLiteOpenHelper {
private static SQLiteOpenHelper mInstance;
public static synchronized SQLiteOpenHelper getInstance(Context context){
if (mInstance == null){
//创建数据库
mInstance = new DBHelper(context, "droid.db", null, 1);
}
return mInstance;
}
private DBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库sql语句
String sql = "CREATE TABLE book(" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT," +
"type TEXT," +
"course TEXT" +
")";
//执行sql语句
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
操作数据库数据:
需要注意execSQL
函数的第二个参数顺序需要和待填写项对应
public class BookDB{
private static BookDB bookDB;
private SQLiteOpenHelper dbHelper;
public static synchronized BookDB getInstance(Context context){
if(bookDB == null){
bookDB = new BookDB(context);
}
return bookDB;
}
private BookDB(Context context){
dbHelper = DBHelper.getInstance(context);
}
//修改数据库
public void insert(Book book){
SQLiteDatabase db = dbHelper.getWritableDatabase();
if(db.isOpen()){
db.execSQL("INSERT INTO book (name, type, course) VALUES (? , ?, ?)",
new Object[]{book.getName(), book.getId(), book.getCourse()});
}
db.close();
}
//查询数据库
public List<Book> listBooks(){
SQLiteDatabase db = dbHelper.getReadableDatabase();
List<Book> list = new ArrayList<>();
if(db.isOpen()){
Cursor cursor = db.rawQuery("select * from book", null);
while(cursor.moveToNext()){
Book book = new Book();
book.setId(cursor.getInt(cursor.getColumnIndex("_id")));
book.setName(cursor.getString(cursor.getColumnIndex("name")));
book.setType(cursor.getString(cursor.getColumnIndex("type")));
book.setCourse(cursor.getString(cursor.getColumnIndex("course")));
list.add(book);
}
cursor.close();
}
db.close();
return list;
}
}
动态数据渲染
参考教程:B站订单APP项目实战-第6集
完成动态数据渲染需要以下准备:
adapter.java
bean.java
activity.java
activity_list.xml
item.xml
下面以显示从本地数据库查询到的多本书籍信息为例子,效果图如下:
1、编写book_item.xml
完成单项布局
2、编写activity_book_list.xml
,创建ListView
视图显示数据项
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp">
<com.example.myapplication.view.BookListView
android:id="@+id/book_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</ScrollView>
此处为了解决ListView
的高度适配问题,新建了视图类BookListView
重写了onMeasure
方法:
public class BookListView extends ListView {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE<<2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightSpec);
}
}
3、编写book.java
存放数据库对应实体类
4、编写BookAdaptor.java
,控制数据向book_item.xml
布局中渲染
public class BookAdapter extends BaseAdapter {
private Context context; //语境
private List<Book> data; //数据集
public BookAdapter(Context context){
data = new LinkedList<>();
this.context = context;
}
//getter and setter of data
public List<Book> getBookList() {
return data;
}
public void setBookList(List<Book> bookList) {
this.data.clear();
this.data.addAll(bookList);
notifyDataSetChanged();
}
//重写父类的各个方法
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return data.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null){
//加载数据单项layout: book_item.xml
convertView = LayoutInflater.from(context).inflate(R.layout.book_item, null);
//根据绑定界面元素
viewHolder = new ViewHolder();
viewHolder.bookName = convertView.findViewById(R.id.book_name);
viewHolder.bookType = convertView.findViewById(R.id.book_type);
viewHolder.course = convertView.findViewById(R.id.course);
viewHolder.editBtn = convertView.findViewById(R.id.edit_btn);
viewHolder.deleteBtn = convertView.findViewById(R.id.delete_btn);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
//向前端渲染数据
Book book = data.get(position);
viewHolder.bookName.setText(book.getName());
viewHolder.bookType.setText("类型:"+book.getType());
viewHolder.course.setText("课程:"+book.getCourse());
//绑定点击事件,实现页面传值(代码见相应小节)
return convertView;
}
//ViewHolder类,关联前端界面元素
class ViewHolder{
TextView bookName, bookType, course;
Button editBtn, deleteBtn;
}
}
5、在BookListActivity.java
中,绑定Adaptor
与前端ListView
public class BookListActivity extends BookDB {
private ListView listView;
private BookAdapter adapter;
private BookDB bookDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_list);
bookDB = bookDB.getInstance(this);
//初始化页面
initView();
}
private void initView() {
//获取数据
List<Book> list = bookDB.listBooks();
adapter = new BookAdapter(this);
adapter.setBookList(list);
//给前端 ListView 绑定 Adaptor
listView = findViewById(R.id.book_list);
listView.setAdapter(adapter);
}
}
页面传值
以上小节中点击书籍单项后跳转到详情为例,跳转时需要携带点击的书籍ID,用于在详情页查询相关信息。
跳转要求:携带实体类Book.java
作为参数,需要该类实现接口implements Serializable
1、传递参数
在BookAdaptor.java
的getView()
方法返回前绑定点击跳转事件,转递点击对象作为参数
//绑定点击事件
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, BookDetailActivity.class);
intent.putExtra("book", book); //传值
context.startActivity(intent); //跳转
}
});
2、接收参数
书籍详情页面BookEditActivity.java
接收参数,并初始化视图
public class BookEditActivity extends BaseActivity {
private Book book;
private EditText nameText;
private EditText typeText;
以上是关于安卓开发基础的主要内容,如果未能解决你的问题,请参考以下文章