安卓开发阶段性学习总结
1. 各种布局
在安卓APP的开发中页面布局是学习的第一步,也是写一个页面的基础。故首先从页面布局开始。页面布局主要分为线性布局、约束布局、表格布局、帧布局、相对布局。下面我们就按照各类布局进行总结。
1.1 线性布局
1.1.1 线性布局的特点及其适用场景
线性布局是一种简单且灵活的布局方式。适用于需要按照顺序排列的视图场景。具体特点如下图。
特点 | 说明 |
---|---|
方向 | 线性布局支持两种方向(横向、水平),默认为横向。 |
对其方式 | 线性布局可以设置子视图在父视图中的对齐方式,如:顶部、底部、左侧和右侧对齐。 |
收缩 | 当线性布局中的空间不足时子视图可以收缩。 |
兄弟视图间距 | 可以设置子视图之间的间距,以控制视图之间的距离。 |
1.1.2 线性布局案例
线性布局代码片
。
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="124dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="#ADFF5F" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="fill_parent"
android:background="#DA90D6"
android:layout_weight="2"/>
</LinearLayout>
效果:
1.2 约束布局(弹性布局)
1.2.1 约束布局的特点及其适用场景
约束布局是一种可以根据屏幕尺寸、分辨率和其他因素自动调整布局的布局方式。主要的使用场景多为多场景移动应用软件,这样可以更好的适配多种设备。具体特点如下图。
特点 | 说明 |
---|---|
灵活性 | 可以根据不同的屏幕尺寸和分辨率自动调整布局,使应用在各种设备上都能有良好的显示效果。 |
适应性 | 适用于需要在不同设备上进行展示应用,如手机或平板电脑。 |
高效性 | 约束布局可以减少布局代码的复杂度,提高开发效率。 |
可维护性 | 通过约束布局,可以将布局和内容分离,使得布局的修改更加容易维护。 |
1.2.2 约束布局案例
约束布局代码片
。
<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"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左上"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:textAllCaps="false"
/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右上"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:textAllCaps="false"
/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="左下"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:textAllCaps="false"
/>
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右下"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:textAllCaps="false"
/>
</RelativeLayout>
效果:
1.3 帧布局
1.3.1 帧布局的特点及其适用场景
帧布局它允许在屏幕上放置一个或多个视图,每个视图都会被视为一个帧。这些帧会按照添加的顺序按照从上到下、从左到右的顺序绘制,但不考虑宽高比例。主要适用于简单的布局效果、有动画的效果和多级布局。但是不建议使用在复杂的布局。具体特点如下图。
特点 | 说明 |
---|---|
叠层 | 视图按照添加的顺序层叠显示,但不考虑宽高比。 |
对齐 | 对齐方式可以通过android:layout_alignItems和android:layout_alignSelf控制。 |
顺序 | 绘制顺序与添加顺序相同。 |
1.3.2 帧布局案例
帧布局代码片
。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:foreground="@drawable/logo"
android:foregroundGravity="right|bottom">
<TextView
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#FF6143" />
<TextView
android:layout_width="150dp"
android:layout_height="150dp"
android:background="#7BFE00" />
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#FFFF00" />
</FrameLayout>
效果:
1.4 相对布局
1.4.1 相对布局的特点及其适用场景
相对布局是一种每一个部件均以相对某个部件或边框的布局形式。主要适用于多设备配置、动态布局和页面较为复杂的情况下使用。尤其是在需要频繁修改布局的情况下,相对布局的代码结构更加清晰,便于维护。具体特点如下图。
特点 | 说明 |
---|---|
灵活性 | 允许根据控件之间的相对关系进行布局,可以根据需求灵活地调整控件的位置和大小。 |
自适应性 | 可以根据不同屏幕尺寸和设备方向进行自适应调整,确保在不同设备上都可以有相同效果的布局。 |
可读性 | 使用相对关系来描述控件的位置,代码可读性较高,易于理解和维护。 |
复杂布局 | 可以提供更大的灵活性和自由度,方便控制控件之间的相对位置关系。 |
动态布局 | 根据条件和数据动态地调整控件的位置和大小,适用于需要根据不同情况进行布局变化的场景。 |
图层效果 | 里边的控件可以重叠。 |
1.4.2 相对布局案例
相对布局代码片
。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAllCaps="false"
android:text="centerInParent" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textAllCaps="false"
android:text="alignParentRight" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:textAllCaps="false"
android:text="alignParentBottom" />
</RelativeLayout>
效果:
2.界面交互功能
2.1按钮点击事件
点击按钮后因为制作了监视器,故有弹出弹出提示点击按钮。
按钮事件xml代码片
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="按钮"
android:textSize="20dp" />
按钮点击事件java代码片
package cn.edu.baiyunu.midtermassignment;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button);
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"按钮被点击了",Toast.LENGTH_SHORT).show();
}
});
}
}
效果:
2.2列表项点击事件
因为制作了监视器,故可以看见点击列表后有弹窗弹出。
列表项事件xml代码片段
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_item"
android:layout_width="wrap_content"
android:layout_height="match_parent"
/>
</RelativeLayout>
列表项事件java代码片段
public class MainActivity extends AppCompatActivity {
private String[] data = {"G","D","B","Y","X","Y"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);
ListView listView = (ListView) findViewById(R.id.list_item);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText((Context) MainActivity.this, (String) listView.getItemAtPosition(i),Toast.LENGTH_LONG).show();
}
});
}
}
效果:
2.3滑动操作
滑动操作xml代码片
<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"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
</RelativeLayout>
滑动操作MainActivity.java代码片
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
List<String> dataList = new ArrayList<>();
for (int i = 0; i < 50; i++) {
dataList.add("Item " + i);
}
adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
}
}
滑动操作MyAdapter.java代码片
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> dataList;
public MyAdapter(List<String> dataList) {
this.dataList = dataList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(dataList.get(position));
}
@Override
public int getItemCount() {
return dataList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(android.R.id.text1);
}
}
}
效果:
2.4菜单项
菜单项xml代码片
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/save"
android:title="保存" />
<item
android:id="@+id/setting"
android:title="设置" />
<item
android:id="@+id/exit"
android:title="退出" />
</menu>
菜单项xml代码片
package cn.edu.baiyunu.midtermassignment;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.optionn,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
return true;
case R.id.setting:
Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show();
return true;
case R.id.exit:
finish();
return true;
default:
return super.onOptionsItemSelected(item); // 其他情况交给父类处理
}
}
}
效果:
2.5对话框
点击按钮,即可出现对话框。
对话框xml代码片
<?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"
tools:context=".MainActivity">
<Button
android:id="@+id/show_dialog_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示对话框"
android:layout_centerInParent="true"/>
</RelativeLayout>
对话框java代码片
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button showDialogButton = findViewById(R.id.show_dialog_button);
showDialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
}
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setMessage("这是一个简单的对话框示例")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户点击了确定按钮,你可以在这里添加处理逻辑
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户点击了取消按钮,你可以在这里添加处理逻辑
dialog.cancel();
}
})
.show();
}
}
效果:
3.学习中期总结
经过一段时间的学习和实践,我已经掌握了安卓应用开发的基础框架和方法。但是在深入学习应用的过程中,我发现自己在布局和组件的灵活应用方面仍有所欠缺。主要是无法制作出出具有高可玩性的应用时,
我需要进一步加深对布局和组件的理解,并通过不断的实践来锻炼自己的设计思维和技能。去熟练每一种布局和部件的作用,并且通过GitHub等开源仓库和平台仔细学习一两个项目,去体会制作安卓应用中的方式方法。