背景摘要
我是daxia,一個做了8年多的後端開發,對前端一直僅限於Web頁面開發,對移動端開發和小程式開發基本零基礎;有時候想做一些有意思的東西出來,用網頁實現對手機支援現在是不理想,忙裡偷閒學了學安卓,把一些我覺得是重點內容做一個筆記,也希望筆記對其他人有所幫助。
一、開發步驟
先寫好介面->再寫Activity的邏輯,介面別管樣式,只關心你需要的互動元素就行。
佈局示例程式碼,一般用LinearLayout佈局,LinearLayout佈局有豎向佈局和橫向佈局,main.xml檔案裡一定要有android:orientation="vertical"
這行程式碼
<?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>
二、點選事件
- 引入監聽事件的包
- 需要xml裡面的button按鈕設定一個ID
- 在控制器 找到ID,設定一個監聽事件
- 然後實現
onClick
方法
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進行跳轉,具體看示例程式碼
//執行使用者登入
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頁面接收資料
@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 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 資料適配
新建一個介面卡
將頁面和資料進行渲染
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中呼叫
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發包的函式,程式碼如下所示
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 子執行緒呼叫
網路請求不能放到主執行緒裡執行,需要新建一個執行緒
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日