背景摘要

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐