後端工程師入門安卓開發筆記(一)

湯青松發表於2022-06-30

背景摘要

我是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>

二、點選事件

  1. 引入監聽事件的包
  2. 需要xml裡面的button按鈕設定一個ID
  3. 在控制器 找到ID,設定一個監聽事件
  4. 然後實現 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日

相關文章