## 背景摘要
我是daxia,一个做了8年多的后端开发,对前端一直仅限于Web页面开发,对移动端开发和小程序开发基本零基础;
有时候想做一些有意思的东西出来,用网页实现对手机支持现在是不理想,忙里偷闲学了学安卓,把一些我觉得是重点内容做一个笔记,也希望笔记对其他人有所帮助。
## 一、开发步骤
先写好界面->再写Activity的逻辑,界面别管样式,只关心你需要的交互元素就行。
布局示例代码,一般用LinearLayout布局,LinearLayout布局有竖向布局和横向布局,main.xml文件里一定要有`android:orientation="vertical"`这行代码
```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity"
>
<EditText
android:id="@+id/login_input_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入你的用户名" />
</LinearLayout>
```
## 二、点击事件
1. 引入监听事件的包
2. 需要xml里面的button按钮设置一个ID
3. 在控制器 找到ID,设置一个监听事件
4. 然后实现 `onClick`方法
```java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button login_btn_submit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到对应元素
login_btn_submit = findViewById(R.id.login_btn_submit);
//设置监听事件
login_btn_submit.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.login_btn_submit) {
userLogin();
}
}
```
## 三、Activity 之间跳转和数据传递
### 3.1 跳转页面
先获取值内容,然后使用Intent进行跳转,具体看示例代码
```java
//执行用户登录
protected void userLogin() {
Intent intent = new Intent();
intent.putExtra("username", login_input_username.getText());
intent.putExtra("password", login_input_password.getText());
intent.setClass(MainActivity.this, UserList.class);
startActivity(intent);
}
```
### 3.2 接收数据
B页面接收数据
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
try {
Intent intent = getIntent();
userId = intent.getExtras().getString("user_id");
Log.i(getLocalClassName(), "22222____" + userId);
} catch (NullPointerException e) {
Toast.makeText(this, "user_id is null", Toast.LENGTH_LONG).show();
}
initView();
}
```
## 四、列表页面布局
### 4.1 新建子页面
新建一个xml,用于每一行的布局
```xml
<?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">
<TextView
android:id="@+id/user_item_name"
android:layout_width="150dp"
android:layout_height="50dp"
android:text="11" />
<TextView
android:id="@+id/user_item_age"
android:layout_width="150dp"
android:layout_height="50dp"
android:text="11" />
<ImageView
android:id="@+id/user_item_pic"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:src="@mipmap/touxiang" />
</LinearLayout>
```
### 4.2 准备数据
新建一个数据结构对象,确定数据格式
定义了三个变量,可以用编辑器的生成功能自动生成对应访问方法
```
package site.qingscan.qingting;
import java.io.Serializable;
public class Account implements Serializable {
private String name;
private int age;
private int pic;
}
```
### 4.3 数据适配
新建一个适配器
将页面和数据进行渲染
```java
package site.qingscan.qingting;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
public class UserListAdapter extends BaseAdapter {
private List<Account> userList;
private Context context;
public UserListAdapter(List<Account> userList,Context context) {
this.userList = userList;
this.context = context;
}
@Override
public int getCount() {
return userList.size();
}
@Override
public Object getItem(int i) {
return userList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
//找到页面
LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.user_list_item, null);
//找到对应元素
TextView user_item_name = (TextView) layout.findViewById(R.id.user_item_name);
TextView user_item_age = (TextView) layout.findViewById(R.id.user_item_age);
ImageView user_item_pic = layout.findViewById(R.id.user_item_pic);
//给元素赋值
user_item_name.setText(userList.get(i).getName());
user_item_age.setText(Integer.toString(userList.get(i).getAge()));
user_item_pic.setImageResource(userList.get(i).getPic());
//返回对象
return layout;
}
}
```
### 4.4 组合调用
在activity中调用
```java
private void initView() {
user_list = findViewById(R.id.userlist_list);
ArrayList<Account> users = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Account tempObj = new Account();
tempObj.setName("tqs" + Integer.toString(i));
tempObj.setAge(25 + i);
tempObj.setPic(R.mipmap.touxiang);
users.add(tempObj);
}
user_list.setAdapter(new UserListAdapter(users,this));
}
```
## 五、网络请求
### 5.1 POST请求
先定义一个HTTP发包的函数,代码如下所示
```java
public String httpLoginRequest(String username, String psd) {
String msg = ""; //服务器返回结果
try {
URL url = new URL(loginUrlZhuCe);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.connect();
//post请求传递参数
String data = "uname=" + username + "&psd=" + psd; //参数之间用&连接
//向服务器发送数据(输出流)
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(httpURLConnection.getOutputStream(), "UTF-8"));
writer.write(data);
writer.close();
//接受服务器反馈信息
int code = httpURLConnection.getResponseCode(); //获得服务器反馈信息
Log.d("login", "" + code);
if (code == HttpURLConnection.HTTP_OK) {
//接收服务器返回信息(输入流)
BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
String line = "";
//使用循环来获得数据,一次一行
while ((line = reader.readLine()) != null) {
msg += line;
}
Log.d("login", "msg:" + msg);
reader.close(); //关闭
}
} catch (IOException e) {
e.printStackTrace();
}
return msg;
} //end login
```
### 5.2 子线程调用
网络请求不能放到主线程里执行,需要新建一个线程
```java
protected void userLogin() {
new Thread(new Runnable() {
public void run() {
httpLoginRequest("dddd", "bbb");
}
}).start();
}
```
需要注意,访问网络需要加权限
在`AndroidManifest.xml`文件的`<manifest>`标签里加
```
<uses-permission android:name="android.permission.INTERNET" />
```
----
作者:汤青松
日期: 2022年06月28日